我正在尝试创建一个基本的线程管理器。你可能已经看到我之前的一个问题,我提出了一些不好的代码,我仍然在研究那些代码!但我被卡住了因为我想能够调用函数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库的任何建议吗?
答案 0 :(得分:1)
lpThreadAttributes
参数确定句柄是否可继承以及在线程对象上设置了哪些安全权限。它不会影响授予CreateThread
返回的句柄的安全访问权限,该句柄始终为THREAD_ALL_ACCESS
。
类似地,当新线程本身调用GetCurrentThread
时返回的句柄始终具有完全访问权限,但旧的不支持的Windows版本除外。
如果您稍后使用OpenThread
来获取额外的句柄,或者外部进程尝试使用OpenThread
来获取句柄,那么线程安全权限将会发挥作用
在受支持的Windows版本上,线程对象的默认安全权限(几乎?)始终合适,因此lpThreadAttributes
或lpSecurityDescriptor
应为NULL
。处理加密,身份验证或其他特别敏感任务的软件可能在极少数情况下使用非默认线程安全权限。 (我不能想到这会有用的任何有用的目的,但可能有一些奇怪的情况,它是适当的。)
在旧版本的Windows上,如果调用lpSecurityDescriptor
的线程模仿其他用户,则可能需要指定CreateThread
,尽管建议的做法是在调用CreateThread
之前停止模拟。 / p>
MSDN documentation for CreateThread
中详细介绍了这一点。