我正在研究Windows Internals。事实上,*nix 中没有类似的_exit
系统调用。
进程应该以 TerminateProcess
/NtTerminateProcess
结束。
ExitProcess
/RtlExitUserProcess
API 在自我终止之前做一些清理。
TerminateProcess
/NtTerminateProcess
与 GetCurrentProcess
/NtCurrentProcess
/(HANDLE)-1
一起工作。
但是当我用 GetCurrentProcessId
/gs:[0x40]
尝试时,它没有用。
#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
为什么 Windows 进程必须使用 GetCurrentProcess
自行终止并且不能使用 GetCurrentProcessId
工作?
TerminateProcess()
的文档清楚地表明它需要一个进程 handle,而 GetCurrentProcessID()
返回一个进程 ID。为什么您希望该 ID 有效?
您的一个评论似乎表明您认为进程 HANDLE 与进程 ID 相同。显然这不是真的,否则 GetCurrentProcess()
和 GetCurrentProcessID()
不会作为单独的 API 存在。
事实上,GetCurrentProcess()
实际上返回了0xffffffff
。
文档说:
返回值是当前进程的伪句柄。
好吧,就像另一个人说的,TerminateProcess
接受进程句柄,而不是进程id。
我应该从 OpenProcess(PROCESS_TERMINATE, false, GetCurrentProcessId())
.
对不起,错误的信息。