gpt4 book ai didi

c++ - 假定 Windows 伪句柄的值是否安全/已定义?

转载 作者:可可西里 更新时间:2023-11-01 09:57:39 32 4
gpt4 key购买 nike

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

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

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

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

使用当前的实现,这按预期工作。我只是想知道这种行为是否得到保证。换句话说,它是否可以在任何提供 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. [...]

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

最佳答案

是的,这是安全的 - 这个伪句柄是众所周知的值并记录在 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.

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

当内核模式 api 将线程/进程句柄作为输入参数时 - 他需要将句柄转换为对象指针(ETHREADEPROCESS)。对于这个第一次检查这个常量值 - 如果是 - 使用指向当前线程/进程对象的指针。否则句柄是进程句柄表中的索引

关于c++ - 假定 Windows 伪句柄的值是否安全/已定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45631747/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com