僞句柄

對於句柄,大家都比較清楚和熟悉,可什麼是僞句柄呢?

 

      大家知道在系統中,對象分兩類:核心對象和用戶對象。如進程對象,線程對象,文件映射對象等就是核心對象;而向窗口,菜單等都是用戶對象。這兩者是有差別的,用於標示用戶對象的句柄是系統唯一的,也就是說,一個進程完全可以對另外一個進程中的用戶對象進行操作,比如兩個進程間通信的方法之一就是發送消息。正是由於窗口是用戶對象,所以句柄是系統唯一,通過FindWindow(),得到另外一個進程的窗口句柄,然後用SendMessage(),讓hWnd的窗口過程來處理消息,實現了進程間的通信。因此,對於用戶對象,可以直接
把句柄拿來用就行了。而核心對象則不一樣,核心對象需要考慮系統的穩定性,因此,核心對象句柄是進程相關的,在每一個進程中都有一個核心對象表,每一個對象的索引(不完全是)作爲內核對象的句柄,從而實現進程相關,這種句柄稱之爲“僞句柄”,即只能在本進程中使用,越過本進程就不能使用了。對核心對象進行操作時,系統還要進行安全檢驗,看一下你是否有權來操作這個對象。因此你不能同用戶對象一樣,直接把句柄拿過來用。比方說,你想操作另一個進程中的文件映射對象,這個文件映射對象句柄在那個進程中假設是0x000001,但在你的進程中,很有可能0x00000001時表示另一個核心對象,此時的操作就永遠不會成功,甚至會產生災難性的後果,此時,就有必要用DuplicateHandle()將進程相關的僞句柄轉化爲全局可用的實句柄。


      GetCurrentProcess()得到得到就是一個僞句柄,它只是一個標識,它返回的就是$FFFFFFFF,每個進程得句柄都是一樣的,只是適用於進程內部的使用。如果你想得到實際的句柄,在進程間進行通訊,必需要進行轉化,即調用DuplicateHandle函數,但注意,實句柄使用完成以後,你必須要調用CloseHandle去關閉。而僞句柄不用關閉,也不會造成內存泄漏。同樣,GetCurrentThread()也是如此。

發佈了15 篇原創文章 · 獲贊 15 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章