<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tmuxrdr.git/src/platform/windows.rs, branch tmuxrdr</title>
<subtitle>herdr but with less disrespect for the tmux community
</subtitle>
<id>https://git.soarez.net/sz/tmuxrdr.git/atom?h=tmuxrdr</id>
<link rel='self' href='https://git.soarez.net/sz/tmuxrdr.git/atom?h=tmuxrdr'/>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/'/>
<updated>2026-09-28T11:16:10+00:00</updated>
<entry>
<title>fix(windows): read agent command lines without PROCESS_VM_READ (#4708)</title>
<updated>2026-09-28T11:16:10+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-28T11:16:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=8c8cb49c237eec2f82192dd831ec7308905f2c0a'/>
<id>urn:sha1:8c8cb49c237eec2f82192dd831ec7308905f2c0a</id>
<content type='text'>
* fix(windows): read agent command lines without PROCESS_VM_READ

Windows process command lines were read by opening each process with
PROCESS_VM_READ and walking its PEB. Hardened runtimes (Electron/Node) and
security products deny that access, so those processes resolved to a bare
`node.exe`/`bun.exe` name with no argv, argv0, or cmdline. A runtime-wrapped
agent launched from such a process was then indistinguishable from an
unrelated runtime process, and the pane stayed on the shell with
`agent_status: unknown`.

Prefer `NtQueryInformationProcess` with `ProcessCommandLineInformation`
(Windows 8.1+), which needs only `PROCESS_QUERY_LIMITED_INFORMATION`, and keep
the existing PEB read as a fallback for processes that do not expose a stored
command line. The fallback still requires `PROCESS_VM_READ`, so this only
widens coverage.

refs #4579

* fix(windows): handle growing command lines before failure test

The retry added for a command line that grows between the size probe and the
read was unreachable. NTSTATUS is signed, so STATUS_BUFFER_OVERFLOW,
STATUS_BUFFER_TOO_SMALL, and STATUS_INFO_LENGTH_MISMATCH are all negative and
were treated as failures by the earlier `status &lt; 0` check.

Check the growth statuses first and retry once with the reported size. Also read
the returned UNICODE_STRING header unaligned, since a Vec&lt;u8&gt; buffer only
guarantees byte alignment.

* test(windows): keep command-line marker test process alive

Passing the marker as a second argument to `ping` let `ping` exit as soon as it
saw one target, so the command-line query could race the process exit. Move the
marker into a `rem` after `&amp;` so it stays in cmd.exe's own command line and
`ping -n 11` keeps the process alive for the read.</content>
</entry>
<entry>
<title>fix: recognize Windows daemons in non-killing jobs (#4489)</title>
<updated>2026-09-22T16:55:34+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-22T16:55:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=621e6b73c4fe4c13562c0906699003d0ca59f0f1'/>
<id>urn:sha1:621e6b73c4fe4c13562c0906699003d0ca59f0f1</id>
<content type='text'>
refs #4309</content>
</entry>
<entry>
<title>fix(windows): prefer pwsh for the default pane shell (#4297)</title>
<updated>2026-09-17T15:45:07+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-17T15:45:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=101ccc20d3c6483a38ed9e0a1239b2ab908b1704'/>
<id>urn:sha1:101ccc20d3c6483a38ed9e0a1239b2ab908b1704</id>
<content type='text'>
* fix(windows): prefer pwsh for the default pane shell

Windows panes launched Windows PowerShell 5.1 (powershell.exe) whenever [terminal] default_shell was unset, ignoring PowerShell 7 even when pwsh.exe resolved on PATH. Resolve the unset default against PATH and prefer pwsh.exe, falling back to the inbox powershell.exe. An explicit default_shell still wins.

* fix(windows): validate pwsh before using it as the default shell

portable-pty resolves the configured shell with Path::exists and passes that path to CreateProcessW, which does not fall through to later PATH entries. Selecting an invalid pwsh.exe would therefore break new panes instead of falling back. Only prefer a pwsh.exe that starts with the PE MZ magic, and return its path so the validated binary is the one launched.

* fix(windows): validate the full PE header before preferring pwsh

Checking only the DOS MZ signature still accepted truncated images, DLLs, and foreign-architecture binaries. Because portable-pty passes the resolved path straight to CreateProcessW without trying later PATH entries, validate the PE signature, the COFF header (machine, executable-image bit, not a DLL, section count), and the optional header before preferring pwsh.exe.

* fix(windows): accept native ARM64 pwsh and validate the section table

Herdr ships an x64 Windows build that also runs on Windows ARM64 under x64 emulation, so cfg!(target_arch) cannot tell whether a native ARM64 pwsh.exe is launchable. Accept every executable machine type Windows supports instead of rejecting ARM64 on the x86_64 build. Also bound-check the section table (40 bytes per declared section) after the optional header so a truncated table falls back instead of being selected.

* fix(windows): detect the native host machine for pwsh compatibility

Machine compatibility was derived from cfg!(target_arch), which reports the emulated x64 process on Windows ARM64, and then briefly accepted ARM64 on every host. Read the native machine with IsWow64Process2 in the platform layer instead: ARM64 Windows accepts ARM64/x64/x86 images, x64 accepts x64/x86, and x86 accepts only x86.</content>
</entry>
<entry>
<title>fix(windows): preserve VT input during mouse refresh (#4257)</title>
<updated>2026-09-16T22:07:58+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-16T22:07:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=20c15dd7c8e516753a09e74d400b0637f5fd5682'/>
<id>urn:sha1:20c15dd7c8e516753a09e74d400b0637f5fd5682</id>
<content type='text'>
refs #4251</content>
</entry>
<entry>
<title>fix(windows): normalize pane launch cwd casing (#4199)</title>
<updated>2026-09-15T15:17:47+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-15T15:17:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=9db1eed391afbcb5574d060463e149f14acf40fa'/>
<id>urn:sha1:9db1eed391afbcb5574d060463e149f14acf40fa</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: protect integration configs from failed writes (#3973)</title>
<updated>2026-09-14T20:13:52+00:00</updated>
<author>
<name>akbash</name>
<email>akbash@herdr.dev</email>
</author>
<published>2026-09-14T20:13:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=5e38e5fb5fc2cc5d30844df71432a60742bcb572'/>
<id>urn:sha1:5e38e5fb5fc2cc5d30844df71432a60742bcb572</id>
<content type='text'>
* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

---------

Co-authored-by: akbash-bot &lt;300245827+akbash-bot@users.noreply.github.com&gt;
Co-authored-by: JJ Liebig &lt;jonathan.liebig@gmail.com&gt;</content>
</entry>
<entry>
<title>fix: clean up idle ssh bridges and back off flapping connections (#4083)</title>
<updated>2026-09-14T00:55:53+00:00</updated>
<author>
<name>Can Celik</name>
<email>ogulcancelik@gmail.com</email>
</author>
<published>2026-09-14T00:55:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=c77af1892ff121736ecb103b32d504d6f1b31805'/>
<id>urn:sha1:c77af1892ff121736ecb103b32d504d6f1b31805</id>
<content type='text'>
* fix: clean up idle ssh bridges and back off flapping connections

* chore: keep ssh liveness smoke tooling local</content>
</entry>
<entry>
<title>fix: lint all targets on windows (#3963)</title>
<updated>2026-09-11T16:12:49+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-11T16:12:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=c7a7cc454ac116467ce48365e075eb8ce53e458c'/>
<id>urn:sha1:c7a7cc454ac116467ce48365e075eb8ce53e458c</id>
<content type='text'>
Native Windows lint and check only clippy-checked the herdr binary, while macOS and Linux run clippy across all targets. Enable --all-targets on Windows and gate the Unix-only test helpers that this exposed so Windows check matches the Unix one.</content>
</entry>
<entry>
<title>fix: support preinstalled windows remote hosts (#3661)</title>
<updated>2026-09-08T21:08:42+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-08T21:08:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=8996fc54fe4596368a1677821b1a390a70c56ab0'/>
<id>urn:sha1:8996fc54fe4596368a1677821b1a390a70c56ab0</id>
<content type='text'>
* fix: support windows hosts in saved ssh machines

refs #3651

* fix: keep windows ssh bridge writes blocking

refs #3651

* fix: close saved windows ssh bootstrap input

refs #3651

* refactor: simplify remote bridge helpers

refs #3651

* refactor: isolate remote bridge platform behavior

refs #3651

* fix: close captured ssh input under windows consoles

refs #3651

* test: remove redundant remote command assertions

refs #3651

refs #3701

* test: handle framed ssh commands in machine setup

refs #3651

---------

Co-authored-by: Ogulcan Celik &lt;ogulcancelik@gmail.com&gt;</content>
</entry>
<entry>
<title>fix: reduce idle ssh cpu without dropping final output (#3728)</title>
<updated>2026-09-07T21:35:48+00:00</updated>
<author>
<name>Can Celik</name>
<email>ogulcancelik@gmail.com</email>
</author>
<published>2026-09-07T21:35:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=62431dbd033bf1be2fe87fbc526df28084214e49'/>
<id>urn:sha1:62431dbd033bf1be2fe87fbc526df28084214e49</id>
<content type='text'>
* fix: stop polling idle ssh uploads on unix

* fix: preserve ssh output during idle bridge cancellation

* test: exercise active ssh upload cancellation</content>
</entry>
</feed>
