title "Thread start" .486p .xlist include ks386.inc include callconv.inc .list _TEXT SEGMENT PARA PUBLIC 'CODE' ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING page , 132 subttl "Thread start" extrn _FStartThread@12:near ;++ ; ; DmpThreadStartup ; ; Provided as the substitute thread system routine for xapi threads so that we ; can send the appropriate notifications ; ;-- cPublicProc _DmpThreadStartup, 2 cPublicFpo 0,0 mov ecx, [esp+4] ; copy args mov eax, [esp+8] push eax ; make space for our data push eax push eax ; push the args again push ecx lea eax, [esp+8] push eax call _FStartThread@12 pop eax ; break if requested test eax, eax jz dts10 int 3 dts10: pop eax ; call the real start routine jmp eax ; no return stdENDP _DmpThreadStartup ;++ ; ; CallOnStack ; ; Calls the requested function on a different stack ; ; Parameters: ; [esp+4] - function to call ; [esp+8] - new stack base ; [esp+12] - pointer to argument block ; ;-- cPublicProc _CallOnStack, 3 push ebp ; build a frame link mov ebp, esp push esi push edi mov esi, [ebp+12] ; prepare to switch stacks xor eax, eax mov edi, [esi] mov [esi], eax ; prevent recursion test edi, edi ; switch stacks only if non-NULL jz cos10 mov esp, edi cos10: mov edx, [ebp+16] mov eax, [ebp+8] push edx call eax ; call the new function mov [esi], edi ; restore the usable stack pointer lea esp, [ebp-8] ; unwind pop edi pop esi pop ebp ret 12 stdENDP _CallOnStack _TEXT ends end