天天看點

核心對象的安全描述符

當你需要建立、打開和操作各種核心對象的時候,系統要建立和操作若幹類型的核心對象,強如存取符号對象、事件對象、檔案對象、檔案映射對象、i/o完成端口對象、作業對象、信箱對象、互斥對象、管道對象、程序對象、信标對象、線程對象和等待計時器對象等等。這些對象都是通過調用函數來建立的。例如:createfilemapping函數可使系統能夠建立一個檔案映射對象。

       每個核心對象隻是核心配置設定的一個記憶體塊。 并且隻能由該核心通路。該記憶體塊是一種資料結構,它的尵負責維護該對象的各種資訊。有些資料成員(如安全描述符、使用計數器等)在所有的對象類型中都是相同的,但大多數資料成員屬于特定的對象類型。例如,程序對象有一個程序id、一本基本優先級和一個退出代碼,而檔案對象則擁有一個位元組位移、一個共享模式和一個打開模式。

        ms規定,核心對象隻能被核心通路,是以應該程式無法在記憶體中找到這些資料結構并直接改變他們的内容。其目的是為了確定核心對象結構保持狀态的一緻。這個限制也使得使用者可以在不破壞任何應用程式的情況下在這些結構中添、删除和修改資料成員。

        我們不能直接修改,但我們又要修改。于是對象句柄便出現了。 當建立一個核心對象的時候,會傳回一個它的句柄。這是一個不透明的值,你隻需要知道它能标志你建立的這個對象就行了。 而當需要修改核心對象時,隻需将這個句柄傳入ms為你提供的api,這個api自然知道你需要修改哪個對象。值得注意的是,這些句柄值是與程序密切相關的。也就是說,a程序自己建立的句柄隻能在他自己的程序中,以及它所有的線程中使用。如果其它程序試圖通路這個句柄,就會調用失敗。當然ms也提供了幾種程序間共享核心對象的方法。

        核心對象有一個引用計數,标志着你的核心對象被引用了多少次。 因為核心對象是核心所有,是以核心必須知道什麼時候外部不需要使用對象了。 引用計數就是這個目的。 核心對象在第一次建立的時候,計數為1,當另一個程序通路它的時候,便會加1。當有程序調用closehandle并傳入它的句柄時,它的引用計數就減1。當核心檢測到此引用計數為0的時候,便會找個合适的時機釋放掉這個對象。值得說明的是,就算沒有調用closehandle,當所有使用這個核心對象的程序退出時,核心也會釋放掉這個對象。是以,可以確定在沒有程序引用該對象的時候,系統中不保留任何核心對象。當然,如果不釋放,則會在程式運作過程中造成記憶體占用量大的可能。

        對于核心對象,我們除了關注其句柄外,還應該關注它的安全描述符,雖然這個安全描述符在普通的應用程式(如普通的小軟體,用戶端應用程式等)中不使用。但對于某些場合,如伺服器。或者是對使用者身份有要求的應用程式中卻要使用。 它标志着通路此應用程式的權限。

       在建立核心對象時,會傳入一個 psecurity_attributes 參數 如:

handle createfilemapping(

 handle hfile,

psecurity_attributes psa,

dword flprotect,

dword dwmaximumsizehigh,

dword dwmaximumsizelow,

pctstr pszname);

大多數應用程式傳遞給psa的是null,這樣對象管理組中的任何成員和對象建立者有着同樣的全部通路權限。

psecurity_attributes定義大概如下:

typedef struct _psecurity_attributes{

dword nlength

lpvoid lpsecuritydescriptor;//安全描述符。

bool binherithandle;

} psecurity_attributes;

而對于對象的安全描述,則隻有第二個成員lpsecuritydescriptor有用。 比如我們想要打開一個檔案映射,則可以像如下操作。

handle hmapping = openfilemapping(file_map_read,fase,"myfilemapping");

傳入file_map_read則表示着你需要打開此檔案,并在打開後讀取這個檔案。 此時核心就會進行安全檢查,看是否你有讀取該映射檔案的權限。而這個檢查則是由你先前建立此檔案映射時傳入的安全描述符而決定。

簡介:09年入行,喜歡遊戲和程式設計,對3d遊戲和引擎尤其感興趣。 

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載。轉載必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

轉載:http://www.cnblogs.com/geniusalex/archive/2010/06/25/1940489.html

繼續閱讀