内核对象句柄特定于进程。 也就是说,进程必须创建对象或打开现有对象以获取内核对象句柄。 内核句柄上的每进程限制为 2^24。 但是,句柄存储在分页池中,因此可以创建的实际句柄数基于可用内存。 可以在 32 位Windows上创建的句柄数明显低于 2^24。
任何进程都可以为现有内核对象创建新句柄, (甚至由另一个进程) 创建的一个进程,前提是进程知道对象的名称并具有对该对象的安全访问权限。 内核对象句柄包括访问权限,这些权限指示可以向进程授予或拒绝的操作。 应用程序在创建对象或获取现有对象句柄时指定访问权限。 每种类型的内核对象都支持其自己的一组访问权限。 例如,事件句柄可以设置或等待访问 (或两者) ,文件句柄可以具有读取或写入访问 (或同时具有) 等。 有关详细信息,请参阅 安全对象 。
在下图中,应用程序创建事件对象。 CreateEvent 函数创建事件对象并返回对象句柄。
创建事件对象后,应用程序可以使用事件句柄来设置或等待事件。 在应用程序关闭句柄或终止之前,句柄保持有效。
大多数内核对象都支持单个对象的多个句柄。 例如,上图中的应用程序可以使用 OpenEvent 函数获取其他事件对象句柄,如下图所示。
此方法使应用程序能够具有具有不同访问权限的句柄。 例如,Handle 1 可能已设置和等待对事件的访问,而 Handle 2 可能只有等待访问权限。
如果另一个进程知道事件名称并有权访问该对象,则可以使用 OpenEvent 创建自己的事件对象句柄。 创建应用程序还可以使用 DuplicateHandle 函数将其中一个句柄复制到同一进程或另一个进程中。
只要至少有一个对象句柄存在,对象就保留在内存中。 在下图中,应用程序使用 CloseHandle 函数关闭其事件对象句柄。 如果没有事件句柄,系统将从内存中删除对象,如下图所示。
系统管理文件对象与其他内核对象略有不同。 文件对象包含文件指针 - 指向要读取或写入文件的下一个字节的指针。 每当应用程序创建新的文件句柄时,系统将创建新的文件对象。 因此,多个文件对象可以引用磁盘上的单个文件,如下图所示。
只有通过重复或继承,多个文件句柄才能引用同一文件对象,如下图所示。
下表列出了每个内核对象以及每个对象的创建者和销毁器函数。 创建者函数可以创建对象和对象句柄,或创建新的现有对象句柄。 驱逐舰函数关闭对象句柄。 当应用程序关闭内核对象的最后一个句柄时,系统会从内存中删除该对象。