是safe/defined假设一个Windows伪句柄的值吗?
Is it safe/defined to assume the value of a Windows pseudo handle?
我正在为 Windows 编写一段 C++ 代码,它需要查询进程及其每个线程的计时。
为了进行必要的系统调用,我需要进程及其每个线程的句柄。我正在使用 getCurrentProcess
和 getCurrentThread
函数,它们都是 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 句柄作为输入参数时 - 他需要将句柄转换为对象指针(ETHREAD
或 EPROCESS
)。首先检查此常量值 - 如果是 - 使用指向当前 thread/process 对象的指针。否则句柄是进程句柄中的索引 table
我正在为 Windows 编写一段 C++ 代码,它需要查询进程及其每个线程的计时。
为了进行必要的系统调用,我需要进程及其每个线程的句柄。我正在使用 getCurrentProcess
和 getCurrentThread
函数,它们都是 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 句柄作为输入参数时 - 他需要将句柄转换为对象指针(ETHREAD
或 EPROCESS
)。首先检查此常量值 - 如果是 - 使用指向当前 thread/process 对象的指针。否则句柄是进程句柄中的索引 table