Win32进程句柄表与内核对象深度解析
在Win32进程中,句柄表与内核对象的关系至关重要。句柄表通过索引允许三环程序访问位于高地址空间的内核对象,如EPROCESS结构。内核对象包括进程、线程、事件等多种类型,可通过CloseHandle API进行管理。多进程可以通过OpenProcess API共享内核对象,引用计数机制确保对象在无引用时被销毁。进程间还可以通过继承句柄技术共享资源,具体由安全属性结构体中的bInheritHandle参数决定。此外,进程ID(PID)是全局句柄表的索引,理解这些概念有助于掌握Windows程序开发中的进程操作和资源管理。
在不改变文章大意和图片位置的前提下,以下是经过伪原创处理的文章:
句柄表与内核对象之间的关系是什么?首先,我们需要了解什么是句柄表,什么是内核对象。
一、句柄表和内核对象的概念
- 句柄表的生成
当我们使用CreateProcess函数时,它会返回一个进程句柄和一个线程句柄。在调用CreateProcess时,内核会创建一个EPROCESS结构来保存进程信息。

然而,如何让三环程序使用这个EPROCESS呢?直接返回EPROCESS是不行的,因为EPROCESS位于高两G的地址空间,三环程序无法访问。为了解决这个问题,Windows创建了一个表格,并返回这个表格的索引。我们使用的就是这个索引。
- 什么是内核对象
内核对象就是我们提到的EPROCESS。内核对象有很多种,具体可以参考CloseHandle API,它可以关闭哪些内核对象:
- Access token
- Communications device
- Console input
- Console screen buffer
- Event
- File
- File mapping
- I/O completion port
- Job
- Mailslot
- Memory resource notification
- Mutex
- Named pipe
- Pipe
- Process
- Semaphore
- Thread
- Transaction
- Waitable timer
这些对象可以操作事件、文件、互斥体、线程等。
二、多进程共享内核对象
- 第一种方法:使用OpenProcess
在Windows程序中,我们操作的都是内核对象。我们可以通过OpenProcess API来打开一个已有的进程的内核对象。

每个进程的句柄表都是私有的。例如,在第一张表中,句柄索引为1,对应的内核对象为A。如果将这个索引传给B进程,是没有用的。B进程只有在使用API打开后,才能获得A内核对象。
中间的紫色表代表引用计数。每次引用内核对象,这个值会加1。CloseHandle的作用是使内核对象的引用计数减1。如果所有引用都被关闭,那么内核对象将无人使用,也没有任何引用,因此会被销毁。也就是说,当内核对象的引用计数为0时,它才会被真正销毁。
线程是一个特例:当线程的内核对象引用计数为0时,它不会被关闭。此时,必须先关闭线程,然后使用CloseHandle使引用计数减1。
- 使用继承句柄技术
在Windows程序中,A进程创建B进程,或者带有内核对象的API在创建时,都有一个SD属性,即安全属性。这个属性可以表示你创建的句柄是否可以被继承。
例如,CreateEvent()创建事件。我们先不讨论API的作用,看看它的参数:

HANDLE CreateEventA(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性结构体
BOOL bManualReset,
BOOL bInitialState,
LPCSTR lpName);第一个参数是安全属性结构体。如果我们不指定,默认使用父进程的。
安全属性结构体如下:

typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength; // 当前结构体大小,Windows扩展使用
LPVOID lpSecurityDescriptor; // 表明这个句柄给谁使用,谁可以访问,谁可以关闭。不重要,具体可以查看API中的结构体定义
BOOL bInheritHandle; // 重要,表明句柄是否可以被继承
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
如果我们的句柄可以被继承,那么句柄表的第一项就会填1,表示这个句柄可以被继承。如果不能继承,则为0。
此时,子进程就可以继承父进程的所有可继承的句柄表。注意,是所有可继承的句柄,可以共享,如下图所示:

A进程创建的B和D是可以继承的,因此子进程可以完全复制A进程的可继承句柄表。不允许继承的句柄则赋值为0,如下图所示:

三、进程PID解析
在Windows任务管理器中,有PID选项,我们可以选择查看。而且在Windows中也经常听到进程ID的概念。
那么,进程ID到底是什么?
其实,进程ID是全局句柄表的一个索引。上面提到的句柄表都是私有的句柄表,而PID是全局句柄表中的。
这个全局句柄表记录了所有正在运行的进程的句柄,而且是唯一的。如果进程死亡,这个PID可能会指向其他句柄,但也是唯一的,如下图所示:

