【发布时间】:2015-02-17 09:34:08
【问题描述】:
当我调用GetStdHandle()(或对我的进程执行某些操作的其他函数)时,例如:
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
GetStdHandle()会返回我进程的STDOUT句柄,但是这个函数怎么知道我的进程是什么,我的意思是我没有给它进程id作为参数。
【问题讨论】:
-
每个进程都有一个与之关联的PEB,基本上这个函数只是从PEB返回那个值。
-
STDIN句柄是调用进程的全局变量。该函数只是返回当前值。该值是在进程启动时建立的,除非您的代码调用
SetStdHandle()来覆盖它。 -
因为操作系统知道它当前正在运行什么进程,它会happily give you a handle to it if you ask。
-
@JoachimPileborg:您链接到的文档说:“返回值是当前进程的伪句柄。伪句柄是一个特殊的常量,目前
(HANDLE)-1”。所以它实际上并没有向调用进程返回一个真正的句柄。只是一个虚假的值,它向较低级别的 API 发出信号,以便在需要时解析实际的进程句柄。