WINDOWS核心編程之什麼是內核對象(三)

2004年7月7日   晚10:00

繼續

1.內核對象句柄的繼承性

當父進程創建內核對象時,必須向系統指明,它希望對象的句柄是個可繼承的句柄。父進程可以使用一個或多個內核對象句柄,並且該父進程可以決定生成一個子進程,爲子進程賦予對父進程的內核對象的訪問權。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

注意啦:雖然內枋對象句柄具有繼承性,但是內核對象本身不具有繼承性.

 

2.創建能繼承的句柄

父進程只要指定SECURITY_ATTRIBUTES 結構中的bInheritHandle爲真, 然後將該結構的地址傳遞給特定的Create函數(創建內核對象的函數)

 

在內核對象句柄表中的標誌,它就是用來指明該句柄是否具有繼承性的。如果bInheritHandle1,那麼標誌位就置爲1,否則爲0;

 

注意:對象句柄的繼承性只有在生成子進程的時候才能使用,如果父進程準備創建帶有可繼承句柄的新內核對象,那麼已經在運行的子進程將無法繼承這些新句柄。

 

3.如何生成子進程

CreateProcess(….)其中參數bInheritHandles設爲TRUE, 那麼子進程就可以繼承父進程的可繼承句柄值了。此時系統爲子進程創建一個新的和空的句柄表,因爲設定了bInheritHandleTRUE,那麼它要遍歷父進程的句柄表,對於它找到的包含有效的可繼承句柄的每個項目,系統會將該項目copy到子進程的句柄表。該項目copy到子進程的句柄表中的位置將與父進程的句柄平中的位置完全相同。也就是說父進程與子進程中,標識內核對象所使用的句柄值是相同的.另外,系統還要遞增內核對象的使用計數,

注意:CreateProcess函數返回後,父進程可以立即關閉對象的句柄,而不影響子進程對該對象進行操作的能力

 

4.改變句柄的狀態

當父進程創建了一個內核對象,然後又生成了兩個子進程,父進程只想讓一個子進程來繼承對象的句柄。若要改變內核對句柄的繼承標誌,可以調用SetHandleInformation函數

BOOL SetHandleInformation(HANDLE hObject, DWORD dwMask, DWORD dwFlags);

hObject參數標識一個有效的句柄, dwMask告訴該函數想要改變哪個或哪幾個標誌,可選擇的有HANDLE_FLAG_INHERIT   HANDLE_FLAG_PROTECT_FROM_CLOSE, dwFlags指明想將該標誌設置成什麼值

 

待續........

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章