Skip to content

Commit 206fd04

Browse files
dschojeremyd2019
authored andcommitted
Cygwin: Adjust CWD magic to accommodate for the latest Windows previews
Reportedly a very recent internal build of Windows 11 once again changed the current working directory logic a bit, and Cygwin's "magic" (or: "technologically sufficiently advanced") code needs to be adjusted accordingly. In particular, the following assembly code can be seen: ntdll!RtlpReferenceCurrentDirectory 598 00000001`800c6925 488d0db4cd0f00 lea rcx,[ntdll!FastPebLock (00000001`801c36e0)] 583 00000001`800c692c 4c897810 mov qword ptr [rax+10h],r15 588 00000001`800c6930 0f1140c8 movups xmmword ptr [rax-38h],xmm0 598 00000001`800c6934 e82774f4ff call ntdll!RtlEnterCriticalSection The change necessarily looks a bit different than 4840a56 (Cygwin: Adjust CWD magic to accommodate for the latest Windows previews, 2023-05-22): The needle `\x48\x8d\x0d` is already present, as the first version of the hack after Windows 8.1 was released. In that code, though, the `call` to `RtlEnterCriticalSection` followed the `lea` instruction immediately, but now there are two more instructions separating them. Note: In the long run, we may very well want to follow the insightful suggestion by a helpful Windows kernel engineer who pointed out that it may be less fragile to implement kind of a disassembler that has a better chance to adapt to the ever-changing code of `ntdll!RtlpReferenceCurrentDirectory` by skipping uninteresting instructions such as `mov %rsp,%rax`, `mov %rbx,0x20(%rax)`, `push %rsi` `sub $0x70,%rsp`, etc, and focuses on finding the `lea`, `call ntdll!RtlEnterCriticalSection` and `mov ..., rbx` instructions, much like it was prototyped out for ARM64 at https://gist.github.com/jeremyd2019/aa167df0a0ae422fa6ebaea5b60c80c9 Signed-off-by: Johannes Schindelin <[email protected]>
1 parent fceed92 commit 206fd04

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

winsup/cygwin/path.cc

+12
Original file line numberDiff line numberDiff line change
@@ -4880,6 +4880,18 @@ find_fast_cwd_pointer ()
48804880
%rcx for the subsequent RtlEnterCriticalSection call. */
48814881
lock = (const uint8_t *) memmem ((const char *) use_cwd, 80,
48824882
"\x48\x8d\x0d", 3);
4883+
if (lock)
4884+
{
4885+
/* A recent Windows 11 Preview calls `lea rel(rip),%rcx' then
4886+
a `mov` and a `movups` instruction, and only then
4887+
`callq RtlEnterCriticalSection'.
4888+
*/
4889+
if (memmem (lock + 7, 8, "\x4c\x89\x78\x10\x0f\x11\x40\xc8", 8))
4890+
{
4891+
call_rtl_offset = 15;
4892+
}
4893+
}
4894+
48834895
if (!lock)
48844896
{
48854897
/* Windows 8.1 Preview calls `lea rel(rip),%r12' then some unrelated

0 commit comments

Comments
 (0)