Windows句柄的理解

在Windows中,內核對象的數據結構只能由操作系統訪問,應用程序不能在內存中定位這些數據結構並更改其內容。因爲這個限制,Windows提供了一組接口函數以恰當的方式來訪問這些內核對象的數據結構,句柄的概念由此產生。

當調用了一個會創建內核對象的函數後,函數會返回一個句柄,標識所創建的對象,這個句柄可供進程裏面的所有線程使用。在進程初始化的時候,系統會爲它分配一個句柄表,句柄表裏面的結構通常包含一個內核對象的指針、一個訪問掩碼和一些標誌,而句柄的用處就是在句柄表裏面找到對應的內核對象的數據結構。系統用索引的方式來表示內核對象的信息保存在進程句柄表中的具體位置,而這個索引值index=句柄值/4;所以一般都會發現句柄值是4的倍數。當獲得了索引值之後,就可以從句柄表裏面找到對應的指向內核對象的指針,Windows就是通過這樣會讓應用程序可以訪問到內核對象的。

當說到這裏的時候,很多關於句柄的疑問就可以解釋的通了。通常來說CreateProcess和OpenProcess來以相同的條件打開同個應用程序,所 獲得的句柄值是不一樣的,但是他們都是在訪問同一個內核對象,因爲索引得到的句柄表項裏面的內核對象的指針指向的對象是一樣的。因此在使用closehandle(handle)來釋放句柄的時候,其實是在句柄表裏面刪除相關索引項,該內核對象的引用計數-1。因此句柄的賦值拷貝並不影響內核對象的引用計數。

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