这个全局句柄表才是真正有意义的。为什么这么说呢?
我们可以做个测试:
- 使用OpenProcess打开进程句柄。
- 使用TerminateProcess结束进程。
OpenProcess(访问权限, 句柄是否可以继承, 进程PID) TerminateProcess(进程句柄, 自定义的退出码)
使用这两个API可以测试我们已有的进程是否可以被关闭。如果测试后你会发现,只有通过PID获得的句柄才是有用的,也就是说,全局句柄表才是关键,而上面提到的都是子进程的句柄表。
四、常用进程操作API
- GetModuleFileName():获取当前模块路径,例如:c:\1.exe
- GetCurrentDirectory():获取当前的工作目录,例如:c:\text\abc
- OpenProcess():根据进程PID打开进程,获取进程句柄。
- FindWindow():根据类名和文件名,返回窗口句柄。
- GetWindowThreadProcessId():根据窗口句柄,获取进程PID。
- EnumProcesses:遍历所有进程,返回进程PID。具体参考MSDN,有提供的例子。
- GetCommandLine():获取命令行参数。
- CreateToolhelp32Snapshot():创建进程快照。如果你了解逆向工程,你会知道FS寄存器中的TEB和PEB结构中存储了当前模块或进程的链表。这是保存当前时刻的快照。我们可以进行遍历,具体参考MSDN或本博客。
五、编写Windows程序遇到的问题
在编写Windows程序时,我们会包含windows.h,但有些函数可能没有。例如,我们提到的第八个函数,快照函数。
此时,我们需要查询MSDN。我们可以在网页上搜索一下:

我们可以在下方看到所需的头文件是tlhelp32.h,此时我们包含它即可。
遇到的问题2:
有时候我们包含了头文件并使用了,但调用API时出错。为什么?
原因是有些API在高版本中才有,低版本中使用时没有导出。此时使用会出错,提示没有这个API。
解决方法:如果你学过Win32,你会理解这个方法。如果没有学过也没关系。这种问题很少遇到,博主也只遇到过一次。
可以使用LoadLibrary加载所需的DLL,然后使用GetProcAddress获取函数地址,使用函数指针来调用这个函数。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。
Debian上Tigervnc远程打印设置攻略
- 上一篇
- Debian上Tigervnc远程打印设置攻略
- 下一篇
- Python字典中value的详细解析及取值方法
-
- 文章 · 软件教程 | 3天前 | go · vs code · 软件教程 · 测试任务 · tasks.json · VS Code 测试任务 终端输出 Go插件 Go测试 tasks.json 问题面板
- VS Code 怎么给 Go 项目配置测试任务:tasks.json 运行与结果验收
- 501浏览 收藏
-
- 文章 · 软件教程 | 4天前 | 开发工具 · vs code · profiles · 软件教程 · 配置同步 · 软件教程 Visual Studio Code VS Code Profiles 配置档 导出配置 导入配置
- VS Code Profiles 怎么用:创建、导出和导入开发配置档
- 185浏览 收藏
-
- 文章 · 软件教程 | 4天前 | 开发环境 · windows terminal · 软件教程 · 终端工具 · Ubuntu PowerShell 软件教程 Windows Terminal 默认配置文件 起始路径
- Windows Terminal 默认启动配置怎么改:PowerShell、Ubuntu 和起始路径设置
- 495浏览 收藏
-
- 文章 · 软件教程 | 4天前 | Windows · 软件教程 · PowerToys · PowerRename · 批量重命名 · PowerToys 批量重命名 软件教程 PowerRename Windows重命名 文件改名
- PowerToys PowerRename 批量重命名怎么用:先看预览再应用
- 413浏览 收藏
-
- 文章 · 软件教程 | 4天前 | [] · []
- DBeaver 导入 CSV 到数据库怎么做:字段映射、预览校验和结果核对
- 217浏览 收藏
-
- 文章 · 软件教程 | 1星期前 | 环境变量 · postman · 软件教程 · 接口测试 · 导入导出 · 环境变量 Collection JSON文件 导入导出 Postman Environment 接口集合
- Postman 导出和导入接口集合:Collection 与 Environment 迁移检查
- 308浏览 收藏
-
- 文章 · 软件教程 | 1星期前 | PNG · diagrams.net · 软件教程 · draw.io · 流程图 · 透明背景 流程图 软件教程 Diagrams.net PNG导出 draw.io 图片归档
- diagrams.net 导出高清 PNG:透明背景、缩放比例和回导核对流程
- 130浏览 收藏
-
- 文章 · 软件教程 | 1星期前 | 版本控制 · source control · 软件教程 · VS Code教程 · Git冲突 · VS Code 软件教程 Git冲突 Source Control Merge Editor 提交核对
- VS Code 解决 Git 合并冲突:从 Source Control 到提交核对
- 395浏览 收藏
-
- 文章 · 软件教程 | 1星期前 | network · Har · 软件教程 · Chrome DevTools · 前端调试 · 软件教程 Chrome DevTools HAR文件 Network面板 前端排查
- Chrome DevTools 导出 HAR 文件:从 Network 捕获到脱敏核对
- 410浏览 收藏
-
- 文章 · 软件教程 | 2星期前 | 开发工具 · vs code · 软件教程 · 设置排错 · VS Code 搜索排除 search.exclude files.exclude Use Exclude Settings
- VS Code 搜索排除不生效:search.exclude 和 Use Exclude Settings 设置排查
- 256浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4429次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4079次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4065次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4253次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4223次使用
-
- VS Code 怎么给 Go 项目配置测试任务:tasks.json 运行与结果验收
- 2026-07-09 501浏览
-
- Windows 11 如何开启 HEIF 图片支持
- 2026-05-31 501浏览
-
- TikTok用户画像与付费订阅变现方法
- 2026-05-27 501浏览
-
- 学信网学历翻译件申请方法
- 2026-05-27 501浏览
-
- Windows 11 24H2 更新失败0x80070005解决方法
- 2026-05-26 501浏览

