它是安全的/定义为假设一个Windows伪句柄的值?

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

为了完成必要的系统调用,我需要进程及其每个线程的句柄。 我正在使用getCurrentProcessgetCurrentThread函数都返回伪句柄。 进一步检查后,我发现所有线程的伪句柄共享相同的值。

在网上简单的search之后,我发现下面这篇文章报告了与我得到的进程和线程伪句柄相同的值: https : //weseetips.wordpress.com/2008/03/26/getcurrentthread-returns-pseudo -把手而不是最真实的手柄/

我的问题:安全和/或定义从一个线程调用getCurrentThread一次,并在所有其他线程中使用返回的伪句柄,让他们引用自己?

使用当前的实现,这按预期工作。 我只是想知道这个行为是否有保证。 换句话说,它可以在任何提供getCurrentThread函数的Windows平台上工作; 并会改变行为被认为是一个突破性的变化?


getCurrentThread函数的文档声明(强调我的):

伪句柄是被解释为当前线程句柄的特殊常量。 调用线程可以使用此句柄来指定自己,只要线程句柄是必需的。 […]

这让我相信这个特殊的伪句柄只是“当前线程”的别名,因此可以在所有线程中共享,让他们参考自己。 另一方面,文档也说,返回值可以被调用线程使用,因此我的困惑!

是的。 从同一页:

该函数不能被一个线程用来创建一个可以被其他线程用来引用第一个线程的句柄。 句柄总是被解释为引用正在使用它的线程。 一个线程可以创建一个“真正的”自己的句柄,可以由其他线程使用,或者由其他进程继承,通过在调用DuplicateHandle函数时将伪句柄指定为源句柄。

是的,这是安全的 – 这个伪处理是众所周知的值,并记录在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() 

因此可以在所有的线程中共享,让他们参考自己。

当然不是,它不能被“在所有线程之间共享” – 只有当前进程/线程可以用它来引用自己。

当内核模式API获得线程/进程句柄作为输入参数 – 他需要将句柄转换为对象指针( ETHREADEPROCESS )。 首先检查这个常量值 – 如果是的话 – 使用指向当前线程/进程对象的指针。 否则handle是进程句柄表中的索引