是safe/defined假设一个Windows伪句柄的值吗?

Is it safe/defined to assume the value of a Windows pseudo handle?

我正在为 Windows 编写一段 C++ 代码,它需要查询进程及其每个线程的计时。

为了进行必要的系统调用,我需要进程及其每个线程的句柄。我正在使用 getCurrentProcessgetCurrentThread 函数,它们都是 return 伪句柄。经过进一步检查,我注意到所有线程的伪句柄共享相同的值。

在互联网上简单搜索后,我发现以下文章报告了与我得到的进程和线程伪句柄相同的值:https://weseetips.wordpress.com/2008/03/26/getcurrentthread-returns-pseudo-handle-not-the-real-handle/

我的问题: 定义为从一个线程调用 getCurrentThread 一次并在其中使用 returned 伪句柄是否安全 and/or所有其他线程让他们引用自己?

使用当前的实现,这可以按预期工作。我只是想知道这种行为是否得到保证。换句话说,它是否可以在任何提供 getCurrentThread 功能的 Windows 平台上运行?改变行为会被视为重大改变吗?


documentation for the getCurrentThread function 状态(强调我的):

A pseudo handle is a special constant that is interpreted as the current thread handle. The calling thread can use this handle to specify itself whenever a thread handle is required. [...]

这让我相信这个特殊的伪句柄只是 "the current thread" 的别名,因此可以在所有线程之间共享,让它们引用自己。另一方面,文档还说调用线程可以使用 return 值,因此我很困惑!

是的。来自同一页面:

The function cannot be used by one thread to create a handle that can be used by other threads to refer to the first thread. The handle is always interpreted as referring to the thread that is using it. A thread can create a "real" handle to itself that can be used by other threads, or inherited by other processes, by specifying the pseudo handle as the source handle in a call to the DuplicateHandle function.

是的,这是安全的 - 这个伪句柄是众所周知的值并记录在 wdm.h(来自 windows wdk)

#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )  
#define ZwCurrentProcess() NtCurrentProcess()         
#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )   
#define ZwCurrentThread() NtCurrentThread()           
#define NtCurrentSession() ( (HANDLE)(LONG_PTR) -3 )  
#define ZwCurrentSession() NtCurrentSession()         

and can therefore be shared among all threads to let them refer to themselves.

当然不是,不可能是"shared among all threads"——只有现在的process/thread可以用来指代自己。

当内核模式 api 将 thread/process 句柄作为输入参数时 - 他需要将句柄转换为对象指针(ETHREADEPROCESS)。首先检查此常量值 - 如果是 - 使用指向当前 thread/process 对象的指针。否则句柄是进程句柄中的索引 table