WINDOWS核心程式設計 核心物件

2021-08-30 14:52:15 字數 2819 閱讀 1420

今天想把看的第三章的心得寫下來。

這章主要介紹了核心物件。在windows中,核心物件是由作業系統來管理,儘管使用者能夠建立它,但是在建立之後,使用者對該核心物件的操作都是委託給作業系統。

通常使用者建立和使用的物件分為:使用者物件(如 hicon createicon(prama))、gdi物件函式以及核心物件。像訪問令牌、事件物件、檔案物件、檔案映像物件、程序物件、訊號量等都屬於核心物件。在核心物件第一次被建立的是,系統會根據給定的引數初始化,其中有乙個引數:psecurity_attributes,是security_attributes的指標,security_attributes的結構如下:

typedef struct _secutirty_attributes

security_attributes;

並返回乙個該核心物件的控制代碼給建立函式所在的程序(首先要在該程序的控制代碼表中,找到一塊空白的位置,存放該核心物件所在的位址)。

以後如果自己程序的其他執行緒的函式建立該核心物件時,作業系統會將該核心物件的計數器加一,然後返回該核心物件的乙個控制代碼(對於中間可能出項的異常,就不在討論)。關閉核心物件,類似地,作業系統會先通過傳入的物件的控制代碼在程序的控制代碼表中驗證該物件確實有許可權訪問它。然後進行相反的操作,當該核心物件的計數器為0時,作業系統會自動銷毀它。

首先是使用物件控制代碼繼承。也就是說,對於父子程序間,可以在父程序中建立該核心物件的時候,設定它的binherithandle值為true。然後使用 createprocess建立子程序的時候,同樣需要設這個值為true。當然也可以在父程序中設定乙個變數的方法來實現。

如果想讓某個程序的子程序部分由繼承該核心物件,可以通過sethandleinformationg來設定,該核心物件是否能夠被繼承。

bool sethandleinformation(

handle hobject,

dword dwmask,

dword dwflags)/*

*@hobject:標誌乙個有效地控制代碼

*@dwmask:告訴函式我想修改那個或者哪些標誌,目前每個控制代碼都關聯了兩個標誌

*/#define handle_flag_inherit 0x00000001

//告訴控制代碼是否需要繼承

#define handle_flag_from_close 0x00000002

//告訴控制代碼是否允許關閉控制代碼

通過上面的方式,就可以讓核心物件可選擇性的被繼承。

第二種方式是為物件命名。事實上,大多數的核心物件都可以命名。例如:

handle hmutex= createmutex(null, false, text("test"));

//建立乙個叫做「test」的互斥量核心物件,並獲得它的控制代碼

handle hmutex1 = openmutex(null,false,text("test"));

//獲得乙個叫做「test」的互斥量物件

if(getlasterror()==error_file_not_found)else if(getlasterror()==error_invalid_handle)

//上面兩種情況下,hmutex1=null

//如果找到,且匹配,則會檢視openmutex的第乙個引數:dwdesirdaccess,看他想要的許可權是否是允許的

最後一種方式是複製物件的控制代碼。使用duplicatehandle函式:

bool duplicatehandle

(handle hsourceprocesshandle,

handle hsourcehandle,

handle htargetprocesshandle,

phandle htargethandle,

dword dwdesiredaccess,

bool binherithandle,

dword dwoptions

);//這個函式是獲得乙個程序的控制代碼表的一條記錄,然後copy到目標程序的程序控制代碼表中

考慮這樣乙個場景,假設程序s能夠訪問乙個物件,並希望程序t也能夠訪問,那麼就可以在s中呼叫duplicatiehandle函式:

//create a mutex object accessible by process s

handle hobjinprocesss = createmutex(null, false,null);

//get a handle to process t's kernel object

//dwprocessidt 就是t的程序識別符號,假設已經獲得

handle hprocesst = openprocess(process_all_access,flase, dwprocessidt);

handle hobjinprocesst;

//give t access to our hobjinprocesss

duplicatehandle(getcurrentprocess(),hobjinprocesss, hprocesst, &hobjinprocesst, 0, false,

duplicate_same_access);

//通過程序間通訊的方式,是t獲得這個控制代碼。

closehandle(hprocesst);

closehandle(hprocesss);

注意:程序s中永遠不要呼叫closehandle(hobjinprocesst);另外,這種方式存在潛在的失敗風險,如果程序s中的hobjinprocesst的控制代碼值已經被另外的核心物件佔據,那麼會強行將先前的核心物件關閉。

未完待續……

Windows核心程式設計 核心物件

每個核心物件只是核心分配的乙個記憶體塊,只能由核心訪問.該記憶體塊是一種資料結構,它的成員負責維護物件的各種資訊,由得物件型別相同,但大多數不同,比如程序物件有個程序id,乙個基本優先順序,乙個退出 檔案物件則有乙個位元組位移,乙個共享模式,乙個開啟模式 如果核心控制代碼傳遞給另外乙個程序,那麼這另...

Windows核心程式設計 核心物件

每個核心物件只是核心分配的乙個記憶體塊,只能由核心訪問.該記憶體塊是一種資料結構,它的成員負責維護物件的各種資訊,由得物件型別相同,但大多數不同,比如程序物件有個程序id,乙個基本優先順序,乙個退出 檔案物件則有乙個位元組位移,乙個共享模式,乙個開啟模式 如果核心控制代碼傳遞給另外乙個程序,那麼這另...

windows核心程式設計之核心物件

由於不是計算機科班出身,一直對於程序和執行緒沒有深入的了解,現開始看windows核心程式設計,將具體內容整理一下,以加深印象。1 核心物件,即作業系統維護的乙個資料結構,內部維護該物件的各種資料資訊,常見的核心物件有 用於建立程序的程序核心物件,用於建立執行緒的執行緒核心物件,建立檔案的檔案核心物...