核心物件

核心物件控制碼是特定進程。 也就是說,進程必須建立 物件或開啟現有的 物件,才能取得核心物件控制碼。 核心控制碼上的每個進程限制為 2^24。 不過,控制碼會儲存在分頁集區中,因此您可以建立的實際控制碼數目是根據可用的記憶體。 您可以在 32 位 Windows 上建立的控制碼數目明顯低於 2^24。

任何進程都可以建立現有核心物件的新控制碼, (即使由另一個進程所建立) ,前提是進程知道物件的名稱,而且可以存取物件。 核心物件控制碼包含存取權限,指出可以授與或拒絕進程的動作。 應用程式會在建立物件或取得現有的物件控制碼時指定存取權限。 每種核心物件類型都支援自己的一組存取權限。 例如,事件控制碼可以設定或等候存取 (或兩者) ,檔案控制碼可以有讀取或寫入存取權 (或兩者) 等等。 如需詳細資訊,請參閱 安全性實體物件

在下圖中,應用程式會建立事件物件。 CreateEvent函式會建立事件物件,並傳回物件控制碼。

建立事件物件的應用程式

建立事件物件之後,應用程式可以使用事件控制碼來設定或等候事件。 此控制碼會維持有效狀態,直到應用程式關閉控制碼或終止為止。

大部分的核心物件都支援單一物件的多個控制碼。 例如,上圖中的應用程式可以使用 OpenEvent 函式來取得其他事件物件控制碼,如下圖所示。

建立具有多個控制碼的事件物件的應用程式

這個方法可讓應用程式具有不同存取權限的控制碼。 例如,Handle 1 可能已設定並等候事件存取權,而 Handle 2 可能只有等候存取權。

如果另一個進程知道事件名稱並具有物件的安全性存取權,則可以使用 OpenEvent建立自己的事件物件控制碼。 建立應用程式也可以使用 DuplicateHandle 函式,將其中一個控制碼複製到相同的進程或另一個進程。

只要至少有一個物件控制碼存在,物件就會保留在記憶體中。 在下圖中,應用程式會使用 CloseHandle 函式來關閉其事件物件控制碼。 當沒有任何事件控制碼時,系統會從記憶體中移除物件,如下圖所示。

應用程式關閉事件物件控制碼,以從記憶體中移除物件

系統管理檔案物件與其他核心物件有些不同。 檔案物件包含檔案指標 , 這是要讀取或寫入檔案中下一個位元組的指標。 每當應用程式建立新的檔案控制碼時,系統就會建立新的檔案物件。 因此,多個檔案物件可以參照磁片上的單一檔案,如下圖所示。

參考磁片上檔案的多個檔案物件

只有透過重複或繼承,才能有多個檔案控制碼參考相同的檔案物件,如下圖所示。

兩個檔案控制碼參考相同的檔案物件

下表列出每個核心物件,以及每個物件的建立者和終端子函式。 建立者函式會建立物件和物件控制碼,或建立新的現有物件控制碼。 終端子函式會關閉物件控制碼。 當應用程式關閉核心物件的最後一個控制碼時,系統會從記憶體中移除物件。

Kernel 物件 Creator 函式 終端子函式
存取權杖 CreateRestrictedTokenDuplicateToken、DuplicateTokenExOpenProcessTokenOpenThreadToken CloseHandle
變更通知 FindFirstChangeNotification FindCloseChangeNotification
通訊裝置 CreateFile CloseHandle
主控台輸入 CreateFile,含 CONIN$ CloseHandle
主控台畫面緩衝區 CreateFile,含 CONOUT$ CloseHandle
桌面 GetThreadDesktop 應用程式無法刪除此物件。
事件 CreateEventCreateEventExOpenEvent CloseHandle
事件記錄檔 OpenEventLogRegisterEventSourceOpenBackupEventLog CloseEventLog
檔案 CreateFile CloseHandleDeleteFile
檔案對應 CreateFileMappingOpenFileMapping CloseHandle
尋找檔案 FindFirstFile FindClose
堆積 HeapCreate HeapDestroy
I/O 完成埠 CreateIoCompletionPort CloseHandle
作業 CreateJobObject CloseHandle
Mailslot CreateMailslot CloseHandle
記憶體資源通知 CreateMemoryResourceNotification CloseHandle
模組 LoadLibraryGetModuleHandle FreeLibrary
Mutex CreateMutexCreateMutexExOpenMutex CloseHandle
Pipe CreateNamedPipeCreatePipe CloseHandleDisconnectNamedPipe
處理序 CreateProcessOpenProcessGetCurrentProcess CloseHandleTerminateProcess
Semaphore CreateSemaphoreCreateSemaphoreExOpenSemaphore CloseHandle
插座 通訊端接受 closesocket
Thread CreateThreadCreateRemoteThreadGetCurrentThread CloseHandleTerminateThread
計時器 CreateWaitableTimerCreateWaitableTimerExOpenWaitableTimer CloseHandle
更新資源 BeginUpdateResource EndUpdateResource
視窗月臺 GetProcessWindowStation 應用程式無法刪除此物件。

 

核心物件命名空間