0

我正在尝试制作一个基本的线程管理器。您可能已经看到了我之前提出的一些错误代码的问题之一,而我仍在处理该代码!但是我被卡住了,因为我希望能够调用函数 GetExitCodeThread(HANDLE, LPDWORD),但是我在实现这个时遇到了麻烦。我遇到的第一个问题我想我知道我需要做什么,但我不知道如何实现它。我最初是在安全属性设置为 NULL 的情况下调用 CreateThread,从外观上看,我需要将其设置为 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 库的任何建议?

4

1 回答 1

1

lpThreadAttributes参数确定句柄是否可继承以及在线程对象上设置了哪些安全权限。它不会影响授予返回的句柄的安全访问权限CreateThread,始终是THREAD_ALL_ACCESS.

同样,当新线程本身调用时返回的句柄GetCurrentThread始终具有完全访问权限,但不支持旧版本的 Windows 除外。

如果您OpenThread稍后要使用来获取额外的句柄,或者如果外部进程试图使用OpenThread来获取句柄,那么线程安全权限就会发挥作用。

在受支持的 Windows 版本上,线程对象的默认安全权限(几乎?)总是合适的,所以要么lpThreadAttributeslpSecurityDescriptor应该是NULL. 处理加密、身份验证或其他特别敏感任务的软件可能在极少数情况下使用非默认线程安全权限。(我想不出这有什么有用的目的,但可能有一些奇怪的情况是合适的。)

在旧版本的 Windows 上,可能需要指定lpSecurityDescriptor线程调用CreateThread是否正在模拟另一个用户,尽管推荐的做法是在调用之前停止模拟CreateThread

这在MSDN 文档中CreateThread有详细说明。

于 2013-01-10T01:12:32.967 回答