windows via c/c++ 三. 內核對象

1. 內核對象都只是一個內存塊,它由操作系統內核分配,並只能由操作系統內核訪問,這個內存塊是一個數據結構,其成員維護着與對象相關的信息。

2. 調用一個創建內核對象的函數後,函數會返回一個句柄,它標識所創建的對象。這些句柄是進程相關的,無法直接在另一個進程通過句柄值調用。

3. 內核對象在創建時,通常要指定其安全性,可以據此判定內核對象

4. 進程終止時,系統能保證一切都被正確清除。

5. 共享內核對象的必要性 p42

6. 允許進程共享內核對象三種機制: 使用對象父子進程句柄繼承,爲對象命名,複製句柄對象

    子進程複製父進程可繼承句柄,句柄值完全一樣(使用引用計數),所以進程關閉不能保證全部清理,只能保證清理引用計數爲0的

7. 13章將講到, 內核對象被保證在內核地址空間中-----系統上運行的所用進程都共享這一空間。 32位0x80000000 ~ 0xffffffff。 繼承只發生在創建子進程的時候。創建完了之後,再對父進程的某些句柄設置可繼承是沒有用的。

8. 2和7矛盾?既然所有句柄共享內存空間,那麼爲什麼不同進程間不能直接傳遞句柄值。父子進程可以?

9. 爲對象命名

無法保證命名唯一

使用命名的方式不一定需要句柄可繼承,且最大一個優勢爲“進程b不一定是進程a的子進程”

A進程 HANDLE hMutexProcessA = CreateMutex(null, FALSE, TEXT("Jeffmutex"));

B進程 HANDLE hMutexProcessB = CreateMutex(null, FALSE, TEXT("Jeffmutex"));

系統首先查看是否有一個‘JeffMutex’對象, 有,則檢查其類型,類型爲mutex,則進行安全檢查,若有訪問權限,則在進程B的句柄表中查找一個空白記錄項,並將其初始化爲指向現有的內核對象,若類型不匹配,或者拒絕訪問,則失敗(返回null)

10 終端服務命名空間 sid 單例 hard

11 句柄 地址 句柄值

12 複製句柄

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