@@ -282,6 +282,7 @@ DWORD NTAPI MmpUserThreadStart(LPVOID lpThreadParameter) {
282282 return Context.ThreadStartRoutine (Context.ThreadParameter );
283283}
284284
285+ #ifdef _WIN64
285286VOID NTAPI HookRtlUserThreadStart (
286287 _In_ PTHREAD_START_ROUTINE Function,
287288 _In_ PVOID Parameter) {
@@ -291,6 +292,36 @@ VOID NTAPI HookRtlUserThreadStart(
291292
292293 return MmpGlobalDataPtr->MmpTls ->Hooks .OriginRtlUserThreadStart (MmpUserThreadStart, &Context);
293294}
295+ #else
296+ VOID
297+ __declspec (naked)
298+ HookRtlUserThreadStart(
299+ _In_ PTHREAD_START_ROUTINE Function, // eax
300+ _In_ PVOID Parameter) { // ebx
301+ __asm {
302+ // THREAD_CONTEXT Context;
303+ sub esp, 8 ;
304+
305+ // Context.ThreadStartRoutine = PTHREAD_START_ROUTINE(Function);
306+ mov dword ptr ds : [esp] , eax;
307+
308+ // Context.ThreadParameter = Parameter;
309+ mov dword ptr ds : [esp + 4 ] , ebx;
310+
311+ mov eax, MmpUserThreadStart;
312+ mov ebx, esp;
313+
314+ // Shadow stack for ntdll!RtlUserThreadStart
315+ sub esp, 8 ;
316+
317+ // MmpGlobalDataPtr->MmpTls->Hooks.OriginRtlUserThreadStart(MmpUserThreadStart, &Context);
318+ mov ecx, MmpGlobalDataPtr;
319+ mov ecx, dword ptr ds : [ecx + 0x48 ] ;
320+ mov ecx, dword ptr ds : [ecx + 0x48 ] ;
321+ call ecx;
322+ }
323+ }
324+ #endif
294325
295326VOID NTAPI HookLdrShutdownThread (VOID) {
296327
0 commit comments