内核对象
内核对象句柄特定于进程。 也就是说,进程必须创建 对象或打开现有对象以获取内核对象句柄。
内核句柄上的每个进程限制为 2^24。
但是,句柄存储在分页池中,因此可以创建的实际句柄数取决于可用内存。
可以在 32 位 Windows 上创建的句柄数明显低于 2^24。
任何进程都可以为现有内核对象创建新句柄 (甚至由另一个进程) 创建的一个新句柄,
前提是该进程知道该对象的名称并对该对象具有安全访问权限。
内核对象句柄包括访问权限,这些权限指示可向进程授予或拒绝的操作。
应用程序在创建对象或获取现有对象句柄时指定访问权限。
每种类型的内核对象都支持其自己的一组访问权限。
例如事件句柄可以设置或等待访问 (或同时) ,文件句柄可以具有读取或写入访问权限 (或两者) 。
创建事件对象后,应用程序可以使用事件句柄来设置或等待事件。
在应用程序关闭句柄或终止之前,句柄保持有效。
大多数内核对象支持单个对象的多个句柄。
例如应用程序可以使用 打开事件 函数获取其他事件对象句柄。
此方法使应用程序具有具有不同访问权限的句柄。
例如,句柄 1 可能已设置和等待事件访问权限,句柄 2 可能仅具有等待访问权限。
如果另一个进程知道事件名称并对该对象具有安全访问权限,则可以使用 打开事件 创建自己的事件对象句柄。
创建应用程序还可以使用 关闭对象 函数将其一个句柄复制到同一进程或另一个进程中。
只要至少有一个对象句柄存在,对象就保留在内存中。
应用程序使用 关闭对象 函数关闭其事件对象句柄。
如果没有事件句柄,系统会从内存中删除 对象。
系统管理文件对象的方式与其他内核对象略有不同。
文件对象包含文件指针 - 指向要读取或写入文件中的下一个字节的指针。
每当应用程序创建新的文件句柄时,系统都创建一个新的文件对象。
因此,多个文件对象可以引用磁盘上的单个文件。
只有通过复制或继承,多个文件句柄才能引用同一个文件对象。
下表列出了每个内核对象,以及每个对象的创建者和销毁器函数。
创建器函数要么创建对象和对象句柄,要么创建新的现有对象句柄。
销毁函数关闭对象句柄。
当应用程序关闭内核对象的最后一个句柄时,系统会从内存中删除该对象。
内核对象 | 创建 函数 | 销毁 函数 |
访问令牌 | 新建令牌、再造令牌、复制令牌、进程令牌、线程令牌 | 关闭对象 |
更改通知 | 初改通知 | 停改通知 |
通信设备 | 创建文件 | 关闭对象 |
控制台输入 | 创建文件,使用 CONIN$ | 关闭对象 |
控制台屏幕缓冲区 | 创建文件,使用 CONOUT$ | 关闭对象 |
事件 | 创建事件、新建事件、打开事件 | 关闭对象 |
事件日志 | 事件日志、注册事件、打开备份 | 关闭日志 |
文件 | 创建文件 | 关闭对象、删除文件 |
文件映射 | 映射文件、打开映射 | 关闭对象 |
查找文件 | 查找文件 | 关闭查找 |
堆 | 内存创建 | 内存销毁 |
I/O 完成端口 | 端口关联 | 关闭对象 |
作业 | 创建作业 | 关闭对象 |
邮槽 | 创建邮槽 | 关闭对象 |
内存资源通知 | 内存通知 | 关闭对象 |
模块 | 加载库、加载模块 模块地址 | 释放引用 |
互斥 | 创建互斥、新建互斥、打开互斥 | 关闭对象 |
管道 | 创建名管、创建管道 | 关闭对象、断开名管 |
进程 | 创建进程、打开进程、当前进程 | 关闭对象、终止进程 |
信号器 | 创建信号、新建信号、打开信号 | 关闭对象 |
网络 | 分配,接受 | 关闭 |
线程 | 创建线程、远程线程、当前线程 | 关闭对象、终止线程 |
定时器 | 创建延时、新建延时、 打开延时 | 关闭对象 |
更新资源 | 开更资源 | 停更资源 |
桌面 | 线程桌面 | 应用程序无法删除此对象。 |
窗口工作站 | 取窗口站 | 应用程序无法删除此对象。 |