使用 GetCurrentProcess() 句柄和 GetCurrentProcessId() 句柄终止进程

问题描述 投票:0回答:2

我正在研究Windows Internals。事实上,*nix 中没有类似的_exit系统调用。

进程应该以 TerminateProcess/NtTerminateProcess 结束。

ExitProcess/RtlExitUserProcess API 在自我终止之前做一些清理。


TerminateProcess/NtTerminateProcessGetCurrentProcess/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 工作?

c windows winapi undocumented-behavior nt-native-api
2个回答
2
投票

TerminateProcess() 的文档清楚地表明它需要一个进程 handle,而 GetCurrentProcessID() 返回一个进程 ID。为什么您希望该 ID 有效?

您的一个评论似乎表明您认为进程 HANDLE 与进程 ID 相同。显然这不是真的,否则 GetCurrentProcess() GetCurrentProcessID() 不会作为单独的 API 存在。

事实上,GetCurrentProcess()实际上返回了0xffffffff

文档说:

返回值是当前进程的伪句柄。


-1
投票

好吧,就像另一个人说的,TerminateProcess接受进程句柄,而不是进程id。

我应该从 OpenProcess(PROCESS_TERMINATE, false, GetCurrentProcessId()).

拿把手

对不起,错误的信息。

© www.soinside.com 2019 - 2024. All rights reserved.