windows核心程式設計--核心物件
核心物件是系統的一種資源。系統物件一旦產生,任何應用程式都可以開啟並且使用該物件。系統給核心物件一個計數值作為管理只用,核心物件包括:
event,mutex,semaphore,file,file-mapping,preocess,thread.
這些核心物件每次產生都會返回一個handle,作為標示,每使用一次,對應的計數值加1,呼叫CloseHandle可以結束核心物件的使用。
具體:
1. 核心物件:
1).符號物件
2).事件物件
3).檔案物件
4).檔案影像物件
5).I/O完成物件
6).作業物件
7).信箱物件
8).互斥物件
9).管道物件
10).程式物件
11).信標物件
12).執行緒物件
13).待計時器物件
等
2.核心物件只能由核心所擁有,而不是由程式擁有.(就是說程式沒有了,核心還可以被其他程式使用)
3.核心物件的資料結構有計數器,程式呼叫時,計數器增1,呼叫結束,計數器減1,核心物件計數器為零時,銷燬此核心物件.(系統來管理核心物件)
4.核心安全性,程式使用什麼許可權呼叫核心物件,由SECURITY_ATTRIBUTES結構的資料結構來指定.幾乎所有的呼叫核心物件的函式都含有SECURITY_ATTRIBUTES結構的指標引數.(可以由這個引數來判斷是不是核心物件哦)
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength; //結構體長度
LPVOID lpSecurityDescriptor; //安全性設定
BOOL bInheritHandle; //可繼承性
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
5.程式的核心物件的控制程式碼表,程式呼叫核心物件時,就會建立核心物件的控制程式碼表,就是核心物件在程式中的索引,索引值就是呼叫核心物件函式返回的控制程式碼.關閉所有的核心物件,使用CloseHandle();
6.跨越程式邊界共享核心物件
MICROSOFT把控制程式碼設計成程式控制程式碼,不設計成系統控制程式碼是為了實現控制程式碼的健壯性和安全性。
1)核心物件控制程式碼的繼承性。(為了實現核心的多個程式的共享)
作用:為了子程式實現對父程式建立的核心物件的訪問。
步驟:首先,父程式建立核心物件時,初始化SECURITY_ATTRIBUTES結構的物件,讓SECURITY_ATTRIBUTES結構體的成員變數bInheritHandle設定為TRUE。
然後,子程式建立後,生成自己的控制程式碼表,控制程式碼表遍歷父程式的控制程式碼表,找到有繼承性的控制程式碼,並複製一份到子程式的控制程式碼表中,子程式的核心物件和父程式的核心物件使用相同的記憶體塊指標,核心物件計數器在子程式中建立核心物件後增一,父程式呼叫CloseHandle()來關閉核心物件,確不影響子程式使用該核心物件。
2)改變控制程式碼的標誌
BOOL SetHandleInformation(
HANDLE hObject, // handle to object
DWORD dwMask, // flags to change
DWORD dwFlags // new values for flags
);
開啟核心的可繼承性標誌
SetHandleInformation(hobj,HANDLE_FLAG_INHERIT,HANDLE_FLAG_INHERIT);
關閉核心的可繼承性標誌
SetHandleInformation(hobj,HANDLE_FLAG_INHERIT,0);
若想讓核心物件不被關閉,設定HANDLE_FLAG_PROTECT_FROM_CLOSE。
獲得控制程式碼標誌的函式
BOOL GetHandleInformation(
HANDLE hObject, // handle to object
LPDWORD lpdwFlags // handle properties
);
3)命名物件
作用:讓程式中的核心物件可以共享,讓別的程式可以通過名稱空間,跨程式來訪問這個程式的核心物件。
建立物件和訪問物件使用函式
建立物件Create*:如果命名的核心物件已經存在並具備安全訪問許可權,則引數被忽略,程式的控制程式碼表複製一份核心物件的指標和標誌到程式的控制程式碼表,如果不存在,則馬上建立核心物件。
例子:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // SD
BOOL bInitialOwner, // initial owner
LPCTSTR lpName // 物件名字
);
開啟物件Open*:如果命名的核心物件已經存在並具備安全訪問許可權,程式的控制程式碼表複製一份核心物件的指標和標誌到程式的控制程式碼表,如果不存在,則返回NULL,使用GetLassError(),得到返回值2。
4)終端服務的名字空間
每個客戶程式會話都有自己的服務名字空間,一個會話無法訪問另一個會話的物件,儘管他們具備相同的物件名字。
服務程式的名字空間物件總放在全域性名字空間中。
5)複製物件控制程式碼
DuplicateHandle函式來對另一個程式物件的控制程式碼進行復制到呼叫此函式的程式控制程式碼表中,實現程式間共享核心物件。
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle, // handle to source process
HANDLE hSourceHandle, // handle to duplicate
HANDLE hTargetProcessHandle, // handle to target process
LPHANDLE lpTargetHandle, // duplicate handle
DWORD dwDesiredAccess, // requested access
BOOL bInheritHandle, // handle inheritance option
DWORD dwOptions // optional actions
);
相關文章
- windows核心程式設計--程式Windows程式設計
- windows核心程式設計--精華Windows程式設計
- Windows核心程式設計_HookWindows程式設計Hook
- windows核心程式設計--纖程Windows程式設計
- windows核心程式設計--DLL基本Windows程式設計
- Windows核心程式設計_磁碟加密Windows程式設計加密
- windows核心程式設計--windows程式的執行Windows程式設計
- windows核心程式設計--字符集Windows程式設計
- windows核心程式設計--DLL高階Windows程式設計
- 《Windows核心程式設計》筆記(一)Windows程式設計筆記
- windows核心程式設計--執行緒池Windows程式設計執行緒
- Windows核心程式設計(一)-環境搭建Windows程式設計
- 《Windows核心程式設計》---又是記憶體Windows程式設計記憶體
- windows核心程式設計--記憶體堆疊Windows程式設計記憶體
- windows核心程式設計讀後感(待續)Windows程式設計
- ~~核心程式設計(五):物件導向——多繼承~~程式設計物件繼承
- 核心動畫程式設計(一)動畫程式設計
- 核心動畫程式設計(二)動畫程式設計
- python核心程式設計Python程式設計
- C++核心程式設計C++程式設計
- windows核心程式設計--記憶體對映檔案Windows程式設計記憶體
- 讀《Linux核心程式設計》Linux程式設計
- windows核心程式設計---錯誤報告與應用程式恢復Windows程式設計
- Linux核心程式設計(阻塞程式)(轉)Linux程式設計
- Windows核心Windows
- 基於 GDI 物件的 Windows 核心漏洞利用物件Windows
- MR核心程式設計思想總結程式設計
- C++核心程式設計筆記C++程式設計筆記
- 核心程式設計培訓目錄程式設計
- 核心物件&控制程式碼物件
- Linux核心模組程式設計--阻塞程式(轉)Linux程式設計
- Windows核心程式管理器解析Windows
- 驅動篇——核心程式設計基礎程式設計
- 程式設計的一些抽象核心程式設計抽象
- Java 併發程式設計:核心理論Java程式設計
- Python核心程式設計——Chapter16Python程式設計APT
- Linux核心模組程式設計指南(轉)Linux程式設計
- Linux核心程式設計(結論)(轉)Linux程式設計