微软线程,设置安全性和访问权限

Microsoft Threads, setting Security and Access Rights

本文关键字:访问 访问权 权限 安全性 线程 设置 微软      更新时间:2023-10-16

我正在尝试制作一个基本的线程管理器。您可能已经看到了我之前提出的一个问题,其中我提出了一些糟糕的代码,并且我仍然在处理这些代码!但是我卡住了,因为我想能够调用函数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支持的版本中,线程对象的默认安全权限(几乎)总是合适的,因此lpThreadAttributeslpSecurityDescriptor应该是NULL。处理加密、身份验证或其他特别敏感任务的软件可能在极少数情况下使用非默认的线程安全权限。(我想不出这有什么有用的目的,但在一些奇怪的情况下,它可能是合适的。)

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

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