2004年7月7日 晚10:00
繼續
1.內核對象句柄的繼承性
當父進程創建內核對象時,必須向系統指明,它希望對象的句柄是個可繼承的句柄。父進程可以使用一個或多個內核對象句柄,並且該父進程可以決定生成一個子進程,爲子進程賦予對父進程的內核對象的訪問權。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
注意啦:雖然內枋對象句柄具有繼承性,但是內核對象本身不具有繼承性.
2.創建能繼承的句柄
父進程只要指定SECURITY_ATTRIBUTES 結構中的bInheritHandle爲真, 然後將該結構的地址傳遞給特定的Create函數(創建內核對象的函數)
在內核對象句柄表中的標誌,它就是用來指明該句柄是否具有繼承性的。如果bInheritHandle爲1,那麼標誌位就置爲1,否則爲0;
注意:對象句柄的繼承性只有在生成子進程的時候才能使用,如果父進程準備創建帶有可繼承句柄的新內核對象,那麼已經在運行的子進程將無法繼承這些新句柄。
3.如何生成子進程
用CreateProcess(….)其中參數bInheritHandles設爲TRUE, 那麼子進程就可以繼承父進程的可繼承句柄值了。此時系統爲子進程創建一個新的和空的句柄表,因爲設定了bInheritHandle爲TRUE,那麼它要遍歷父進程的句柄表,對於它找到的包含有效的可繼承句柄的每個項目,系統會將該項目copy到子進程的句柄表。該項目copy到子進程的句柄表中的位置將與父進程的句柄平中的位置完全相同。也就是說父進程與子進程中,標識內核對象所使用的句柄值是相同的.另外,系統還要遞增內核對象的使用計數,
注意:CreateProcess函數返回後,父進程可以立即關閉對象的句柄,而不影響子進程對該對象進行操作的能力。
4.改變句柄的狀態
當父進程創建了一個內核對象,然後又生成了兩個子進程,父進程只想讓一個子進程來繼承對象的句柄。若要改變內核對句柄的繼承標誌,可以調用SetHandleInformation函數
BOOL SetHandleInformation(HANDLE hObject, DWORD dwMask, DWORD dwFlags);
hObject參數標識一個有效的句柄, dwMask告訴該函數想要改變哪個或哪幾個標誌,可選擇的有HANDLE_FLAG_INHERIT HANDLE_FLAG_PROTECT_FROM_CLOSE, dwFlags指明想將該標誌設置成什麼值
待續........