- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在为 Windows 编写一段 C++ 代码,需要查询进程及其每个单独线程的计时。
为了进行必要的系统调用,我需要进程及其每个线程的句柄。我正在使用 getCurrentProcess
和 getCurrentThread
函数,它们都返回一个伪句柄。经过进一步检查,我注意到所有线程的伪句柄共享相同的值。
在互联网上简单搜索后,我发现以下文章报告了与我得到的进程和线程伪句柄相同的值: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 将线程/进程句柄作为输入参数时 - 他需要将句柄转换为对象指针(ETHREAD
或 EPROCESS
)。对于这个第一次检查这个常量值 - 如果是 - 使用指向当前线程/进程对象的指针。否则句柄是进程句柄表中的索引
关于c++ - 假定 Windows 伪句柄的值是否安全/已定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45631747/
关于 Stylus 的一大优点是它允许您定义可用于自定义结果输出配置的变量。 例如, // my-html-object.styl $my-html-object-color = red $my-ht
我是 C++ 的新手,只有一个 C++ 的小头文件,里面有一个简单的结构。 PGNFinder.h: #ifndef PGNFINDER_H #define PGNFINDER_H struct Fi
我正在为 Windows 编写一段 C++ 代码,需要查询进程及其每个单独线程的计时。 为了进行必要的系统调用,我需要进程及其每个线程的句柄。我正在使用 getCurrentProcess 和 get
我正在尝试从数据库中检索数据,但将其限制为每个 View 的特定数量的项目。但相反,我得到了上述错误。我创建了以下函数来检索数据: //function to display jobs functio
我有一个用于我的 C++ 应用程序的 settings.ini 文件,但是我的一个用户 Windows\Temp 坏了,导致它对他来说一团糟。所以我打算将它移到他的用户文件夹中。所以我想在全局变量部分
This post says如果您的数据大于 2GB,您需要 64 位系统用于 MongoDB。 在我的本地机器上,运行 32 位 Mac OS X Leopard 的 64 位 Intel C2D,
Thymeleaf tutorial code 这个 SeedStarter 是如何实例化的?请参阅方法主体显示与对象 SeedStarter 的交互。那么它首先是如何实例化的? 由于这个项目是一个教
因此,在这个相当大的源文件中,我有以下部分,假设在函数 foo 中,从 main 调用: FILE *logfile = NULL if (log_engabled) { char fname
出于某种原因,我坚持使用 List 作为集合类型的模型类,我想在客户端使用该模型。然而,GWT 当然无法序列化 java.util.List。但是,此模型中 List 的所有实现都基于 ArrayLi
如何使用 JavaScript 解析此 CSV? 1363085391,42.890000000000,5.432200000000 1363088879,47.570000000000,4.9818
我正在使用名为 paypal_class 的 codeigniter 库。一切都很好,但是在验证 ipn 函数时我得到了这个错误。 使用未定义的常量主机 - 假定为“主机”,这一定是邮件未发送给用户的
这个问题已经有答案了: Forcing GCC to compile .cpp file as C (2 个回答) 已关闭 10 年前。 我有一个 C++ 项目 [IDE = codelite],它尝
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 6 年前。 我创建了一个 vector vector ,我想根据我定义的参
我是一名优秀的程序员,十分优秀!