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

Mobidogs發表於2020-04-04
簡單地說:

核心物件是系統的一種資源。系統物件一旦產生,任何應用程式都可以開啟並且使用該物件。系統給核心物件一個計數值作為管理只用,核心物件包括:
 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
);

 

相關文章