内核对象

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

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

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

应用程序创建事件对象

创建事件对象后,应用程序可以使用事件句柄来设置或等待事件。 该句柄一直有效,直到应用程序关闭句柄或终止。

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

应用程序创建包含多个句柄的事件对象

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

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

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

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

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

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

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

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

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

Kernel 对象 Creator 函数 Destroyer 函数
访问令牌 CreateRestrictedTokenDuplicateTokenDuplicateTokenExOpenProcessTokenOpenThreadToken CloseHandle
更改通知 FindFirstChangeNotification FindCloseChangeNotification
通信设备 CreateFile CloseHandle
控制台输入 使用 CONIN$ CreateFile CloseHandle
控制台屏幕缓冲区 使用 CONOUT$ CreateFile CloseHandle
桌面 GetThreadDesktop 应用程序无法删除此对象。
事件 CreateEventCreateEventExOpenEvent CloseHandle
事件日志 OpenEventLogRegisterEventSourceOpenBackupEventLog CloseEventLog
文件 CreateFile CloseHandleDeleteFile
文件映射 CreateFileMappingOpenFileMapping CloseHandle
查找文件 FindFirstFile FindClose
HeapCreate
I/O 完成端口 CreateIoCompletionPort CloseHandle
工作 CreateJobObject CloseHandle
Mailslot CreateMailslot CloseHandle
内存资源通知 CreateMemoryResourceNotification CloseHandle
模块 LoadLibraryGetModuleHandle FreeLibrary
Mutex CreateMutexCreateMutexExOpenMutex CloseHandle
CreateNamedPipeCreatePipe CloseHandleDisconnectNamedPipe
过程 CreateProcessOpenProcessGetCurrentProcess CloseHandleTerminateProcess
信号 CreateSemaphoreCreateSemaphoreExOpenSemaphore CloseHandle
插座 套接字接受 closesocket
线 CreateThreadCreateRemoteThreadGetCurrentThread CloseHandleTerminateThread
定时器 CreateWaitableTimerCreateWaitableTimerExOpenWaitableTimer CloseHandle
更新资源 BeginUpdateResource EndUpdateResource
窗口工作站 GetProcessWindowStation 应用程序无法删除此对象。

 

内核对象命名空间