内核对象

内核对象句柄特定于进程。 也就是说,进程必须创建 对象或打开现有对象以获取内核对象句柄。 内核句柄上的每个进程限制为 2^24。 但是,句柄存储在分页池中,因此可以创建的实际句柄数取决于可用内存。 可以在 32 位 Windows 上创建的句柄数明显低于 2^24。

任何进程都可以为现有内核对象创建新句柄 (甚至由另一个进程) 创建的一个新句柄,前提是该进程知道该对象的名称并对该对象具有安全访问权限。 内核对象句柄包括访问权限,这些权限指示可向进程授予或拒绝的操作。 应用程序在创建对象或获取现有对象句柄时指定访问权限。 每种类型的内核对象都支持其自己的一组访问权限。 例如,事件句柄可以设置或等待访问 (或同时) ,文件句柄可以具有读取或写入访问权限 (或两者) ,等等。 有关详细信息,请参阅 安全对象

在下图中,应用程序创建事件对象。 CreateEvent 函数创建事件对象并返回对象句柄。

创建事件对象的应用程序

创建事件对象后,应用程序可以使用事件句柄来设置或等待事件。 在应用程序关闭句柄或终止之前,句柄保持有效。

大多数内核对象支持单个对象的多个句柄。 例如,上图中的应用程序可以使用 OpenEvent 函数获取其他事件对象句柄,如下图所示。

创建具有多个句柄的事件对象的应用程序

此方法使应用程序具有具有不同访问权限的句柄。 例如,句柄 1 可能已设置和等待事件访问权限,句柄 2 可能仅具有等待访问权限。

如果另一个进程知道事件名称并对该对象具有安全访问权限,则可以使用 OpenEvent 创建自己的事件对象句柄。 创建应用程序还可以使用 DuplicateHandle 函数将其一个句柄复制到同一进程或另一个进程中。

只要至少有一个对象句柄存在,对象就保留在内存中。 在下图中,应用程序使用 CloseHandle 函数关闭其事件对象句柄。 如果没有事件句柄,系统会从内存中删除 对象,如下图所示。

应用程序关闭事件对象句柄以从内存中删除对象

系统管理文件对象的方式与其他内核对象略有不同。 文件对象包含文件指针 - 指向要读取或写入文件中的下一个字节的指针。 每当应用程序创建新的文件句柄时,系统都创建一个新的文件对象。 因此,多个文件对象可以引用磁盘上的单个文件,如下图所示。

引用磁盘上的文件的多个文件对象

只有通过复制或继承,多个文件句柄才能引用同一个文件对象,如下图所示。

两个文件句柄引用同一个文件对象

下表列出了每个内核对象,以及每个对象的创建者和销毁器函数。 创建器函数要么创建对象和对象句柄,要么创建新的现有对象句柄。 驱逐舰函数关闭对象句柄。 当应用程序关闭内核对象的最后一个句柄时,系统会从内存中删除该对象。

内核对象 Creator 函数 Destroyer 函数
访问令牌 CreateRestrictedTokenDuplicateTokenDuplicateTokenExOpenProcessTokenOpenThreadToken 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
管道 CreateNamedPipeCreatePipe CloseHandleDisconnectNamedPipe
进程 CreateProcessOpenProcessGetCurrentProcess CloseHandleTerminateProcess
Semaphore CreateSemaphoreCreateSemaphoreExOpenSemaphore CloseHandle
插座 socketaccept closesocket
线程 CreateThreadCreateRemoteThreadGetCurrentThread CloseHandleTerminateThread
Timer CreateWaitableTimerCreateWaitableTimerExOpenWaitableTimer CloseHandle
更新资源 BeginUpdateResource EndUpdateResource
窗口工作站 GetProcessWindowStation 应用程序无法删除此对象。

 

内核对象命名空间