I'm studying Windows Internals. In fact, there's no similar _exit system call like in *nix.
The process should terminate itself with TerminateProcess/NtTerminateProcess.
ExitProcess/RtlExitUserProcess API doing some cleanup before self-terminate.
TerminateProcess/NtTerminateProcess work with GetCurrentProcess/NtCurrentProcess/(HANDLE)-1.
But when I try it with GetCurrentProcessId/gs:[0x40] it didn't work.
#include <windows.h>
int main(void)
{
TerminateProcess(GetCurrentProcess(), 0); // work
TerminateProcess(GetCurrentProcessId(), 0); // didn't work
}
mov rcx, -1
xor edx, edx
call TerminateProcess
; this one is working
call GetCurrentProcessId
mov ecx, eax
xor edx, edx
call TerminateProcess
; this one didn't work
Why Windows processes must self terminate itself with GetCurrentProcess and can't work with GetCurrentProcessId ?
The documentation for
TerminateProcess()clearly says that it takes a process handle, whereasGetCurrentProcessID()returns a process ID instead. Why would you expect that ID to work?One comment of yours seems to suggest that you think a process HANDLE is the same as a process ID. Clearly that is not true, otherwise
GetCurrentProcess()andGetCurrentProcessID()would not exist as separate APIs.In fact,
GetCurrentProcess()actually returns0xffffffff.The docs say: