2013-01-09 59 views
0

我想做一個基本的線程管理器。您可能看到過我之前提過的一個問題,我提出了一些不好的代碼,而且我仍在編寫該代碼!但我卡住了,因爲我想能夠調用函數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

我想出瞭如何使這項工作,我其實並不需要security_attributes結構。不過,我仍然想要了解更多關於如何使用它的信息,而且我對msdn的網站描述感到困惑。所以澄清會很好! –

+1

請使用'_beginthreadex'而不是'CreateThread'。 – paddy

+0

爲什麼使用_beginthreadex代替CreateThread更好? –

回答

2

lpThreadAttributes參數確定句柄是否可繼承,以及線程對象上設置了哪些安全權限。它不會影響授予由CreateThread返回的句柄的安全訪問權限,該權限始終爲THREAD_ALL_ACCESS

同樣,當新線程本身調用GetCurrentThread時,返回的句柄始終具有完全訪問權限,但較早的Windows不支持的版本除外。

如果您稍後要使用OpenThread來獲取額外的句柄,或者如果外部進程試圖使用OpenThread來獲取句柄,即線程安全權限將發揮作用。

在受支持的Windows版本上,線程對象的默認安全權限總是合適的,因此lpThreadAttributeslpSecurityDescriptor應該是NULL。處理加密,身份驗證或其他特別敏感的任務的軟件在極少數情況下可能會使用非默認線程安全權限。 (我想不出任何有用的用途,但可能會出現一些適合的奇怪情況。)

在較舊版本的Windows上,如果調用CreateThread的線程正在冒充,則可能需要指定lpSecurityDescriptor另一個用戶,儘管推薦的做法是在致電CreateThread之前停止冒充。

這全部在MSDN documentation for CreateThread中詳述。