微软线程,设置安全性和访问权限
Microsoft Threads, setting Security and Access Rights
我正在尝试制作一个基本的线程管理器。您可能已经看到了我之前提出的一个问题,其中我提出了一些糟糕的代码,并且我仍然在处理这些代码!但是我卡住了,因为我想能够调用函数GetExitCodeThread(HANDLE, LPDWORD),但我在实现这一点时遇到了麻烦。我遇到的第一个问题,我想我知道我需要做什么,但我不知道如何实现它。我最初调用CreateThread时将安全属性设置为NULL,从外观上看,我需要将其设置为THREAD_QUERY_INFORMATION,但是我不知道如何填充它想要的LPSECURITY_ATTRIBUTES结构。来自msdn的结构是:
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
但是我不知道如何用THREAD_QUERY_INFORMATION填充它,我也不知道我用什么填充结构的其他部分。
我想如果我设置创建线程的安全属性,我应该能够调用GetExitCodeThread,然后我的代码应该工作…有没有人有任何示例代码设置安全属性,同时创建一个线程,我可以查看和参考?对于更好地理解windows库有什么建议吗?
lpThreadAttributes
参数决定句柄是否可继承以及在线程对象上设置了哪些安全权限。不影响CreateThread
返回句柄的安全访问权限,始终为THREAD_ALL_ACCESS
。
同样,当新线程本身调用GetCurrentThread
时返回的句柄总是具有完全访问权限,除了旧的不支持的Windows版本。
如果你要使用OpenThread
来获得一个额外的句柄,或者如果一个外部进程试图使用OpenThread
来获得一个句柄,那就是线程安全权限将发挥作用的时候。
在Windows支持的版本中,线程对象的默认安全权限(几乎)总是合适的,因此lpThreadAttributes
或lpSecurityDescriptor
应该是NULL
。处理加密、身份验证或其他特别敏感任务的软件可能在极少数情况下使用非默认的线程安全权限。(我想不出这有什么有用的目的,但在一些奇怪的情况下,它可能是合适的。)
在旧版本的Windows上,如果调用CreateThread
的线程正在模拟另一个用户,则可能需要指定lpSecurityDescriptor
,尽管建议的做法是在调用CreateThread
之前停止模拟。
这些在CreateThread
的MSDN文档中都有详细说明。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- Lambda 函数,用于调用有权访问类成员的成员函数
- 使用QtCreator,如何在我有权访问ssh的远程服务器上构建我的项目?
- 默认赋值运算符有权访问基类的私有成员
- 访问接口的私有继承如何允许可访问对象访问访问私有访问实现
- 外部必须有权访问类构造函数
- 检查用户名是否有权访问窗口上的文件夹
- 获取从基类指针到具有不同类型的两个派生成员变量的访问权
- 好友有权访问好友的成员,但似乎无法更新好友的成员