物件管理器使用物件頭中儲存的資料來管理這些物件,而無需關注它們的型別,標準物件頭中的屬性
1.物件名稱:使乙個物件對於其他的程序也是可見的,便於共享
2.物件目錄:提供了乙個層次結構來儲存物件名稱
3.安全描述符:決定了誰可以使用該物件,以及允許它們如何使用它
4.配額花費:列出當乙個程序開啟乙個指向該物件的控制代碼時,針對該程序收取的資源花費額
5.已開啟的控制代碼計數:記錄了「開啟乙個控制代碼來指向該物件」的次數
6.物件型別:指向乙個型別物件,該物件包含了針對這種型別的物件都是公共的屬性
除了物件頭以外,每個物件也有乙個物件體,並且其格式和內容只有這種物件型別才有。
乙個執行體元件通過建立乙個物件型別,並且為它提供一些服務,就可以控制和維護所有這些型別的物件體中的資料。
物件管理器提供了少量的通用服務來操作物件頭中儲存的屬性,並且可以用在任何型別物件上,windows子系統允許其中一些服務可以直接被windows應用程式使用。這些通用操作有
1.關閉:關閉乙個指向某個物件的控制代碼
2.複製:通過先複製乙個控制代碼,再將其交給另乙個程序的方法來共享乙個物件
3.查詢物件:獲得關於乙個物件的標準屬性資訊
4.查詢安全性:獲取乙個物件的安全描述符
5.設定安全性:改變乙個物件上的保護設定
6.等待乙個物件:用乙個物件來同步乙個執行緒的執行
7.等待多個物件:用多個物件來同步乙個執行緒的執行
每個物件都有自己的建立、開啟、查詢服務(建立乙個程序和建立乙個檔案需要初始化的資料是不同的)
winobj的objecttypes中可以看到物件管理器中宣告的型別物件的列表
實驗:檢視物件頭和型別物件
1.使用!process 0 0顯示系統程序,例如我們選擇其中顯示的一項
*** nt active process dump ****
process 821b9830 sessionid: none cid: 0004 peb: 00000000 parentcid: 0000
dirbase: 00b18000 objecttable: e1000c98 handlecount: 257.
image: system
其中process就是程序核心物件的位址,system程序的程序核心物件位址為821b9830
2.使用!objcet命令顯示程序核心系統物件的資訊
lkd> !object 821b9830
object: 821b9830 type: (821b9e70) process
objectheader: 821b9818 (old version)
handlecount: 2 pointercount: 66
3.使用dt命令檢視物件頭和型別物件
lkd> dt _object_header 821b9818
nt!_object_header
+0x000 pointercount : 0n66
+0x004 handlecount : 0n2
+0x004 nexttofree : 0x00000002 void
+0x008 type : 0x821b9e70 _object_type
+0x00c nameinfooffset : 0 ''
+0x00d handleinfooffset : 0 ''
+0x00e quotainfooffset : 0 ''
+0x00f flags : 0x22 '"'
+0x010 objectcreateinfo : 0x8055b200 _object_create_information
+0x010 quotablockcharged : 0x8055b200 void
+0x014 securitydescriptor : 0xe10003b3 void
+0x018 body : _quad
物件頭的起始位址+0x18個位元組就是物件體的起始位址(0x821b9818+0x18=0x821b9830)
lkd> dt _object_type 821b9e70
nt!_object_type
+0x000 mutex : _eresource
+0x038 typelist : _list_entry [ 0x821b9ea8 - 0x821b9ea8 ]
+0x040 name : _unicode_string "process"
+0x048 defaultobject : (null)
+0x04c index : 5
+0x050 totalnumberofobjects : 0x1a
+0x054 totalnumberofhandles : 0x6d
+0x058 highwaternumberofobjects : 0x1b
+0x05c highwaternumberofhandles : 0x74
+0x060 typeinfo : _object_type_initializer
+0x0ac key : 0x636f7250
+0x0b0 objectlocks : [4] _eresource
上面的輸出顯示出:物件型別結構體包含了物件型別的名稱(name成員),記錄了這種型別活動物件的總數,以及這種型別的控制代碼和物件的尖峰數目。typeinfo成員儲存了乙個指標,該指標指向的資料結構儲存了對於該物件型別的所有物件都公共的屬性,以及一組指向該物件型別的方法的指標
在使用者模式下不能操作型別物件,然而它們定義的某些屬性可以通過特定的原生服務或者windows api例程是可見的
1.型別名稱:此種型別物件的名稱(process、event。。。)
2.池型別:指明了這種型別的物件是從換頁的還是非換頁的記憶體中分配
3.預設的配額花費:預設從程序配額中扣除的幻夜記憶體池值和非換頁記憶體池值
4.訪問型別:當乙個執行緒開啟某個指向該型別物件時可以請求的訪問型別(讀、寫、終止、掛起)
5.通用訪問許可權的對映關係:在四種通用的訪問許可權(讀、寫、執行、全部)和特屬於該型別的訪問許可權之間的對映關係
6.同步:指明了乙個執行緒是否可以等待這種型別的物件
7.方法:在乙個物件的生命期的特定點上,物件管理器自動呼叫的乙個或者多個例程
同步是乙個對於windows應用程式可見的屬性,指的是乙個執行緒通過等待某個物件從一種狀態改變成另一種狀態,從而達到同步其執行過程的能力。乙個執行緒可以對執行體的作業、程序、執行緒、檔案、事件、訊號量、互斥體和定時器物件進行同步。其他的執行體物件不支援同步。乙個物件是否有能力支援同步,取決於該物件是否包含了乙個內嵌的分發器物件,這也是一種核心物件。
物件方法,是由一組內部例程構成的,這些例程類似於c++的建構函式和析構函式,當乙個物件被建立或者銷毀時自動被呼叫。這些方法有
1.open:物件控制代碼被開啟的時候
2.close:物件控制代碼被關閉的時候
3.delete:物件管理器刪除乙個物件的時候
4.query name:乙個執行緒請求在乙個從屬名字空間中查詢乙個物件(比如乙個檔案物件)的名稱時
5.parse:物件管理器在乙個從屬名字空間中搜尋乙個物件名稱的時候
6.security:當乙個程序讀取或改變乙個物件(比如檔案物件)在其從屬名字空間中的保護屬性時
華為練習 物件管理器
實現物件管理器功能,其中管理的物件有 3個外部關鍵字,要求實現 增加物件 刪除物件 判斷物件是否存在 說明 物件的三個外部關鍵字分別以 key1,key2,key3表示。物件的 3個外部關鍵字 key1,key2,key3,其取值範圍都為 0 65535 物件總個數小於等於 10000 以上規格由用...
測試物件管理
1 uft中物件的概念 uft中的物件有兩個概念,乙個是測試物件,乙個是執行時物件 1 測試物件 test object,to 是uft定義的一些類,用它們代表被測應用的各種物件。2 執行時物件 runtime object,ro 是實際的被測應用物件,是測試執行過程中,to用來關聯的物件。2 uf...
物件管理資源
今天看了下effective c 的條款13 以物件管理資源,感覺十分有理,特此做一下筆記。假設我們使用乙個用來描述投資行為的程式庫,其中各式各樣的投資型別都繼承自乙個根類 investment 投資型別繼承體系中的root class class investment 這裡呢,我們進一步假設這個程...