DiskSnapshot 为 Windows Server 系列内置磁盘快照工具 / 能力,基于 VSS (Volume Shadow Copy Service) 卷影副本框架,把时间点卷快照导出为 VHD/VHDX 虚拟磁盘文件;区别于普通 VSS 卷影副本(仅本地卷内差异快照),DiskSnapshot 输出独立虚拟磁盘镜像文件
disksnapshot.exe 完整解构
说明:
disksnapshot.exe是 Windows Server 提供的命令行工具,不属于 Windows 桌面版 Windows10/11 自带;基于 VSS 卷影副本 COM 接口,把卷的时间点快照导出为独立 VHD/VHDX 文件。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
disksnapshot.exe 本身不实现快照内核,是用户态前端工具程序。
- 它调用 VSS COM 组件,请求生成卷影副本(Shadow Copy),依靠内核驱动
volsnap.sys完成写时复制 COW,获得卷的只读时间点一致视图。 - 获取快照卷设备路径之后,调用虚拟磁盘库
vdisk.dll,执行块级复制,把快照卷完整块流写入 VHD/VHDX 文件。 - 导出完成自动删除本次生成的临时卷影副本,不保留快照在系统中。
两种运行模式:
- 默认模式:调用 VSS Writers,通知应用(AD、SQL、Exchange)刷内存缓存,生成应用一致性快照。
/nowriters参数:跳过全部 VSS Writer,仅文件系统崩溃一致性,速度更快,数据库文件会处于非正常关闭状态。
核心:快照的创建由 VSS/volsnap 完成;disksnapshot.exe 只负责:参数解析 → 调用 VSS → 获取快照视图 → 块拷贝输出 VHDX → 清理临时快照。
二、依赖文件
| 文件名 | 类型 | 角色 |
|---|---|---|
disksnapshot.exe |
PE 可执行文件 | 主程序,命令行入口,实现业务逻辑,无内核代码 |
vssapi.dll |
COM DLL | VSS 客户端 COM 接口,程序直接依赖,发起快照集、管理快照生命周期 |
vssvc.exe |
服务进程 | VSS 协调服务,COM RPC 服务端,所有 VSS 请求的服务端宿主 |
swprv.dll |
DLL | 软件快照提供程序,实现软件卷影副本逻辑 |
volsnap.sys |
内核过滤驱动 | 内核 COW 写时复制,生成只读快照卷设备 |
vdisk.dll |
DLL | 虚拟磁盘库,负责创建 VHD/VHDX、块写入、虚拟磁盘元数据处理 |
dmutil.dll |
DLL | 磁盘 / 卷布局枚举,获取卷设备信息、分区信息 |
rpcss.dll |
DLL | RPC 通信,disksnapshot ↔ vssvc.exe 跨进程 COM‑RPC 调用基础 |
ole32.dll |
COM 库 | Windows COM 组件基础 |
注册表关键项:
HKLM\SYSTEM\CurrentControlSet\Services\VSS
HKLM\SYSTEM\CurrentControlSet\Services\VolSnap
存储 VSS 服务、volsnap 驱动配置、快照存储配额、超时参数。
三、依赖关系
组件调用依赖链
disksnapshot.exe
↓ 加载 vssapi.dll(COM客户端)
↓ RPC → vssvc.exe(VSS服务)
↓ swprv.dll(软件快照提供程序)
↓ IOCTL 下发至内核 volsnap.sys
↓ 拿到快照只读卷设备路径
↓ vdisk.dll 创建VHDX + 块拷贝读取快照卷
↓ 导出完成,通知VSS删除临时快照
- 服务依赖
RPCSS服务必须运行 →VSS(Volume Shadow Copy)服务必须处于运行状态;VSS 停止,disksnapshot.exe 直接返回错误,无法创建快照。 - 权限依赖 必须提升本地管理员权限;UAC 未提升,COM 调用直接拒绝访问,操作失败。
- 文件系统依赖 源卷必须为 NTFS / ReFS;FAT32/exFAT 不支持 VSS 快照,直接报错。
- Writer 依赖(可选) 不带
/nowriters:会加载系统注册 VSS Writer(NTDS、SQL、Exchange 等),Writer 依赖 DCOM/WMI 环境;任意关键 Writer 故障,整个快照流程终止。 带/nowriters:绕过所有 Writer,不再依赖应用 Writer 组件。 - 存储依赖
- 快照阶段:源卷必须配置足够 ShadowStorage 快照存储空间;配额不足快照创建失败。
- 导出阶段:目标输出磁盘必须有足够空闲空间存放完整 VHD/VHDX 镜像。
注意:
disksnapshot.exe生成的快照是临时快照,导出完毕自动删除,不会保留在系统卷影副本列表。区别于vssadmin create shadow创建持久快照。
四、配套链
同系统配套工具
diskshadow.exe:交互式 VSS 脚本工具,可以创建、expose 暴露快照卷,但本身不能导出 VHDX 文件。vssadmin.exe:管理卷影副本、设置 ShadowStorage 配额、删除快照。- Windows Server Backup:底层同样基于 VSS,备份输出 VHDX,原理同源,但为备份专用工具。
disksnapshot.exe 命令行语法示例
:: 应用一致性快照,C盘导出VHDX
disksnapshot.exe C: D:\backup\C-disk.vhdx
:: 跳过VSS‑Writer,文件系统一致性
disksnapshot.exe C: D:\backup\C‑raw.vhdx /nowriters
:: 查看帮助
disksnapshot.exe /?
上层调用配套
- 批处理 / PowerShell:直接调用可执行文件,自动化批量备份。
- 产物配套:生成 VHDX,可通过
diskpart attach vdisk离线挂载;可直接附加到 Hyper‑V 虚拟机。
五、逻辑链路(完整时序)
disksnapshot.exe启动,解析命令行参数(源卷、输出路径、/nowriters 标记);校验管理员权限。- 加载
vssapi.dll,初始化 VSS COM 客户端接口,创建快照集对象。 - 如果没有 /nowriters:
- VSS 服务枚举系统全部注册 VSS Writer;发送 PrepareForBackup 事件;
- 各应用 Writer 把内存脏缓存落盘,短暂冻结 IO(默认最大冻结 60s)。
- 请求创建卷影副本;RPC 传递请求至
vssvc.exe,调用swprv.dll,下发 IOCTL 到内核volsnap.sys。 volsnap.sys挂载过滤驱动到源卷 IO 栈,开启 Copy‑On‑Write,生成只读快照卷设备。- Writer 收到 BackupComplete 事件,解冻业务 IO,业务程序恢复正常读写。
- disksnapshot.exe 获取快照卷的只读设备路径。
- 调用
vdisk.dll,在目标路径创建空白 VHD/VHDX 虚拟磁盘。 - 块循环读取快照卷(只读时间点视图),逐块写入 VHDX 文件;此步骤是 CPU/IO 耗时主要部分。
- VHDX 块拷贝完成;通知 VSS 删除本次临时卷影副本,释放 volsnap 快照资源。
- 释放 COM 资源,返回退出码(0 成功,非 0 错误)。
关键点:创建快照本身速度极快;绝大部分耗时发生在第 9 步块拷贝导出 VHDX。源卷业务 IO 不会被长时间阻塞。
六、边界(约束、坑点、失效条件)
1 系统版本边界
- ✅内置:Windows Server 2019、Server2022
- ❌Windows 10 / Windows11 桌面版系统不带 disksnapshot.exe,需要从 Server 版本拷贝二进制,但依赖的部分组件缺失,会出现不可预期故障。
2 文件系统边界
- 支持:NTFS、ReFS
- 不支持:FAT32、exFAT、RAW,快照直接失败。
3 卷大小硬限制
软件快照提供程序上限 64TB 卷;源卷 > 64TB,VSS 报错0x80042306,disksnapshot.exe 执行失败。
4 Writer 模式边界
- 默认模式:依赖 VSS‑Writer 健康;某个 Writer 报错 / 挂起,整体快照直接失败;适合数据库、域控服务器。
/nowriters模式:无应用一致性;数据库、AD 数据库得到崩溃一致性镜像;挂载后数据库需要执行修复,不能直接上线运行业务。
5 快照配额边界
单卷 VSS 卷影副本最大 64 个;disksnapshot 产生的临时快照也计入该计数;配额占满报错0x80042317。
6 存储空间边界
- 源卷 ShadowStorage 空间不足 → 创建快照失败。
- 目标磁盘空间不足 → 块拷贝中途终止,产生损坏不完整 VHDX 文件。
7 超时边界
VSS Writer 冻结 IO 最长 60 秒;应用 IO 压力大冻结超时,快照流程直接终止失败。
8 第三方驱动冲突边界
第三方杀毒、存储过滤驱动与volsnap.sysIO 栈冲突,快照 IO 异常,返回 0x800423xx 系列错误。
9 产物边界
- disksnapshot.exe 输出完整全量 VHDX 镜像,不是增量快照,每次执行输出完整镜像。
- 内部临时快照导出后自动删除,不会残留在系统卷影副本列表,与
vssadmin create shadow持久快照行为不同。
10 常见误区
- ❌误区:
disksnapshot.exe在内核实现快照;✅真相:它只是用户态工具,真正快照内核是volsnap.sys。 - ❌误区:VSS 卷影副本等于 VHDX;✅真相:卷影副本驻留原卷内部;disksnapshot 做块拷贝才生成独立可离线 VHDX。
- ❌误区:桌面 Windows 复制 disksnapshot.exe 就可以直接使用;✅真相:缺少配套 VSS 组件,极易异常,官方不支持桌面版使用该工具。
vssapi.dll 完整解构
vssapi.dll:Volume Shadow Copy Service Client‑side API,VSS 卷影副本服务客户端 COM 库。所有应用(disksnapshot.exe、diskshadow.exe、Windows Server Backup)创建、管理快照,用户态程序全部通过 vssapi.dll 访问 VSS。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
vssapi.dll 是纯用户态 COM 客户端库,无内核代码,不实现快照逻辑,仅封装 VSS 全套 COM 接口,充当本地程序与 VSS 服务vssvc.exe之间的 RPC 代理层。
- 对外暴露一套 C/C++ COM 接口(
IVssBackupComponents、IVssSnapshotMgmt等),上层程序(disksnapshot、diskshadow、备份软件)调用这些接口发起快照任务。 - 内部封装 COM‑RPC,把本地 API 调用序列化,跨进程发送给服务端
vssvc.exe。 - 将服务端返回结果、错误码转换为 VSS 专用 HRESULT 错误码,返回调用方程序。
- 封装 VSS 数据结构:快照集、快照 ID、Writer 元数据、Provider 信息、存储配额配置。
分层定位
- 上层:
disksnapshot.exe/diskshadow.exe/ 第三方备份软件 - ↓
- vssapi.dll(客户端 COM 包装,RPC 代理)
- ↓ RPC/COM
vssvc.exe(VSS 协调服务,服务端)- ↓
swprv.dll快照提供程序 →volsnap.sys内核过滤驱动
核心接口清单(vssapi.dll 导出)
IVssBackupComponents:最核心,创建快照集、触发 Writer 事件、生成卷影副本、删除快照IVssSnapshotMgmt:管理快照存储配额、枚举 ProviderIVssEnumObject:枚举快照、Writer、元数据
二、依赖文件
表格
| 文件名 | 类型 | 角色 |
|---|---|---|
vssapi.dll |
COM DLL | VSS 客户端主库,导出全部 VSS 备份 COM 接口 |
ole32.dll |
COM 基础库 | COM 对象实例化,CoCreateInstance |
rpcrt4.dll |
RPC 运行时 | COM‑RPC 跨进程通信,和 vssvc.exe 交互 |
vssvc.exe |
服务进程 | 服务端,vssapi.dll 的通信对端 |
swprv.dll |
VSS 软件快照 Provider | 服务端内部组件,客户端不直接加载 |
volsnap.sys |
内核驱动 | 内核快照实现,客户端完全不直接接触该驱动 |
注册表配置:
HKLM\SYSTEM\CurrentControlSet\Services\VSS
HKLM\CLSID\{VSS‑COM‑CLSID}
保存 VSS COM 类 ID,用于CoCreateInstance创建IVssBackupComponents对象。
三、依赖关系
调用依赖链
调用程序(disksnapshot.exe / diskshadow.exe)
↓加载 vssapi.dll
↓ole32.dll CoCreateInstance 创建VSS COM对象
↓rpcrt4.dll COM‑RPC 本地进程间通信
↓目标进程 vssvc.exe(VSS服务端)
- 强服务依赖
vssapi.dll本身只是客户端库;如果VSS(vssvc.exe)服务未运行,CoCreateInstance 直接失败,返回 HRESULT 错误0x80042302。 vssapi.dll 不会自动启动 VSS 服务;上层应用需要自行保证 VSS 服务处于运行。 - 权限依赖 大部分 VSS 接口需要管理员权限;普通用户调用
IVssBackupComponents::SetContext、AddToSnapshotSet会返回拒绝访问。 少数只读枚举接口允许普通用户调用。 - COM 依赖 依赖系统 COM 子系统正常;若 COM 注册表损坏,vssapi.dll 对象实例化直接失败。
- 关键隔离:
vssapi.dll【客户端】不会加载 swprv.dll、不会直接调用 volsnap.sys;这两个全部运行在 vssvc.exe 服务进程上下文。 vssapi.dll 只做命令转发,不参与 IO 拦截、写时复制。
- 版本依赖: 不同 Windows Server 版本 vssapi.dll 接口版本存在差异;新接口(增量快照、ReFS 增强快照)在旧系统不存在;跨版本拷贝 dll 无法兼容,VSS 是系统组件,不支持单独移植。
四、配套链
上层调用者(消费 vssapi.dll)
disksnapshot.exe:调用IVssBackupComponents创建快照集,拿到快照设备路径。diskshadow.exe:交互式脚本工具,完全基于 vssapi.dll。- Windows Server Backup:系统备份,核心依赖 vssapi.dll。
- 第三方备份软件:Veeam、Commvault 等 Windows 备份代理,均加载 vssapi.dll。
开发配套
- SDK 头文件:
vss.h、vss.idl,定义 COM 接口、结构体、错误码。 - 工具:
vssadmin.exe部分功能内部也调用 vssapi.dll。
典型简化 C++ 伪代码(vssapi.dll 调用流程)
CoCreateInstance(CLSID_VssBackupComponents, ..., IID_IVssBackupComponents, &pVss);
pVss->SetContext(VSS_SNAPSHOT_CONTEXT);
pVss->GatherWriterMetadata();
pVss->AddToSnapshotSet(L"C:", ...);
pVss->DoSnapshotSet();
// 获取快照设备路径,执行业务操作
pVss->DeleteSnapshotSet(&snapId);
五、逻辑链路(完整时序)
以 disksnapshot.exe 使用 vssapi.dll 创建快照为例
- disksnapshot.exe 启动,加载
vssapi.dll。 - 通过
ole32.dll::CoCreateInstance实例化 VSS COM 对象(vssapi.dll 内实现客户端代理存根)。 - 客户端代理通过
rpcrt4.dll发起 RPC,连接到系统服务vssvc.exe。 - 调用
IVssBackupComponents::GatherWriterMetadata:- RPC 请求转发至 vssvc.exe;服务端枚举全部注册 VSS Writer;收集 Writer 元数据返回给 vssapi.dll;再回传给 disksnapshot。
- 调用
AddToSnapshotSet,把目标卷加入快照集合。 - 调用
DoSnapshotSet,真正触发快照生成:- RPC 命令给到 vssvc.exe;服务端依次执行 Writer Prepare、PrepareForSnapshot;
- 调用 Provider (swprv.dll),下发 IOCTL 至 volsnap.sys 内核驱动,生成卷影副本;
- 将快照 ID、快照只读设备路径,通过 RPC 传回 vssapi.dll。
- vssapi.dll 把快照信息、设备路径交付上层程序 disksnapshot.exe。
- disksnapshot.exe 拿到快照设备,执行块拷贝导出 VHDX。
- 调用
DeleteSnapshotSet接口(vssapi.dll),RPC 通知 vssvc 删除临时快照。 - COM 对象释放,卸载 vssapi.dll。
重点:所有真正业务逻辑全部发生在 vssvc.exe 服务进程;vssapi.dll 只是 “消息转发层”。
六、边界(约束、坑点、失效条件)
1 进程边界
vssapi.dll加载在调用者用户进程空间;快照 Provider、volsnap 交互全部在 vssvc.exe 服务进程,两者内存完全隔离。
现象:disksnapshot.exe 崩溃,不会直接终止正在执行的快照,快照逻辑运行在服务进程。
2 接口权限边界
- 只读接口(枚举快照信息):普通用户权限可执行;
- 修改类接口(创建快照集、删除快照、修改存储配额):必须管理员权限,UAC 提升,否则返回
E_ACCESSDENIED。
3 版本边界
- vssapi.dll 属于操作系统系统组件,禁止单独拷贝 dll 跨系统使用;接口与 vssvc.exe 服务端版本严格匹配,版本不匹配 COM 调用直接失败。
- Windows 桌面版 vssapi.dll 接口子集少于 Server;部分高级备份接口在桌面版缺失。
4 错误透传边界
vssapi.dll 不会屏蔽底层错误;volsnap、swprv、Writer 产生的错误全部封装为 HRESULT(0x800423xx 系列 VSS 错误码)向上抛出。
例如:快照配额满、卷 > 64TB、Writer 冻结超时,vssapi.dll 原样把错误返回上层程序,vssapi 本身不处理故障恢复。
5 COM‑RPC 边界
本地 RPC 通道损坏、DCOM 配置异常:vssapi.dll CoCreateInstance失败,错误码0x80042302,提示 VSS 服务不可访问。 即使 vssvc.exe 正在运行,如果 DCOM 安全权限被篡改,客户端 vssapi.dll 依然无法连接。
6 生命周期边界
IVssBackupComponents COM 对象生命周期管控快照集;客户端进程异常崩溃(disksnapshot.exe 闪退):
- 如果没有调用 DeleteSnapshotSet,vssapi.dll 没有机会发送删除指令;
- vssvc.exe 服务端会保留快照集对象,临时快照可能残留,需要 vssadmin 清理。
7 不具备的能力(重要边界)
- ❌vssapi.dll 不能直接读写磁盘块;块读取、VHDX 生成,是上层程序(disksnapshot)调用 vdisk.dll 完成,vssapi 不参与。
- ❌vssapi.dll 不实现 COW 快照逻辑,不直接和 volsnap.sys 通信。
- ❌vssapi.dll 不会自动启动 VSS 服务;应用必须自行保证 vssvc.exe 处于运行状态。
8 常见故障现象
CoCreateInstance 0x80042302:VSS 服务未运行 / DCOM 权限异常,vssapi 无法连接服务端。- 调用 DoSnapshotSet 返回 0x80042317:快照存储配额已满,来自 swprv/volsnap,由 vssapi.dll 透传给上层程序。
- 程序崩溃快照残留:客户端进程退出,未调用 DeleteSnapshotSet,vssapi.dll 来不及发送清理指令。
vssvc.exe 完整解构
vssvc.exe:Volume Shadow Copy Service,卷影副本协调服务进程;VSS 整个框架的调度中枢,COM‑RPC 服务端宿主。本身不执行快照 IO、不实现 COW 写时复制,负责协调 Requestor 请求者、VSS Writer 应用写入器、Snapshot Provider 快照提供程序三方组件协同工作。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
vssvc.exe是 Windows 系统服务进程,运行于 SYSTEM 权限上下文,作为 VSS COM 接口的服务端宿主。
- 接收来自客户端
vssapi.dll(disksnapshot.exe、diskshadow.exe、备份软件)的本地 COM‑RPC 调用请求。 - VSS 全流程总调度:枚举系统注册全部 VSS Writer,按事件时序下发回调事件(
OnIdentify、OnPrepareForSnapshot、OnFreeze、OnThaw),通知数据库、AD、注册表等组件刷新缓存、短暂冻结 IO,保障应用一致性快照博客园。 - 调用快照 Provider(默认
swprv.dll软件快照提供程序;也可调用硬件存储厂商 Hardware Provider),下发创建 / 删除快照指令。 - Provider 向下通过 IOCTL 与内核驱动
volsnap.sys交互,实现卷影副本 COW 写时复制;vssvc.exe不直接调用内核驱动,通过 Provider 做中转。 - 维护快照会话、快照集 GUID、Writer 元数据、快照存储配额配置;将执行结果、HRESULT 错误码通过 RPC 回传给上层请求者。
- 记录 VSS 事件日志:
Microsoft‑Windows‑VSS/Operational事件日志,留存 Writer 报错、快照失败信息。
VSS 四大角色分工
- Requestor 请求者:disksnapshot.exe/diskshadow.exe/ 第三方备份(客户端,vssapi.dll)
- vssvc.exe(协调调度中枢)
- VSS Writer 写入器:SQL、NTDS、Registry Writer 等,保证应用数据一致性
- VSS Provider 提供程序:
swprv.dll+volsnap.sys,真正实现快照 COW 机制博客园
关键区分:
vssvc.exe:协调器,做事件调度、Writer 通知、会话管理,无内核 IO 逻辑。swprv.dll:软件快照提供程序,用户态下发 IOCTL 操作 volsnap.sys。volsnap.sys:内核过滤驱动,实现写时复制 COW、IO 拦截、快照卷设备生成。
二、依赖文件
表格
| 文件名 | 类型 | 角色说明 |
|---|---|---|
vssvc.exe |
服务可执行 | VSS 服务主进程,COM 服务端宿主,SYSTEM 权限运行 |
vssapi.dll |
COM 客户端 DLL | 客户端库;运行在调用方进程,RPC 客户端存根,与 vssvc 通信 |
ole32.dll / rpcrt4.dll |
系统库 | COM、本地 RPC 通信基础,vssvc 对外暴露 COM 对象依赖 |
swprv.dll |
VSS Provider Dll | 软件快照提供程序,加载运行在 vssvc.exe 进程空间内部,下发 IOCTL 给 volsnap.sysMicrosoft ... |
volsnap.sys |
内核过滤驱动 | 内核 COW 快照实现;vssvc 不直接加载,由 swprv 通过 IOCTL 控制 |
vsstrace.dll |
跟踪 DLL | VSS 诊断日志跟踪组件 |
注册表关键配置:
HKLM\SYSTEM\CurrentControlSet\Services\VSS # vssvc服务本身配置
HKLM\SYSTEM\CurrentControlSet\Services\swprv # 软件快照Provider服务配置
HKLM\SYSTEM\CurrentControlSet\Services\VolSnap # volsnap内核驱动参数
HKLM\CLSID\{VSS‑COM‑CLSID} # VSS COM服务端对象注册信息
事件日志位置: %SystemRoot%\System32\winevt\Logs\Microsoft‑Windows‑VSS%4Operational.evtx
三、依赖关系
完整组件调用链
请求进程(disksnapshot.exe/diskshadow.exe)
↓ vssapi.dll(客户端COM‑RPC代理)
↓ 本地RPC/COM
vssvc.exe【SYSTEM服务进程】
├─ 内部加载 swprv.dll(软件快照Provider)
├─ 回调各个VSS‑Writer进程(SQL、NTDS等)
└─ swprv.dll下发IOCTL → volsnap.sys内核驱动
- 系统服务依赖链
RPCSS(RPC Endpoint Mapper)+DCOM Server Process Launcher→ VSS(vssvc.exe) →swprv(Microsoft Software Shadow Copy Provider)服务Microsoft ...。
RPC 服务停止,则 vssvc 无法接收 COM 请求;vssvc 启动,但 swprv 服务禁用,软件快照创建直接失败。
- 进程内存边界
swprv.dll是加载进 vssvc.exe 进程内部执行;volsnap.sys 运行在内核地址空间,和 vssvc 进程完全隔离。
vssvc.exe 崩溃,快照创建流程直接中断;但已经完成的持久快照元数据留存在内核 volsnap 中。
- 权限依赖 vssvc 自身以
NT AUTHORITY\SYSTEM运行; 但客户端发起 COM 调用仍然需要调用方具备管理员权限;普通用户调用 VSS 修改类接口返回拒绝访问。 - Writer 外部进程依赖 VSS Writer 可以运行在独立进程(SQL Server、Exchange);vssvc 通过 COM 跨进程回调通知 Writer 执行冻结 / 解冻。任意一个关键 Writer 超时、崩溃,vssvc 终止整个快照集任务。
- 文件系统前置依赖 源卷必须 NTFS / ReFS;该校验由 swprv+volsnap 执行;vssvc 接收返回错误向上透传给请求者。
- 版本强绑定
vssvc.exe、vssapi.dll、swprv.dll、volsnap.sys版本必须匹配;不支持单独替换其中某一个二进制,版本不匹配 COM 调用直接报错 0x80042302。
四、配套链
上层请求者(全部依赖 vssvc.exe 服务运行)
disksnapshot.exe:Server 快照导出 VHDX 工具diskshadow.exe:VSS 交互式脚本工具vssadmin.exe:快照管理命令行- Windows Server Backup、系统还原、第三方备份软件(Veeam 等)
配套运维命令
:: 查看VSS服务状态
sc query vss
:: 列出系统全部VSS Writer
vssadmin list writers
:: 列出快照Provider
vssadmin list providers
:: 查看快照存储配置
vssadmin list shadowstorage
日志配套
事件查看器 → Applications and Services Logs → Microsoft‑Windows‑VSS‑Operational;排查 Writer 冻结超时、快照失败优先看此日志。
五、逻辑链路(完整快照时序,vssvc 作为调度中心)
以 disksnapshot.exe 发起快照为例
- disksnapshot.exe 加载
vssapi.dll,COM‑RPC 连接至运行中的vssvc.exe服务进程,创建IVssBackupComponents会话对象。 - vssvc.exe 收到请求,执行
GatherWriterMetadata:枚举本机全部注册 VSS Writer,发送OnIdentify事件,收集各 Writer 元数据、受保护文件组件列表,回传给客户端。 - vssvc 向全部 Writer 下发
OnPrepareForSnapshot事件:通知应用完成未完成事务、刷内存脏缓存,为冻结 IO 做准备。 - vssvc 下发
OnFreeze事件给所有 Writer:进入 IO 冻结窗口期,最大允许 60 秒;应用暂停新写入事务,内存数据落盘到磁盘。 - vssvc 调用本机快照 Provider (swprv.dll,加载在自身进程),请求创建快照集。
- swprv.dll 下发 IOCTL 控制码给内核
volsnap.sys:挂载过滤驱动到源卷 IO 栈,开启 COW 写时复制,生成卷影副本只读设备。 - 快照时间点生成完成;vssvc 下发
OnThaw事件给全部 VSS‑Writer:解除冻结,业务应用恢复正常 IO 读写。 - vssvc 拿到快照 ID、快照只读设备路径,通过 RPC 返回给客户端 disksnapshot.exe。
- disksnapshot.exe 执行块拷贝导出 VHDX。
- 客户端调用
DeleteSnapshotSet;RPC 通知 vssvc;vssvc 调用 Provider 删除临时快照,通知 volsnap 释放快照差异块资源。 - 会话释放,COM 对象销毁。
重要时序特征:真正业务冻结窗口只发生步骤 4‑6;快照一旦完成,立刻解冻业务 IO;块拷贝导出 VHDX 在解冻之后,不阻塞业务写 IOMicrosoft ...。
六、边界(约束、坑点、失效条件)
1 进程与会话边界
- vssvc 维护多个并行快照会话;每个请求者对应独立快照集对象;
- 如果客户端进程 (disksnapshot.exe) 崩溃退出,没有调用 DeleteSnapshotSet:vssvc 会保留会话对象,临时快照不会自动清理,会发生快照残留,需要 vssadmin 手动删除。
- vssvc.exe 本身崩溃:所有进行中的快照任务全部终止;已经生成的持久快照不会消失,由 volsnap 内核维护。
2 Writer 冻结超时边界
VSS 规范最大冻结时间 60 秒;当业务 IO 压力巨大,Writer 无法在 60 秒完成冻结,vssvc 直接终止整个快照集,返回 0x800423f2 错误码。
冻结超时是 VSS 快照最常见故障,由 vssvc 做超时判断。
3 Provider 切换边界
vssvc 支持切换 Provider:默认使用软件 Providerswprv.dll;SAN 存储硬件快照会注册硬件 VSS Provider,vssvc 调度硬件 Provider 完成快照,此时不经过 swprv.dll,但依然由 vssvc 做 Writer 事件调度。
4 COM‑RPC 通信边界
- DCOM 安全权限被篡改:即使 vssvc 进程正常运行,客户端
vssapi.dll无法建立 RPC 连接,报错0x80042302 VSS服务不可访问。 - vssvc 只支持本机本地 RPC 调用,不支持跨网络远程机器直接 COM 调用。
5 快照类型边界
- 临时快照(Volatile):客户端会话结束即删除;重启系统直接销毁;disksnapshot.exe 使用临时快照。
- 持久快照(Persistent):vssvc 通知 Provider 标记为持久;快照元数据写入内核 volsnap;系统重启之后快照仍然保留,对应 “以前的版本” 功能。
6 文件系统与卷大小边界
该校验由 swprv/volsnap 执行,错误结果透传给 vssvc 再返回上层:
- 软件 Provider 最大支持卷 64TB;超过 64TB 返回 0x80042306;
- FAT32/exFAT 卷不支持 VSS 快照。
7 服务启停边界
- vssvc 默认启动类型为手动;收到第一个客户端 COM 请求时才会自动启动;
- 停止 vssvc 服务:所有正在进行的快照任务全部中止;已经存在的持久快照不受影响。
8 常见认知误区
- ❌误区:vssvc.exe 实现快照写时复制;✅真相:vssvc 只是调度器;COW 内核逻辑由
volsnap.sys完成。 - ❌误区:swprv.dll 运行独立进程;✅真相:swprv.dll 以 DLL 形式加载到 vssvc.exe 进程内部运行。
- ❌误区:vssvc 可以直接读写磁盘块;✅真相:vssvc 完全不做磁盘 IO,IO 操作全部交给 Provider 与内核驱动。
- ❌误区:关闭 vssvc 服务会删除已经存在卷影副本;✅真相:已经创建持久快照保存在内核 volsnap,与 vssvc 服务运行与否无关。
swprv.dll 完整解构
swprv.dll:Microsoft Software Shadow Copy Provider,软件卷影副本提供程序,VSS 架构里的软件快照实现层。被加载到
vssvc.exe服务进程内部运行;接收 vssvc 调度,向下通过 IOCTL 与内核volsnap.sys交互,真正完成软件快照的创建、管理、删除。硬件快照 Provider 不使用此组件。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
swprv.dll 是运行在 vssvc.exe 用户态上下文的 VSS Provider 插件 DLL,不包含内核代码,充当 VSS 服务与内核过滤驱动volsnap.sys之间的桥梁。
- 实现 VSS 定义的
IVssSoftwareSnapshotProvider接口;vssvc.exe 通过该接口下发:创建快照、删除快照、设置快照存储配额、查询卷影副本信息等指令。 - 打开卷设备对象(
\\.\C:这类原始卷句柄),向volsnap.sys下发一系列 IOCTL 控制码,完成内核侧快照的配置与生成。 - 管理Shadow Copy Storage(快照差异存储区域):配置源卷上用于存放 COW 写时复制差异块的存储空间大小、位置。
- 维护快照元数据:快照 ID、源卷 GUID、快照卷设备路径、快照上下文(临时 / 持久),在内核与用户态之间做状态同步。
- 把
volsnap.sys返回的内核 IO 错误转换为 VSS 标准 HRESULT 错误码(0x800423xx),向上返回给 vssvc.exe。
VSS 分层定位
- Requestor:disksnapshot.exe / diskshadow.exe → vssapi.dll
- vssvc.exe(协调调度、Writer 事件)
- swprv.dll(软件 Provider,本组件,运行于 vssvc 进程内)
- volsnap.sys(内核过滤驱动,COW 写时复制)
区分:硬件快照 Provider(存储厂商提供)会替换 swprv.dll,直接调用存储阵列硬件接口,不走 volsnap.sys 软件 COW 路径。
二、依赖文件
表格
| 文件名 | 类型 | 角色说明 |
|---|---|---|
swprv.dll |
DLL | 软件快照提供程序主模块,加载入 vssvc.exe 进程空间 |
vssvc.exe |
服务进程 | 宿主进程,swprv.dll 被其加载,不能独立运行 |
volsnap.sys |
内核过滤驱动 | 真正实现 COW 写时复制;swprv 通过卷设备 IOCTL 和内核通信 |
kernel32.dll / ntdll.dll |
系统用户态库 | 打开卷设备、下发 IOCTL、文件对象操作 |
ole32.dll |
COM 库 | 实现 VSS Provider COM 接口 |
注册表关键配置:
HKLM\SYSTEM\CurrentControlSet\Services\swprv
HKLM\SYSTEM\CurrentControlSet\Services\VolSnap
HKLM\CLSID\{VSS‑Software‑Provider‑CLSID}
控制 swprv 注册、COM 类 ID、volsnap 驱动参数、快照存储配额。
三、依赖关系
调用依赖链
vssvc.exe(VSS协调服务)
↓加载 swprv.dll,调用 IVssSoftwareSnapshotProvider COM接口
↓NtOpenVolume打开源卷设备句柄
↓DeviceIoControl / NtDeviceIoControlFile 下发IOCTL
↓volsnap.sys 内核过滤驱动处理IOCTL,执行快照逻辑
- 宿主强依赖
swprv.dll不能独立执行,必须被加载到vssvc.exe进程;swprv 对应系统服务名称swprv,该服务本质是通知 SCM 允许被 vssvc 加载,swprv.dll 本身没有独立 exe 主入口。
服务
swprv启动类型一般为手动;vssvc 运行时按需加载此 DLL。
- 内核驱动依赖
volsnap.sys必须成功加载;若 volsnap.sys 未加载、损坏、被第三方过滤驱动阻止挂载,swprv 所有快照相关 IOCTL 调用直接失败,返回 VSS 错误码。 - 文件系统依赖 仅支持 NTFS / ReFS;FAT32/exFAT 卷下发快照 IOCTL,volsnap 返回失败,swprv 透传错误给 vssvc。
- 权限依赖 继承宿主
vssvc.exe的SYSTEM权限;需要对源卷原始卷设备具备完全访问权限。 - 版本绑定
swprv.dll、vssvc.exe、volsnap.sys版本必须严格匹配;禁止单独复制替换 swprv.dll,版本不匹配会造成接口调用异常。 - 与 VSS‑Writer 解耦
重要边界:swprv.dll 完全不感知 VSS Writer(SQL/NTDS 等)。 Writer 冻结、解冻、元数据收集全部由上层
vssvc.exe完成;swprv 只负责接收 “现在创建快照” 指令,不参与应用一致性逻辑。
四、配套链
上层调用方
vssvc.exe:唯一直接加载 swprv.dll 的进程。- 间接上层工具:
disksnapshot.exe、diskshadow.exe、vssadmin.exe、Windows Server Backup、第三方备份软件。
运维配套命令
:: 查看系统注册的快照提供程序,可以看到Microsoft Software Shadow Copy Provider
vssadmin list providers
:: 管理快照存储配额,底层调用swprv.dll接口
vssadmin set shadowstorage
关键 IOCTL(swprv 下发给 volsnap.sys)
- IOCTL_VOLSNAP_CREATE_SNAPSHOT:创建卷影副本
- IOCTL_VOLSNAP_DELETE_SNAPSHOT:删除快照
- IOCTL_VOLSNAP_SET_STORAGE_AREA:配置快照差异存储区域
- IOCTL_VOLSNAP_QUERY_SNAPSHOT:查询快照状态与设备路径
五、逻辑链路(完整时序,软件快照路径)
以 disksnapshot.exe 创建临时快照为例
- disksnapshot.exe → vssapi.dll → RPC → vssvc.exe。
- vssvc 完成全部 VSS Writer 事件流程(Prepare、Freeze),应用 IO 进入冻结窗口。
- vssvc 在自身进程内部加载
swprv.dll,获取IVssSoftwareSnapshotProvider接口。 - swprv 调用
NtOpenVolume打开源卷设备对象\\.\X:,获取卷句柄。 - swprv 下发
IOCTL_VOLSNAP_SET_STORAGE_AREA:通知内核 volsnap.sys 确认快照差异存储区域位置与配额。 - swprv 下发
IOCTL_VOLSNAP_CREATE_SNAPSHOT,请求内核生成卷影副本。 volsnap.sys内核过滤驱动挂载至源卷 IO 栈,启用 Copy‑On‑Write 写时复制,生成只读快照卷设备,返回快照 ID、快照设备路径。- swprv 接收内核返回结果,整理快照元数据,通过 COM 接口回传给 vssvc.exe。
- vssvc 立刻下发 Thaw 事件给所有 VSS‑Writer,解除应用 IO 冻结。
- vssvc 把快照 ID、快照设备路径经 RPC 返回给客户端 disksnapshot.exe;disksnapshot 执行块拷贝导出 VHDX。
- 客户端发起 DeleteSnapshotSet;vssvc 调用 swprv 接口。
- swprv 下发
IOCTL_VOLSNAP_DELETE_SNAPSHOT给 volsnap.sys,内核释放 COW 差异块资源;关闭卷句柄。
关键点:应用冻结窗口只在步骤 2‑7 之间;快照一旦在内核创建完成,马上解冻业务,块拷贝导出工作在解冻之后执行,不阻塞业务写入。
六、边界(约束、坑点、失效条件)
1 进程边界
- swprv.dll 运行在vssvc.exe 地址空间;vssvc 进程崩溃,swprv 同时被卸载;正在进行的快照创建直接中止。
- swprv 没有独立进程;任务管理器看不到 swprv.exe。
2 卷大小硬上限边界
软件 Provider(swprv+volsnap)单卷上限 64TB;源卷 > 64TB,创建快照返回错误 0x80042306。
该限制是 swprv/volsnap 软件快照的硬性限制;硬件快照 Provider 不受该 64TB 约束。
3 快照存储配额边界
- ShadowStorage 配额耗尽:swprv 调用创建快照 IOCTL 失败,返回
0x80042317。 - 快照差异存储区域不能跨卷;软件快照差异块只能存放在源卷本身,不能指定到别的磁盘。
4 快照上下文边界
swprv 支持两种快照上下文:
- 临时快照 (volatile):disksnapshot.exe 使用;会话结束、系统重启,内核自动销毁快照。
- 持久快照 (persistent):“以前的版本” 功能;快照元数据写入内核,系统重启后快照保留。
5 过滤驱动冲突边界
第三方杀毒、加密、存储过滤驱动,与volsnap.sysIO 栈冲突: swprv 下发 IOCTL 会返回 IO 错误;现象:vssadmin、disksnapshot 全部快照失败。故障点发生在内核,swprv 仅透传错误码。
6 文件系统边界
- ✅ NTFS、ReFS
- ❌ FAT32、exFAT、RAW:swprv 下发 IOCTL 直接失败,无法创建软件快照。
7 职责隔离边界(高频误区)
- ❌误区:swprv 负责通知数据库冻结 IO;✅真相:Writer 事件全部由 vssvc.exe 完成;swprv 只管告诉内核 “生成快照”。
- ❌误区:swprv 实现 COW 写时复制;✅真相:COW 在内核
volsnap.sys;swprv 只是用户态指令下发器。 - ❌误区:swprv 可以用于硬件阵列快照;✅真相:硬件快照使用厂商专属 Provider,完全绕开 swprv.dll 与 volsnap.sys。
8 常见故障现象
- vssadmin list providers 看不到软件 Provider:swprv.dll COM 注册损坏。
- 创建快照报错 0x80042306:卷超过 64TB 软件 Provider 上限。
- 创建快照报错 0x80042317:ShadowStorage 快照配额已满。
- 部分快照失败,但 Writer 日志无报错:Writer 已经全部成功,故障发生在 swprv→volsnap 内核路径。
volsnap.sys 完整解构
volsnap.sys:Volume Snapshot Driver,卷影副本内核过滤驱动;VSS 软件快照真正内核执行引擎,实现卷层 Copy‑On‑Write 写时复制、快照虚拟卷设备、差异块管理;位于存储 IO 过滤栈。swprv.dll 通过 IOCTL 下发指令控制该驱动。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
volsnap.sys是内核模式过滤驱动,工作在卷设备栈之上,文件系统 (ntfs.sys) 下层,拦截源卷全部 IRP 读写请求,实现块级快照虚拟化Microsoft ...。
- 过滤驱动挂载:收到用户态
swprv.dll的创建快照 IOCTL,附加到目标卷设备栈;拦截IRP_MJ_WRITE、IRP_MJ_READ、设备控制 IRP博客园。 - Flush‑and‑Hold 时间点冻结:执行
IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES,刷新文件系统全部脏缓存,短暂排队阻塞写 IRP;在毫秒级窗口完成卷时间点原子冻结,生成磁盘块一致性视图,之后放行写 IOMicrosoft ...。 - Copy‑On‑Write (COW) 写时复制
- 快照建立之后,源卷某个 LBA 块第一次被写入;volsnap 拦截写 IRP。
- 将原始未被覆盖的旧块复制到 DiffArea 差异存储区(System Volume Information 下稀疏文件)。
- 写完旧块到差异区之后,才允许新数据写入源卷。
- 后续重复改写同一 LBA,不再重复拷贝;只拷贝首次修改块,不做整卷复制。
- 快照虚拟卷设备生成:动态创建只读内核设备对象
\Device\HarddiskVolumeShadowCopy{Snapshot‑GUID};该虚拟设备没有物理磁盘对应。读取快照 IO 时,驱动查询块映射表:未修改块直接读源卷;已修改旧块从 DiffArea 差异区读取,拼接出快照时间点视图;快照虚拟卷禁止任何写入 IRP,全部写请求直接拒绝博客园。 - 多快照共存管理:维护每个卷多张快照的块映射元数据;多个快照共享未变更块;删除快照时回收 DiffArea 稀疏文件簇资源。
- 接收 IOCTL 指令集,完成:创建快照、删除快照、设置 ShadowStorage 配额、查询快照状态、枚举快照 ID。
VSS 完整分层定位
- Requestor:disksnapshot.exe/diskshadow.exe → vssapi.dll(用户态客户端)
- vssvc.exe(协调调度、VSS‑Writer 事件)
- swprv.dll(vssvc 内部加载软件 Provider,下发 IOCTL)
- volsnap.sys(内核过滤驱动,本组件,真正实现 COW 快照)
- ntfs.sys/refs.sys 文件系统驱动
重要区分:volsnap.sys 只保证磁盘块级别一致性;应用 / 数据库一致性完全由上层 VSS‑Writer 完成,内核对此无感知博客园。
二、依赖文件
表格
| 文件名 | 类型 | 角色说明 |
|---|---|---|
volsnap.sys |
内核过滤驱动 | 卷快照核心内核模块,运行在内核地址空间 |
ntfs.sys / refs.sys |
文件系统驱动 | DiffArea 差异存储是 NTFS 稀疏文件;仅 NTFS/ReFS 支持软件快照博客园 |
volmgr.sys |
卷管理器驱动 | 管理 HarddiskVolume 源卷设备栈,volsnap 挂载在此栈上 |
mountmgr.sys |
挂载管理器 | 注册快照虚拟卷设备,生成 GLOBALROOT 访问路径 |
swprv.dll |
用户态 DLL | 下发 IOCTL 控制码,用户态与 volsnap 交互唯一入口 |
vssvc.exe |
VSS 服务进程 | 不直接调用驱动,经由 swprv 中转 |
注册表配置:
HKLM\SYSTEM\CurrentControlSet\Services\VolSnap
驱动启动类型、最大快照数量、调试参数、事件日志配置。
内核关键 IOCTL 控制码(swprv 下发给 volsnap.sys)
IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES:刷新缓存、短暂 hold 写 IRP,原子冻结时间点Microsoft ...IOCTL_VOLSNAP_CREATE_SNAPSHOT:创建快照实例,挂载过滤驱动IOCTL_VOLSNAP_DELETE_SNAPSHOT:删除快照,释放 DiffArea 资源IOCTL_VOLSNAP_SET_STORAGE_AREA:配置 ShadowStorage 差异存储配额与位置IOCTL_VOLSNAP_QUERY_NAMES_OF_SNAPSHOTS:枚举卷上全部快照 ID 与设备路径
事件日志:系统日志,来源volsnap,记录 Event ID 1/8/9/14/25/33 等快照存储、IO、配额报错。
三、依赖关系
完整调用链
disksnapshot.exe → vssapi.dll → RPC → vssvc.exe → swprv.dll
↓DeviceIoControl IOCTL(用户态→内核)
volsnap.sys(内核过滤驱动)
↓IRP下发
ntfs.sys / volmgr.sys / 磁盘端口驱动
- 上层交互边界:用户态没有任何进程可以直接加载 volsnap.sys;全部控制命令必须经由
swprv.dll通过 IOCTL 设备控制码下发。vssvc.exe、vssapi.dll 完全不直接和内核驱动通信。 - 文件系统强依赖:DiffArea 差异存储必须建立在 NTFS/ReFS 卷;FAT32/exFAT 卷,volsnap 拒绝创建快照。
- 过滤驱动栈冲突依赖:其他第三方加密、杀毒、存储过滤驱动如果挂载在 volsnap 上层 / 下层 IO 栈顺序错乱,会造成 IRP 处理异常、快照失败、蓝屏。
- 两种快照上下文
- 临时快照 Volatile:内核元数据驻内存;系统重启自动全部销毁,disksnapshot.exe 使用该类型。
- 持久快照 Persistent:快照元数据写入磁盘;重启系统之后快照仍然保留,对应 “以前的版本” 功能博客园。
- 版本绑定:
volsnap.sys版本必须与swprv.dll、vssvc.exe、vssapi.dll整套 VSS 组件版本严格匹配;不能单独拷贝替换驱动文件。 - 配额依赖:ShadowStorage(DiffArea)空间耗尽,volsnap 无法完成 COW 拷贝块,快照直接失败,向上返回错误透传给 swprv。
进程边界:volsnap.sys 运行在内核;vssvc.exe 崩溃、退出,已经创建完成的持久快照不受影响,元数据保存在内核与磁盘 DiffArea 中。
四、配套链
用户态上层消费组件
swprv.dll:唯一用户态控制入口。- 间接上层工具:
disksnapshot.exe、diskshadow.exe、vssadmin.exe、Windows Server Backup、第三方备份软件。
运维配套命令
:: 查看快照存储配额,底层下发IOCTL到volsnap.sys
vssadmin list shadowstorage
:: 删除快照,IOCTL下发volsnap释放DiffArea
vssadmin delete shadows
访问快照虚拟卷路径格式
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy{GUID}\
快照虚拟卷默认不分配盘符;diskshadow 可以 expose 为盘符,本质是挂载该内核虚拟设备。
硬件快照 Provider 场景:SAN 硬件快照完全绕开 volsnap.sys;不加载此驱动,硬件阵列完成快照。
五、逻辑链路(软件快照完整时序,volsnap 视角)
disksnapshot.exe 发起快照完整内核侧流程
- swprv.dll 打开源卷设备句柄
\\.\X:,下发IOCTL_VOLSNAP_SET_STORAGE_AREA;volsnap 初始化 DiffArea 稀疏文件,校验快照存储配额。 - swprv 下发
IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES:- volsnap 通知下层 ntfs.sys 刷新全部脏页缓存、提交 NTFS 日志。
- 短暂 Hold 排队所有写 IRP(毫秒级),源卷写 IO 被临时挂起,获得原子一致时间点博客园。
- 下发
IOCTL_VOLSNAP_CREATE_SNAPSHOT:- volsnap.sys 将自身过滤驱动附加到源卷设备 IO 栈。
- 在内存建立快照块映射表。
- 内核生成只读快照虚拟设备对象
HarddiskVolumeShadowCopy{GUID}。
- Hold 解除,放行排队的写 IRP;源卷业务 IO 恢复运行;通知上层 swprv.dll 快照创建完成;vssvc 立刻 Thaw 解冻 VSS‑Writer 应用。
- 快照运行期 COW 逻辑:源卷业务发生写入 IRP_MJ_WRITE
- volsnap 拦截写 IRP;查询块映射:该 LBA 是否第一次被修改。
- 如果首次修改:读取该 LBA 原始旧块,写入 DiffArea 差异稀疏文件。
- 更新块映射表,记录该 LBA 旧块存放位置。
- IRP 放行,允许新数据写入源卷磁盘。
- 读取快照虚拟卷 IO:
- 读取请求下发到
HarddiskVolumeShadowCopy{GUID}设备。 - 查询块映射表:未修改块 → 直接读源卷;已经修改块 → 读取 DiffArea 里面保存的旧块,拼接返回快照视图。
- 读取请求下发到
- 删除快照:swprv 下发
IOCTL_VOLSNAP_DELETE_SNAPSHOT- volsnap 删除内存快照映射表;释放 DiffArea 稀疏文件占用磁盘簇资源。
- 卸载本快照对应的过滤实例;没有残留的快照之后,解除驱动对卷栈的挂载。
关键:快照创建动作极快;快照创建完成之后,业务 IO 不再被阻塞;COW 开销发生在源卷发生写操作时刻,而不是快照创建瞬间。
六、边界(约束、坑点、失效条件)
1 卷大小硬上限边界
软件快照(volsnap+swprv)单卷最大 64TB;源卷 > 64TB,创建快照失败,返回 0x80042306;该限制仅软件 Provider,硬件快照 Provider 不受此约束博客园。
2 文件系统边界
✅支持:NTFS、ReFS ❌不支持:FAT32、exFAT、RAW;volsnap 直接拒绝快照创建。
3 快照数量硬边界
单卷最多同时存在64 个卷影副本;超过上限创建快照报错0x80042317。临时快照、持久快照统一计入计数。
4 DiffArea 差异存储边界
- 软件快照 DiffArea 默认建立在源卷之上;可以指定到其他 NTFS 卷,但不能放在 FAT32 卷。
- DiffArea 配额耗尽:当大量写操作,差异块填满 ShadowStorage 配额;volsnap 无法继续执行 COW 复制,快照失效,旧快照可能被系统自动清理,事件日志报 volsnap Event ID 1。
- DiffArea 是 NTFS 稀疏文件,路径为
System Volume Information\{GUID}\diffarea,ACL 严格保护,仅 SYSTEM 可访问,普通用户无法直接打开读取博客园。
5 IO 栈过滤驱动冲突边界
第三方加密、磁盘过滤驱动顺序异常,叠加在 volsnap IO 栈,造成 IRP 处理异常:
- 现象:快照创建失败、IO 挂起、信号量超时 0x80070079,严重触发 volsnap.sys 蓝屏(0x7E、0x7B)Microsoft ...。
6 快照虚拟卷只读硬边界
volsnap.sys 内核层直接拦截快照卷上所有IRP_MJ_WRITE;快照虚拟卷完全不能写入,任何写入请求直接返回失败。只能做读取、导出操作。
7 职责隔离边界(高频误区)
- ❌volsnap.sys 不感知 VSS‑Writer,不做数据库缓存刷新、不处理应用一致性;只保证磁盘块时间点一致;数据库直接挂载快照得到是崩溃一致性副本,需要修复。
- ❌volsnap.sys 不会自动扩容 DiffArea;配额耗尽快照直接失效,不会自动扩大存储。
- ❌volsnap.sys 不做文件系统修复;底层磁盘坏道、NTFS 元数据损坏会直接造成快照异常。
- ✅volsnap 只做块层虚拟化,不处理上层文件语义。
8 重启行为边界
- 临时快照(Volatile):全部内存元数据,系统重启直接销毁。
- 持久快照(Persistent):元数据和 DiffArea 差异块保存在磁盘;重启之后仍然可用。
9 性能边界
快照启用后,源卷写入会带来写放大;每一个首次修改块,发生两次 IO(读旧块写入 DiffArea + 写新数据到源卷);高频繁大量写入业务,源卷写性能会下降。
10 常见故障现象
- volsnap Event ID 1:DiffArea 无法创建 / 空间不足。
- 0x80042317:快照数量达到 64 上限 / ShadowStorage 配额耗尽。
- 信号量超时 0x80070079:IO 栈冲突、存储子系统卡顿,IOCTL 执行超时。
- volsnap.sys 蓝屏:第三方过滤驱动 IRP 处理异常,驱动栈顺序错乱。
vdisk.dll 完整解构
vdisk.dll:Virtual Disk Service Client DLL,虚拟磁盘服务客户端库,VDS 客户端 COM 组件;提供管理虚拟磁盘、VHD/VHDX、iSCSI、磁盘分区、卷管理的用户态 API。注意区分:vdisk.dll是 VDS 客户端,不要和vdisk.sys(虚拟磁盘内核驱动)混淆;disksnapshot.exe导出 VHDX 并不使用 vdisk.dll,而是调用vdisk.dll的同家族兄弟vdiskapi.dll/vdisklib.dll(虚拟磁盘 API)。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
vdisk.dll是纯用户态 COM 客户端 DLL,本身不实现内核磁盘逻辑,作为 Virtual Disk Service(VDS)的客户端代理。
- 对外暴露 VDS 全套 COM 接口(
IVdsService、IVdsDisk、IVdsVirtualDisk、IVdsVolume等),上层应用调用接口发起磁盘管理请求。 - 内部封装 COM‑RPC,把 API 调用序列化,跨进程发送给系统服务进程
vds.exe(Virtual Disk Service)。 - 接收 vds.exe 返回结果,将底层磁盘、存储驱动返回的错误转换为 VDS 标准 HRESULT 错误码,返回调用程序。
- 能力覆盖:物理磁盘枚举、分区 / 卷管理、VHD/VHDX 虚拟磁盘挂载 / 卸载、iSCSI 磁盘管理、RAID 卷、动态磁盘管理。
分层定位
- 上层调用程序:diskpart.exe、第三方存储管理程序、部分备份软件
- ↓
- vdisk.dll(VDS COM 客户端,本组件)
- ↓ COM‑RPC 本地进程通信
- vds.exe(VDS 服务端进程)
- ↓
- 内核:
vdisk.sys虚拟磁盘驱动、disk.sys磁盘驱动、iscsiprt.sysiSCSI 驱动
重要区分
vdisk.dll:VDS(Virtual Disk Service)客户端 COM 库,面向物理磁盘、动态磁盘、VHD 管理。vdisklib.dll / vdiskapi.dll:虚拟磁盘 API,专门用于 VHD/VHDX 创建、快照、块读写;disksnapshot.exe导出快照为 VHDX 使用的是这一组,不是 vdisk.dll。vdisk.sys:内核模式虚拟磁盘驱动,负责 VHD/VHDX 文件映射为内核磁盘设备对象。
二、依赖文件
表格
| 文件名 | 类型 | 角色说明 |
|---|---|---|
vdisk.dll |
COM DLL | VDS 客户端主库,导出 VDS 全套 COM 接口 |
ole32.dll |
COM 基础库 | CoCreateInstance实例化 VDS COM 对象 |
rpcrt4.dll |
RPC 运行时 | 本地 COM‑RPC,与 vds.exe 进程通信 |
vds.exe |
系统服务进程 | VDS 服务端,vdisk.dll 通信对端 |
vdisk.sys |
内核驱动 | VHD/VHDX 内核映射驱动,由 vds.exe 间接调用,vdisk.dll 不直接访问内核 |
disk.sys |
磁盘类驱动 | 物理磁盘底层内核驱动 |
注册表配置
HKLM\SYSTEM\CurrentControlSet\Services\VDS
HKLM\CLSID\{VDS‑COM‑CLSID}
VDS 服务配置、COM 类注册信息。
三、依赖关系
调用依赖链
调用程序(diskpart.exe /存储管理程序)
↓加载 vdisk.dll
↓ole32.dll CoCreateInstance 创建VDS COM对象
↓rpcrt4.dll COM‑RPC本地通信
vds.exe(VDS服务端进程)
↓调用内核API,下发IRP/IOCTL
↓vdisk.sys / disk.sys / iscsiprt.sys
- 服务强依赖
vdisk.dll只是客户端代理;如果 VDS 服务 vds.exe 未运行,CoCreateInstance 直接失败返回 HRESULT 错误;vdisk.dll 不会自动启动 VDS 服务,上层应用需要自行保证服务运行。 - 权限依赖 绝大部分磁盘修改接口(创建 VHD、挂载虚拟盘、修改分区)必须管理员权限;普通用户仅可以调用部分只读枚举接口。
- 进程内存边界
vdisk.dll加载在调用者进程地址空间;所有真正磁盘业务逻辑运行在独立服务进程vds.exe;客户端进程崩溃,不会终止已经提交的磁盘任务。 - 版本绑定
vdisk.dll与vds.exe版本严格匹配,不支持单独拷贝 dll 跨系统移植;接口随 Windows 版本演进增减。 - 职责隔离边界
vdisk.dll不直接读写磁盘块,不解析 VHDX 文件格式;VHD 文件解析、块映射全部由内核vdisk.sys和服务端vds.exe完成。vdisk.dll 只做命令转发。
- 和 VSS 组件解耦 vdisk.dll 和 vssapi.dll/vssvc/swprv/volsnap没有直接依赖;VSS 快照由 volsnap 生成;导出 VHDX 使用
vdisklib.dll而不是 vdisk.dll。
四、配套链
上层调用者(消费 vdisk.dll)
diskpart.exe:磁盘分区管理命令行工具,核心依赖 vdisk.dll。- 磁盘管理 MMC 控制台 (diskmgmt.msc)。
- 第三方存储管理软件,动态磁盘、iSCSI、VHD 挂载工具。
❗注意:
disksnapshot.exe不依赖 vdisk.dll,它使用vdisklib.dll做快照卷的块拷贝输出 VHDX。
运维配套命令
:: 查看VDS服务状态
sc query vds
diskpart
VDS 核心 COM 接口(vdisk.dll 向外导出)
IVdsService:VDS 服务入口对象IVdsDisk:物理磁盘对象IVdsVolume:卷 / 分区对象IVdsVirtualDisk:虚拟磁盘 VHD/VHDX 管理接口IVdsIscsiInitiator:iSCSI 发起器管理
五、逻辑链路(完整时序,以 diskpart 创建 VHD 为例)
- diskpart.exe 启动,加载
vdisk.dll。 - 通过
ole32.dll::CoCreateInstance实例化 VDS 服务 COM 对象(vdisk.dll 内的客户端存根)。 - 客户端存根通过
rpcrt4.dll发起本地 RPC,连接vds.exe服务进程。 - 调用
IVdsVirtualDisk::Create接口,传入 VHD 路径、大小、类型参数;RPC 请求序列化发送给 vds.exe。 - vds.exe 服务端接收请求,执行参数校验,下发 IOCTL 至内核
vdisk.sys驱动,在内核层完成 VHD/VHDX 文件创建。 - 内核驱动完成虚拟磁盘操作,执行结果回传给 vds.exe。
- vds.exe 把执行状态、错误码通过 RPC 回传给 vdisk.dll 客户端。
- vdisk.dll 转换 HRESULT,返回给 diskpart.exe。
- 业务完成,释放 COM 对象。
关键特征:全部真正磁盘工作发生在 vds.exe 与内核;vdisk.dll 仅做参数封装、RPC 转发、错误转换。
六、边界(约束、坑点、失效条件)
1 VDS 服务启停边界
VDS 服务默认手动启动;第一次客户端 COM 调用触发服务启动;停止 vds.exe 会终止正在进行的磁盘任务;已经挂载的 VHD 设备不受影响,内核 vdisk.sys 继续维持设备。
2 COM‑RPC 通信边界
DCOM 安全权限被篡改,即使 vds.exe 进程正常运行,vdisk.dll 的 CoCreateInstance 依然失败,返回 RPC 相关错误。VDS 只支持本机本地调用,不支持跨机器远程 RPC 调用。
3 接口能力边界
- vdisk.dll(VDS)支持 VHD1/VHDX,但VDS 不支持 VHDX 的动态块拷贝、快照导出;该能力属于
vdisklib.dll虚拟磁盘 API。 - VDS 对 ReFS 虚拟磁盘支持有限;新版 Windows 逐步弱化 VDS,推荐使用Storage Management API(Win32)替代 VDS。
4 进程崩溃边界
调用 diskpart.exe 崩溃退出,vdisk.dll 被卸载;已经提交给 vds.exe 的任务会继续执行;只有客户端会话对象销毁。
5 版本淘汰边界
VDS(vdisk.dll/vds.exe)属于遗留组件;微软文档标记 VDS 为弃用,新开发应当使用 Win32 Storage Management API。Server 2022 仍然保留用于兼容旧工具。
6 常见故障现象
CoCreateInstance 0x80040154:VDS 服务未运行 / COM 注册损坏。- 返回 0x80070005 E_ACCESSDENIED:缺少管理员权限。
- VDS 服务卡死:diskpart 挂起,vdisk.dll 调用全部超时,需要重启 vds 服务。
高频误区
- ❌误区:vdisk.dll 直接操作 VHDX 文件;✅真相:VHDX 解析、块 IO 在内核 vdisk.sys;vdisk.dll 只是 RPC 转发层。
- ❌误区:disksnapshot.exe 依赖 vdisk.dll;✅真相:disksnapshot 使用
vdisklib.dll块拷贝接口,与 vdisk.dll 无关。 - ❌混淆
vdisk.dll和vdisk.sys;✅vdisk.dll 用户态 COM 客户端;vdisk.sys 内核虚拟磁盘驱动。
dmutil.dll 完整解构
dmutil.dll:Disk Management Utility DLL,磁盘管理实用库,属于 Windows Logical Disk Manager (LDM,逻辑磁盘管理器) 组件,专门负责动态磁盘、磁盘数据库 (LDM 数据库)、卷集、镜像卷、RAID‑5、跨区卷的用户态工具库;为dmadmin.exe、diskmgmt.msc、diskpart.exe提供 LDM 底层封装接口。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
dmutil.dll 用户态 DLL,无内核代码,是 LDM 逻辑磁盘管理器的用户态工具层,不直接操作内核驱动,负责解析、修改磁盘上私有 LDM 数据库(磁盘最后几个扇区存储 LDM 元数据库)。
- 封装 LDM 数据库读写 API:读取物理磁盘末尾扇区的 LDM 私有数据库,解析磁盘组、磁盘记录、分区记录、卷对象、 plex(镜像副本)、RAID‑5 条带元数据。
- 向上提供导出函数:创建动态磁盘、转换基本磁盘↔动态磁盘、创建镜像 / 跨区 / 条带 / RAID‑5 卷、修复 LDM 数据库、导入外部磁盘组、元数据校验。
- 和 LDM 服务进程
dmadmin.exe通信;dmadmin 再向下与内核驱动dmio.sys交互。 - 将 LDM 数据库解析错误、磁盘 IO 错误转换为 Win32 错误码,返回上层调用者。
分层定位(LDM 完整栈)
- 上层:diskmgmt.msc 磁盘管理 MMC、diskpart.exe
- ↓
- dmutil.dll(本组件:LDM 数据库解析、高层工具 API)
- ↓IPC / 本地 RPC
- dmadmin.exe(LDM 管理服务进程)
- ↓IOCTL
- dmio.sys(内核 LDM 驱动,动态磁盘 IO 虚拟化)
- ↓
- disk.sys 磁盘类驱动
区分
dmutil.dll:用户态,操作磁盘上 LDM 元数据库,高层工具 API;dmadmin.exe:LDM 服务进程;dmio.sys:内核驱动,实现动态磁盘卷 IO、镜像、RAID5 逻辑;dmdskmgr.dll:磁盘管理 MMC snap‑in 组件,调用 dmutil.dll。
重要:基本磁盘(普通 MBR/GPT 分区)不使用 LDM、不加载 dmutil.dll;只有动态磁盘才会用到整套 LDM 组件。
二、依赖文件
表格
| 文件名 | 类型 | 角色说明 |
|---|---|---|
dmutil.dll |
用户态 DLL | LDM 磁盘管理工具库,解析 / 修改磁盘 LDM 数据库 |
dmadmin.exe |
服务进程 | Logical Disk Manager Administrative Service;dmutil.dll 的后端服务 |
dmio.sys |
内核驱动 | LDM 内核驱动,动态磁盘 IO 虚拟化,处理 plex、RAID‑5、镜像 |
disk.sys |
磁盘类驱动 | 物理磁盘底层内核驱动 |
kernel32.dll / ntdll.dll |
系统库 | 打开物理磁盘设备,执行原始磁盘读写 |
ole32.dll |
COM 库 | 部分磁盘管理 COM 封装依赖 |
注册表配置
HKLM\SYSTEM\CurrentControlSet\Services\dmadmin
HKLM\SYSTEM\CurrentControlSet\Services\dmio
dmadmin 服务配置,dmio 内核驱动参数。
LDM 数据库物理存放位置:动态磁盘末尾保留扇区,私有元数据库,普通分区工具不可见。
三、依赖关系
完整调用依赖链
diskpart.exe / diskmgmt.msc
↓加载 dmutil.dll
↓IPC / RPC → dmadmin.exe(LDM服务进程)
↓下发IOCTL控制码
↓dmio.sys(内核LDM驱动)
↓disk.sys物理磁盘驱动
- dmadmin.exe 强服务依赖
dmutil.dll本身不直接下发 IOCTL 给dmio.sys;所有内核操作,必须通过dmadmin.exe中转。 dmadmin 服务启动类型:手动;操作动态磁盘时自动拉起;dmadmin 未运行,dmutil.dll 绝大多数修改接口调用失败。 - 权限依赖 几乎全部 dmutil.dll 导出 API 需要管理员权限;需要打开物理磁盘原始设备句柄
\\.\PhysicalDriveN;普通用户仅可部分只读查询。 - 磁盘介质依赖
- 仅对动态磁盘生效;基本 MBR/GPT 磁盘,LDM 数据库不存在,dmutil.dll 执行返回错误。
- LDM 支持 MBR 动态磁盘、GPT 动态磁盘;但 GPT 动态磁盘有额外兼容性边界。
- 版本绑定
dmutil.dll、dmadmin.exe、dmio.sys版本严格匹配;禁止单独拷贝 dmutil.dll 跨系统使用;LDM 磁盘数据库格式随 Windows 大版本有微小变更。 - 进程内存边界 dmutil.dll 加载到调用进程(diskpart.exe/mmc.exe);真正内核 IO 运行在 dmadmin.exe 与内核 dmio.sys。
上层调用进程崩溃退出,dmutil.dll 卸载;已经提交给 dmadmin 的任务会继续在内核侧执行。
- 和 VDS/vdisk.dll 关系
vdisk.dll(VDS)内部会间接调用dmutil.dll处理动态磁盘;VDS 是上层 COM 封装,dmutil.dll 是 LDM 底层实现。 - 和 VSS 组件解耦 dmutil.dll 与 vssapi.dll/vssvc.exe/volsnap.sys 无直接依赖;动态磁盘卷同样可以做 VSS 快照,属于两套独立子系统叠加。
四、配套链
上层调用者(消费 dmutil.dll)
diskmgmt.msc磁盘管理控制台(mmc.exe 加载 dmdskmgr.dll,dmdskmgr 调用 dmutil.dll)diskpart.exe:convert dynamic、create volume(mirror/stripe/raid5)命令底层调用 dmutil.dll- VDS(vdisk.dll):处理动态磁盘时内部调用 dmutil.dll
- 旧版第三方磁盘管理工具
运维配套命令
:: 查看LDM管理服务状态
sc query dmadmin
:: diskpart动态磁盘操作
diskpart
convert dynamic
create volume mirror
dmutil.dll 关键导出功能
- LdmOpenDiskGroup:打开磁盘组、读取 LDM 数据库
- LdmCreateDynamicDisk:转换基本磁盘→动态磁盘
- LdmCreatePlexVolume:创建镜像 plex 副本
- LdmCreateRaid5Volume:创建 RAID‑5 动态卷
- LdmImportDiskGroup:导入外来磁盘组
- LdmRepairDatabase:LDM 数据库修复校验
注意:这些是内部未公开导出函数,微软不提供官方 SDK 头文件;应用层一般不直接调用 dmutil.dll,通过 VDS 或者 diskpart 间接使用。
五、逻辑链路(完整时序示例:基本磁盘转换为动态磁盘)
- diskpart.exe 启动,加载
dmutil.dll。 - dmutil.dll 调用接口打开物理磁盘原始设备
\\.\PhysicalDriveX,读取磁盘末尾扇区,检测是否存在 LDM 数据库。 - dmutil.dll 通过 IPC/RPC 连接
dmadmin.exe服务进程。 - dmutil.dll 向 dmadmin 下发 “转换为动态磁盘” 任务参数。
- dmadmin.exe 接收任务,校验磁盘状态;调用内核 IOCTL,通知
dmio.sys准备接管磁盘。 - dmadmin 执行原始磁盘写:在磁盘末尾扇区写入 LDM 私有元数据库,标记磁盘为动态磁盘。
- dmio.sys 内核驱动重新枚举磁盘设备,加载 LDM 磁盘组。
- dmadmin 把执行结果、错误码回传给 dmutil.dll。
- dmutil.dll 转换为 Win32 错误码返回 diskpart.exe。
- diskpart 输出执行结果。
时序关键点:LDM 元数据库写操作发生在用户态 dmadmin;IO 虚拟化逻辑在内核 dmio.sys。dmutil.dll 只做参数封装、数据库解析、任务下发。
六、边界(约束、坑点、失效条件)
1 功能边界:仅动态磁盘
dmutil.dll 整套能力只针对 LDM 动态磁盘;普通 GPT/MBR 基本磁盘完全不触发该组件。
Windows 现代推荐:不再使用动态磁盘;改用存储池 Storage Spaces替代 LDM 动态磁盘。LDM 属于遗留组件。
2 磁盘组边界
LDM “磁盘组” 概念:多块动态磁盘属于同一个磁盘组;dmutil.dll 负责磁盘组导入 / 导出。跨机器移动动态磁盘需要执行导入磁盘组,否则卷无法识别。
3 故障‑LDM 数据库损坏边界
磁盘末尾扇区损坏,LDM 数据库损坏:dmutil.dll 读取数据库失败,动态磁盘显示 “无效”;可调用 LdmRepairDatabase 尝试修复;修复失败卷数据无法被 LDM 识别。
4 服务启停边界
- dmadmin 服务停止:正在执行的动态磁盘配置任务中止;已经存在的动态卷 IO 读写不受影响,dmio.sys 内核驱动继续工作。
- dmadmin 只是配置管理服务;IO 路径完全在内核 dmio.sys,dmadmin 停止业务卷仍然可读可写。
5 硬件兼容性边界
- 动态磁盘不支持可移动 U 盘、SD 卡;dmutil.dll 拒绝转换。
- 某些 RAID 卡、存储虚拟化层下 LDM 动态磁盘会出现元数据库异常。
6 弃用边界(重要)
LDM(dmutil.dll/dmadmin.exe/dmio.sys)为遗留技术;微软不再推荐新部署动态磁盘;现代 Windows 使用 Storage Spaces(存储空间)替代。
- Server 2022、Win11 仍然保留 LDM 用于兼容旧环境;但不再新增功能。
- 存储空间使用完全另一套组件,不依赖 dmutil.dll。
7 常见故障现象
- diskpart convert dynamic 报错:dmadmin 服务未启动 / 缺少管理员权限 / 磁盘为可移动介质。
- 磁盘管理显示 “无效动态磁盘”:磁盘末尾 LDM 数据库扇区损坏,dmutil.dll 解析元数据失败。
- 跨机器迁移动态磁盘,卷不显示:需要执行磁盘组导入,dmutil.dll 未识别外来磁盘组。
高频认知误区
- ❌误区:dmutil.dll 直接操作内核 dmio.sys;✅真相:必须经由 dmadmin.exe 服务进程中转。
- ❌误区:基本 GPT 磁盘会加载 dmutil.dll;✅真相:只有动态磁盘才使用 LDM 整套组件。
- ❌误区:停止 dmadmin 服务会导致动态磁盘卷无法读写;✅真相:dmadmin 仅做配置管理;IO 路径在内核 dmio.sys,卷读写继续工作。
rpcss.dll 完整解构
rpcss.dll:RPC Subsystem DLL,远程过程调用子系统库,Windows DCOM/RPC 核心组件;是 RPCSS 服务 (rpcss.exe) 的核心模块,实现本地 / 远程 RPC 端点映射、对象注册、COM 类工厂解析、DCOM 激活。几乎所有 Windows 跨进程 COM‑RPC(vssvc、swprv、vdisk、dmadmin、WMI、DCOM)底层都依赖 rpcss.dll。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
rpcss.dll 主要加载在系统服务进程 rpcss.exe(DCOM Server Process Launcher,DCOM 服务进程启动器),也可被部分客户端进程加载;是 RPC 端点映射器 (Endpoint Mapper) 与 COM 对象激活调度器。
- RPC 端点映射服务(Endpoint Mapper,EPM) 服务端程序注册 RPC 接口时,把「RPC 接口 UUID + 传输端点(LRPC/TCP/HTTP)」注册到 rpcss.dll 维护的内存数据库;客户端查询 EPM,拿到服务端通信端点,建立 RPC 会话。
- 本地进程:LRPC(Local RPC,ALPC 底层)
- 网络:TCP‑RPC、NP 管道 RPC、HTTP RPC。
- DCOM 对象激活调度 处理
CoCreateInstanceEx跨机器 / 跨进程 COM 对象激活请求:读取注册表 CLSID/AppID 配置,决定:- 激活在现有进程、启动新进程、启动 COM + 组件、远程机器 DCOM 激活;
- 权限校验(COM 安全、AppID 访问权限、启动权限)。
- COM 代理 / 存根 (Proxy‑Stub) 管理 加载接口代理 DLL,封送 / 解封送跨进程参数;处理接口 ID (IID) 解析。
- RPC 安全封装 集成 SSPI 安全包(NTLM、Kerberos、Schannel),完成 RPC 调用身份认证、模拟级别、访问校验。
分层定位
- 上层应用:各类 COM‑RPC 客户端(vssapi.dll、vdisk.dll、WMI、应用程序
CoCreateInstance) - ↓ RPC 运行时
rpcrt4.dll - ↓ rpcss.dll(rpcss.exe 进程内部,EPM 端点映射 + DCOM 激活调度)
- ↓ 传输层:ALPC (LRPC) / TCP / NamedPipe
- ↓ 内核:
rpcrt4.sysRPC 内核传输驱动
关键区分
rpcrt4.dll:客户端 RPC 运行时,几乎所有进程都会加载,负责封送 RPC 参数、发起调用。rpcss.dll:RPCSS 服务端核心,主要运行于rpcss.exe,负责端点映射、DCOM 对象激活、安全策略校验。rpcss.exe:DCOM Server Process Launcher 服务宿主进程,加载 rpcss.dll。
二、依赖文件
表格
| 文件名 | 类型 | 角色说明 |
|---|---|---|
rpcss.dll |
DLL | RPCSS 服务核心模块,EPM 端点映射器、DCOM 激活逻辑,驻留 rpcss.exe |
rpcss.exe |
服务宿主进程 | DCOM Server Process Launcher,加载运行 rpcss.dll,SYSTEM 权限 |
rpcrt4.dll |
RPC 客户端运行时 | 所有 COM‑RPC 客户端进程加载;RPC 参数封送,发起 RPC 请求 |
rpcrt4.sys |
内核 RPC 驱动 | LRPC (ALPC)、TCP RPC 内核传输 |
ole32.dll |
COM 库 | CoCreateInstance 上层 COM API,内部调用 rpcrt4.dll,最终请求 rpcss.dll 做激活 |
secur32.dll |
SSPI 安全接口 | NTLM/Kerberos 身份认证,rpcss.dll 做 DCOM 权限校验依赖 |
注册表关键配置
HKLM\SYSTEM\CurrentControlSet\Services\RpcSs # RpcSs服务本身
HKLM\SOFTWARE\Classes\CLSID\{CLSID} # COM类ID
HKLM\SOFTWARE\Classes\AppID\{APPID} # DCOM应用ID(启动、访问权限)
HKLM\SOFTWARE\Microsoft\Ole # 系统级DCOM全局配置
三、依赖关系
完整调用依赖链
客户端进程(如vssapi.dll所在进程)
↓ ole32.dll::CoCreateInstance
↓ rpcrt4.dll(客户端RPC运行时)
↓ LRPC/ALPC内核通信
rpcss.exe 【SYSTEM】加载 rpcss.dll
├─ 端点映射数据库查询
├─ 读取CLSID/AppID注册表,DCOM权限校验
└─ 启动/连接目标COM服务进程(vds.exe、vssvc.exe、dmadmin.exe、wmiprvse.exe)
↓ 返回服务端LRPC通信端点
客户端rpcrt4.dll → 直接与目标COM服务进程建立RPC会话
- 系统关键服务强依赖
RpcSs(DCOM Server Process Launcher)是 Windows核心关键服务,启动类型:自动;不能禁用,禁用后绝大多数 COM 服务直接瘫痪。
vssvc.exe、vds.exe、dmadmin.exe、WMI、打印后台处理程序、事件日志全部依赖 RpcSs。
- 进程加载边界
rpcss.dll主要运行在rpcss.exe;部分客户端场景也会被加载到客户端进程;端点映射器 EPM 实例只存在 rpcss.exe 内。rpcrt4.dll:几乎每一个 Windows 进程都会加载。
- 权限依赖
- rpcss.exe 以
NT AUTHORITY\SYSTEM运行;DCOM 激活时依据 AppID ACL 校验调用方的启动权限、访问权限;权限不足返回E_ACCESSDENIED(0x80070005)。
- 传输依赖
- 本机本地 COM:底层 LRPC(ALPC,高级本地过程调用,内核 rpcrt4.sys),不走 TCP 网络。
- 跨机器 DCOM:使用 TCP 135 端口(RPC 端点映射器)+ 动态端口。
- 版本绑定
rpcss.dll、rpcrt4.dll、rpcrt4.sys版本必须系统匹配;不支持单独拷贝替换 rpcss.dll。 - 和前面存储组件关系
vssapi.dll/vds/dmutil.dll 全部依靠 ole32 → rpcrt4 → rpcss.dll 完成跨进程 COM 激活: 客户端不会直接连接 vssvc.exe,而是向 rpcss.dll 请求:“请激活 VSS COM 对象”,rpcss 负责拉起 / 找到 vssvc.exe,返回通信端点。
四、配套链
上层调用组件(全部依赖 rpcss.dll 能力)
- 系统 COM 子系统:
ole32.dll,所有CoCreateInstance跨进程 / 远程 COM 对象。 - VSS 卷影副本:
vssapi.dll请求激活 vssvc.exe COM 对象。 - VDS 虚拟磁盘服务:
vdisk.dll请求激活 vds.exe。 - LDM 磁盘管理:
dmutil.dll请求激活 dmadmin.exe。 - WMI:wmiprvse.exe DCOM 激活。
- DCOM 远程组件、打印机服务、事件日志服务。
运维配套命令
:: 查看RpcSs服务状态
sc query RpcSs
:: 查看DCOM组件安全配置
dcomcnfg.exe
:: 查看本机RPC注册端点
rpcdump.exe
rpcss.dll 核心能力模块
- EPM EndPoint Mapper:RPC 端点注册、查询数据库。
- DCOM Activator:COM CLSID/AppID 解析、进程激活、安全 ACL 校验。
- RPCSS 安全层:SSPI 身份上下文管理。
五、逻辑链路(时序示例:客户端 CoCreateInstance 激活 VSS COM 对象)
- 客户端进程(例如 disksnapshot.exe)调用
ole32.dll::CoCreateInstance请求 VSS 的 CLSID。 - ole32 委托
rpcrt4.dll(客户端 RPC 运行时)发起 LRPC 调用,向rpcss.exe(rpcss.dll)发送 DCOM 激活请求。 rpcss.dll接收激活请求:- 查询注册表 CLSID,找到对应的 AppID。
- 读取 AppID 的启动权限 ACL,校验调用方是否有权限启动该 COM 组件。
- 查询 EPM 数据库:vssvc.exe 是否已经在运行,是否已经注册 VSS RPC 接口端点。
- 如果 vssvc.exe 未运行:rpcss.dll 启动 vssvc.exe 服务进程;等待 vssvc 内部完成 COM 接口注册到 EPM (rpcss.dll)。
- rpcss.dll 把 vssvc 的 LRPC 通信端点句柄返回给客户端 rpcrt4.dll。
- 客户端 rpcrt4.dll 直接和 vssvc.exe 建立 LRPC RPC 会话,后续业务 RPC 不再经过 rpcss.dll。
- 客户端调用 VSS 业务 COM 接口,执行快照逻辑。
⚠️关键点:rpcss.dll只负责「对象激活 / 端点查询」;一旦两端会话建立,后续业务通信不再经过 rpcss.exe/rpcss.dll。
六、边界(约束、坑点、失效条件)
1 服务生死边界
- RpcSs 服务停止:整个系统 COM‑RPC 跨进程激活全部失效;vss、vds、wmi 全部不可用;大量系统服务启动失败;Windows 无法正常运行。
- rpcss.exe 崩溃:所有待 DCOM 激活全部失败;已经建立好 RPC 会话的现存 COM 会话可以继续工作;只有新的激活请求失败。
2 本地 vs 远程边界
- 本机 COM:LRPC (ALPC),端口无关,内核 IPC,速度快。
- 远程 DCOM:目标机器 TCP 135(RPC 端点映射器由 rpcss.dll 监听),返回动态 TCP 端口;防火墙需要放行 135+DCOM 动态端口范围。
3 DCOM 安全 ACL 边界(高频故障)
AppID 配置 ACL 错误(启动权限、访问权限):rpcss.dll 在校验阶段直接拒绝激活,返回 0x80070005 E_ACCESSDENIED。
很多 VSS、WMI 故障根源不是业务服务本身,而是 DCOM AppID 权限被篡改,rpcss.dll 拦截激活。
4 EPM 端点映射数据库边界
EPM 数据库保存在 rpcss.exe 内存;重启 RpcSs 服务全部注册信息丢失,各个 COM 服务会重新注册接口 UUID;磁盘不持久化 EPM 数据库。
5 协议边界
rpcss.dll 支持:LRPC (ALPC)、TCP、NamedPipe、HTTP RPC;不处理业务逻辑,只做调度。
6 常见故障现象
0x80040154 REGDB_E_CLASSNOTREG:CLSID 未注册,rpcss.dll 找不到 COM 类。0x80070005 E_ACCESSDENIED:rpcss.dll 做 DCOM 启动 / 访问 ACL 校验不通过。- RPC 服务器不可用
0x800706BA:rpcss.exe 未运行或远程机器 135 端口不通。 - 部分 COM 服务进程运行正常,但外部无法连接:服务没有把 UUID 注册进 rpcss.dll 的 EPM 端点映射器。
高频认知误区
- ❌误区:所有 RPC 调用流量都经过 rpcss.dll;✅真相:rpcss.dll只管激活与端点查询;会话建立完成,业务 RPC 直接客户端‑服务端点对点。
- ❌rpcrt4.dll 就是 rpcss.dll;✅rpcrt4.dll 是客户端 RPC 库,每个进程加载;rpcss.dll 驻留 rpcss.exe,负责 DCOM 激活和 EPM。
- ❌停止 vssvc.exe 会影响 rpcss;✅单向依赖:vssvc 依赖 rpcss,rpcss 不依赖 vssvc。
ole32.dll 完整解构
ole32.dll:COM / DCOM / OLE 核心运行时库,Windows 组件对象模型用户态核心实现;提供CoInitializeEx、CoCreateInstance整套 COM API;负责 COM 对象生命周期、注册表 CLSID 解析、代理‑存根封送、DCOM 激活调度、线程模型管理;几乎所有跨进程 COM 调用(VSS/VDS/WMI/DCOM)上层入口全部来自 ole32.dll博客园。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
ole32.dll 用户态 DLL,无内核代码;每一个使用 COM 的进程都会加载该 DLL,客户端进程、COM 服务进程(vssvc.exe、vds.exe、dmadmin.exe、dllhost.exe)均会载入Microsoft ...。
- COM 库初始化管理
CoInitializeEx:初始化当前线程 COM 环境,选择线程模型 STA 单线程单元 / MTA 多线程单元 / NA 中性单元;维护线程‑对象亲和关系,校验 COM 线程模型契约;未初始化直接调用 COM API 全部失败Microsoft ...。 - COM 对象激活(CoCreateInstance / CoGetClassObject / CoCreateInstanceEx)
- 读取注册表
HKCR\CLSID\{GUID},解析InprocServer32(进程内 DLL 组件)、LocalServer32(EXE 外进程组件)、DllSurrogate(dllhost 隔离); - 进程内组件:直接
LoadLibrary加载 COM DLL,调用DllGetClassObject拿到类工厂IClassFactory,创建对象; - 跨进程 / 远程 DCOM 组件:封装 DCOM 激活请求,向下调用
rpcrt4.dll,通过 LRPC/TCP 发送至rpcss.exe(rpcss.dll)请求对象激活;接收返回代理接口指针返回上层调用者Microsoft ...。
- 读取注册表
- Proxy‑Stub 参数封送 / 解封送(Marshal / Unmarshal) 跨进程 / 跨机器 COM 不能直接传递内存指针;ole32 负责:
- 根据注册表
Interface\{IID}加载配套代理存根 DLL; - 将 COM 接口入参按 NDR 网络数据表示序列化;RPC 返回后反序列化,提供代理对象给客户端;客户端调用代理,由代理转发 RPC 请求至真实服务对象博客园。
- 根据注册表
- COM 对象生命周期与引用计数 管理
IUnknown::AddRef / Release引用计数;处理对象断开、代理销毁;跨进程场景维护存根生命周期;处理 MTA/STA 单元间接口封送 (列集 / 散集)。 - DCOM 安全层封装 封装 SSPI 安全调用;读取
AppID注册表访问权限、启动权限 ACL;把安全参数向下透传给 RPC 层;远程 DCOM 激活时参与身份、权限校验;返回E_ACCESSDENIED安全错误码博客园。 - OLE 复合文档支持 OLE 对象链接嵌入,
OleLoad等 API,用于 Office 复合文档、对象嵌入;现代 Windows 该部分能力部分迁移至combase.dll。
分层定位完整栈
应用层API(CoCreateInstance)
↓
ole32.dll(本组件:COM运行时,激活、线程模型、封送、安全上层)
↓
rpcrt4.dll(RPC客户端运行时,NDR序列化、传输会话)
↓ LRPC(ALPC)/TCP/NamedPipe
rpcss.exe(rpcss.dll)(RPC端点映射 + DCOM激活调度)
↓
目标COM服务进程(vssvc.exe / vds.exe / dllhost.exe)
版本区分:Win10/Win11 引入
combase.dll,现代 COM 部分逻辑迁移到 combase.dll;ole32.dll 保留向后兼容,内部大量转发到 combase.dll博客园。oleaut32.dll:COM 自动化,IDispatch、VARIANT 变体类型支持,与 ole32 配合使用。
二、依赖文件
表格
| 文件名 | 类型 | 角色说明 |
|---|---|---|
ole32.dll |
用户态 DLL | COM/DCOM/OLE 核心运行时库 |
oleaut32.dll |
用户态 DLL | COM 自动化(IDispatch、VARIANT) |
combase.dll |
用户态 DLL | Win10 + 现代 COM 运行时,ole32 内部转发 |
rpcrt4.dll |
用户态 DLL | RPC 客户端运行时,NDR 序列化,会话传输 |
rpcss.dll(rpcss.exe 内) |
服务端模块 | RPC 端点映射、DCOM 进程激活调度 |
advapi32.dll |
用户态 DLL | 注册表读写、ACL 安全描述符解析 |
secur32.dll / sspicli.dll |
用户态 DLL | SSPI NTLM/Kerberos 身份认证 |
ntdll.dll |
用户态底层库 | ALPC/LRPC 系统调用、内存管理 |
ws2_32.dll |
用户态 DLL | 远程 DCOM TCP 网络传输 |
注册表关键配置
HKCR\CLSID\{CLSID_GUID} # COM类注册信息
HKCR\Interface\{IID_GUID} # 接口代理‑存根DLL注册
HKCR\AppID\{APPID_GUID} # DCOM安全、启动权限、RunAs身份
HKLM\SOFTWARE\Microsoft\Ole # 系统全局OLE/DCOM配置
三、依赖关系
完整调用依赖链(跨进程 COM 激活示例)
客户端进程(disksnapshot.exe)
↓ 调用 CoCreateInstance
ole32.dll
├─ CoInitializeEx线程环境校验
├─ 读取CLSID注册表,判断是inproc/out‑of‑process
└─ 封装DCOM激活请求 → rpcrt4.dll
↓ LRPC(ALPC)内核通信
rpcss.exe(rpcss.dll)
├─ 查询EPM端点映射数据库
├─ AppID ACL安全校验
└─ 启动/定位COM服务进程(vssvc.exe)
↓ 返回LRPC通信端点
rpcrt4.dll接收端点,生成COM代理对象
↓ 返回代理接口指针给 ole32.dll
ole32.dll把代理指针返回上层应用;后续业务RPC不再经过ole32的激活路径。
-
进程加载特性 ole32.dll 被每一个使用 COM 的进程加载;客户端、COM 服务端进程均加载;不是单独服务进程,是进程内 DLL。
rpcss.dll 只驻留在 rpcss.exe;ole32.dll 每个进程一份实例。
- 双向依赖:ole32.dll ↔ rpcrt4.dll ole32 依赖 rpcrt4 做 RPC 传输、NDR 序列化;rpcrt4 向上回调 ole32 完成 COM 代理‑存根调度博客园。
- 权限依赖
- 进程内 Inproc COM:继承调用进程权限;
- Out‑of‑process DCOM 组件:激活权限由 AppID ACL 控制;ole32/rpcss 共同校验启动权限;普通用户无法启动高权限 DCOM 组件返回
0x80070005 E_ACCESSDENIED。
- 线程模型强约束 ole32 严格执行 STA/MTA 契约;STA 组件 COM 对象只能被创建线程调用;跨线程调用必须经过 ole32 接口列集;违反线程模型直接造成死锁、内存损坏、随机崩溃。
- 版本绑定 ole32.dll、combase.dll、rpcrt4.dll、rpcss.dll 版本必须系统匹配;禁止外部拷贝替换 ole32.dll,会造成整个 COM 子系统崩溃。
- 和之前系统组件的关系
- vssapi.dll/vdisk.dll/dmutil.dll:上层 COM 客户端库,内部全部调用 ole32.dll 的
CoCreateInstance; - vssvc.exe、vds.exe、dmadmin.exe:COM 服务进程,自身也加载 ole32.dll,用于注册 COM 类工厂到 rpcss 端点映射器。
- vssapi.dll/vdisk.dll/dmutil.dll:上层 COM 客户端库,内部全部调用 ole32.dll 的
四、配套链
上层调用组件(全部依赖 ole32.dll)
- 系统 COM 客户端库:
vssapi.dll、vdisk.dll、dmutil.dll、WMI 客户端 wbemcli.dll。 - 系统工具:
diskpart.exe、diskmgmt.msc、dcomcnfg.exe、PowerShell COM 对象。 - COM 服务进程:
vssvc.exe、vds.exe、dmadmin.exe、dllhost.exe(COM Surrogate)、wmiprvse.exe。 - 应用程序:Office、Shell 扩展、ActiveX 控件,所有使用 COM 的第三方程序。
运维配套命令
:: DCOM配置管理器,修改AppID安全ACL
dcomcnfg.exe
:: 查看RPC端点映射
rpcdump.exe
# 系统文件修复,ole32.dll损坏时
sfc /scannow
ole32.dll 核心导出 API
CoInitializeEx:COM 库线程初始化CoCreateInstance:创建 COM 对象 (本地)CoCreateInstanceEx:创建 COM 对象 (支持远程 DCOM)CoGetClassObject:获取类工厂 IClassFactoryCoMarshalInterface/CoUnmarshalInterface:接口列集散集(跨进程指针传递)CoUninitialize:反初始化 COM 库
五、逻辑链路(时序示例:客户端创建 VSS COM 对象)
- 客户端进程调用
CoInitializeEx,ole32.dll 初始化本线程 COM 单元(STA/MTA)。 - 调用
CoCreateInstance(CLSID_VssSnapshotSet, ...)。 - ole32 读取注册表 CLSID,识别该 CLSID 为Out‑of‑process COM 服务器,对应 AppID。
- ole32 封装 DCOM 激活请求,调用 rpcrt4.dll 发起 LRPC 调用,请求 rpcss.exe 进行对象激活。
- rpcss.dll (rpcss.exe) 完成 ACL 校验;若 vssvc.exe 未运行则启动 vssvc.exe。
- vssvc.exe 内部加载 ole32.dll,注册 VSS COM 类工厂到 rpcss 的 EPM 端点映射数据库。
- rpcss 将 LRPC 通信端点返回客户端 rpcrt4.dll。
- rpcrt4.dll + ole32 共同生成COM 代理对象;代理对象伪装成本地接口指针返回上层调用。
- 上层调用 VSS 接口方法;调用进入 ole32 代理,再经由 rpcrt4 序列化,LRPC 发送至 vssvc.exe;服务端存根反序列化执行真实业务逻辑。
- 业务完成调用
Release;ole32 管理引用计数;最后调用CoUninitialize释放 COM 环境。
关键点:对象激活阶段依赖 rpcss.exe;会话建立完成之后业务 COM 调用不再经过 rpcss.exe,是客户端 ↔ vssvc.exe 点对点 LRPC 通信。
六、边界(约束、坑点、失效条件)
1 COM 线程模型边界(高频故障源)
- STA 单线程单元:COM 对象绑定创建线程;其他线程调用必须 ole32 列集;禁止跨线程直接调用接口指针;否则随机崩溃、死锁、堆损坏。
- MTA 多线程单元:对象需要自身实现线程安全,多线程可直接调用。
现象:ole32.dll 异常 0xc000041D,大多为线程模型违规、跨线程错误 Release。
2 In‑Proc / Out‑of‑Process 边界
- InprocServer32 (DLL 组件):加载到调用者进程内部;组件崩溃直接造成客户端进程崩溃;
- LocalServer32 / DllSurrogate (dllhost.exe):独立进程隔离;组件崩溃不会直接弄死客户端。
3 DCOM 远程激活边界
- 本机 COM:LRPC (ALPC) 内核 IPC,不使用 TCP 端口;
- 跨机器 DCOM:目标机器 TCP 135 端口 (rpcss 监听),返回动态 RPC 端口;防火墙必须放行 135 与 DCOM 动态端口范围。
4 注册表 CLSID/AppID 边界
- CLSID 缺失:返回
REGDB_E_CLASSNOTREG(0x80040154),ole32 找不到 COM 类; - AppID 启动 ACL 权限不足:rpcss 校验失败返回
E_ACCESSDENIED(0x80070005);故障根源经常不是服务本身,而是 DCOM 权限配置错误。
5 进程初始化边界
线程不调用
CoInitializeEx直接调用 COM API,ole32 直接返回失败;每个调用 COM 的线程必须初始化 / 反初始化 COM 库。
6 组件升级迁移边界
Win10/Win11,ole32 大量逻辑转发给combase.dll;部分老旧 OLE 复合文档 API 保留在 ole32.dll 用于兼容旧软件。
7 常见故障现象
0x80040154 REGDB_E_CLASSNOTREG:CLSID 未注册;ole32 读取注册表失败。0x80070005 E_ACCESSDENIED:DCOM AppID 启动 / 访问 ACL 校验拒绝。0x800706BA RPC服务器不可用:rpcss 服务未运行、远程 135 端口不通。- ole32.dll 访问冲突 0xc0000005:COM 组件内存损坏、线程模型违规、代理‑存根版本不匹配。
- 进程退出卡死在
CoUninitialize:COM 对象引用计数泄漏。
高频认知误区
- ❌误区:ole32.dll 运行在 rpcss.exe;✅ole32.dll 加载在每一个 COM 客户端与 COM 服务进程;rpcss.exe 内部运行 rpcss.dll。
- ❌rpcrt4.dll 等于 ole32.dll;✅ole32 是 COM 上层对象模型;rpcrt4 是底层 RPC 传输库,二者分工明确双向依赖。
- ❌CoCreateInstance 总是启动新进程;✅进程内 Inproc COM 直接 DLL 加载,不涉及 rpcss.exe。
- ❌远程 COM 调用流量全部经过 rpcss.exe;✅rpcss 仅负责激活与端点查询;会话建立完成后点对点通信。
combase.dll 完整解构
combase.dll:Windows 现代 COM 运行时库(COM Base),自 Windows 8 / Windows Server 2012 引入;是新一代 COM/DCOM 核心实现。Win10/Win11 中ole32.dll大量内部逻辑转发到combase.dll,承担COM 单元管理、对象激活、代理存根、生命周期、DCOM 安全、WinRT (Windows Runtime) 底层支撑;同时兼容传统 OLE‑COM,是现代 Windows COM 栈核心。 分析框架:底层原理|依赖文件|依赖关系|依赖关系|配套链|逻辑链路|边界
一、底层原理
combase.dll 用户态 DLL,无内核代码;所有使用 COM/WinRT 的进程都会加载;ole32.dll很多导出函数是薄包装,内部调用combase.dll实现。
- 现代 COM 单元模型实现 实现 STA / MTA / ASTA(异步单线程单元)/ NA 中性单元;重构线程‑对象亲和调度;提供异步 COM 调用基础设施;修复旧 ole32 时代部分死锁、消息循环缺陷。
CoInitializeEx、CoUninitialize在新版系统,ole32 直接转发到 combase 内部实现。 - COM 对象激活引擎
- 支持传统:InprocServer32、LocalServer32、DllSurrogate (dllhost.exe);
- 新增支持:WinRT 激活、打包应用 (MSIX) COM 注册、隔离 COM、注册 Free COM (无注册表 CLSID);
- 读取 CLSID/AppID;处理进程内加载、跨进程 DCOM 激活请求;把 DCOM 激活请求向下交给
rpcrt4.dll,经由 LRPC 发送rpcss.exe(rpcss.dll)完成进程启动、端点查询。
- Proxy‑Stub 列集 / 散集引擎重构 重构 NDR 序列化封装;支持传统 COM 接口,同时支持 WinRT 接口元数据;处理跨线程、跨进程、跨机器接口封送;支持异步接口调用模式,弥补旧 ole32 同步调用短板。
- 对象生命周期与引用计数管理 实现
IUnknown引用计数基础;处理代理 / 存根生命周期、断开连接、幽灵代理 (ghost proxy);COM 对象泄漏检测基础设施;处理单元边界对象迁移。 - DCOM 安全层 封装 SSPI;解析 AppID ACL、Capability 权限;支持容器化、MSIX 打包应用的 COM 安全隔离;把安全参数透传给 RPC 层;生成
E_ACCESSDENIED等标准 HRESULT。 - WinRT 底层支撑 WinRT (Windows Runtime) 构建在 combase 之上;
IInspectable接口、语言投影、元数据解析,底层由 combase 提供基础 COM 对象模型;WinRT 本质是COM 的超集。 - 兼容层转发
ole32.dll作为遗留 API 外壳,大量旧 OLE 接口(复合文档 OleLoad 等)保留在 ole32;现代 COM 路径全部下沉至 combase.dll。
完整分层栈
应用层:CoCreateInstance / WinRT RoActivateInstance
↓
ole32.dll(薄兼容外壳,新版大部分API转发)
↓
combase.dll(本组件:现代COM运行时核心,单元、激活、封送、安全、WinRT底座)
↓
rpcrt4.dll(RPC客户端运行时,NDR、LRPC/TCP传输会话)
↓ LRPC(ALPC)/TCP/NamedPipe
rpcss.exe(rpcss.dll) 端点映射 + DCOM进程激活调度
↓
目标COM/WinRT服务进程(vssvc.exe / dllhost.exe / 打包应用进程)
关键区分
ole32.dll:传统 OLE‑COM,保留复合文档、老旧 OLE 接口;大量逻辑转发 combase。combase.dll:Win8 + 现代 COM,重构内核,同时是 WinRT 运行时底座。oleaut32.dll:COM 自动化 IDispatch / VARIANT,与 combase 协同工作。
二、依赖文件
表格
| 文件名 | 类型 | 角色说明 |
|---|---|---|
combase.dll |
用户态 DLL | 现代 COM/WinRT 核心运行时库 |
ole32.dll |
用户态 DLL | 传统 OLE‑COM 兼容外壳,大量 API 转发 combase |
oleaut32.dll |
用户态 DLL | COM 自动化 IDispatch、VARIANT 变体 |
rpcrt4.dll |
用户态 DLL | RPC 客户端运行时,NDR 序列化、LRPC/TCP 会话 |
rpcss.dll(rpcss.exe) |
服务模块 | RPC 端点映射、DCOM 进程激活调度器 |
advapi32.dll |
用户态 DLL | 注册表读写、ACL 安全描述解析 |
secur32.dll / sspicli.dll |
用户态 DLL | SSPI NTLM/Kerberos 身份认证 |
ntdll.dll |
用户态底层 | ALPC 系统调用、内存管理、线程调度 |
winrt.dll |
用户态 DLL | WinRT 元数据、语言投影层,构建于 combase 之上 |
注册表关键配置
HKCR\CLSID\{CLSID_GUID}
HKCR\Interface\{IID_GUID}
HKCR\AppID\{APPID_GUID}
HKLM\SOFTWARE\Microsoft\Ole
HKLM\SOFTWARE\Microsoft\WindowsRuntime # WinRT元数据注册
三、依赖关系
调用依赖链(跨进程 COM 激活)
客户端进程
↓ CoCreateInstance (ole32.dll)
↓ 内部转发 → combase.dll
├─ COM单元环境校验
├─ 解析CLSID/AppID,区分Inproc / Out‑of‑process
└─ 封装DCOM激活请求 → rpcrt4.dll
↓ LRPC ALPC内核通信
rpcss.exe(rpcss.dll)
├─ EPM端点映射查询
├─ AppID ACL安全校验
└─ 启动/定位COM服务进程
↓ 返回LRPC通信端点
rpcrt4.dll接收端点,combase生成COM代理对象
↓ 代理指针向上返回 ole32 → 上层应用
- 进程加载边界
combase.dll加载在每一个 COM/WinRT 使用的进程内,不是独立服务进程;rpcss.dll 只驻留在 rpcss.exe。 - 依赖单向关系
ole32.dll→combase.dll(新版系统大量 API 转发)combase.dll→rpcrt4.dll(RPC 传输、NDR 序列化)combase.dll不直接和 rpcss.dll 通信;全部 RPC 请求经由 rpcrt4.dll 中转。
- 权限依赖
- Inproc 组件继承调用进程权限;
- Out‑of‑process DCOM:AppID ACL 校验由
rpcss.dll执行;combase 负责封装激活参数、接收返回代理。
- 线程模型强约束 combase 严格执行 STA/MTA/ASTA 契约;违规跨线程直接造成死锁、内存损坏、幽灵代理。新增ASTA 异步单线程单元,支持异步回调,旧 ole32 不具备。
- 版本绑定
combase.dll、ole32.dll、rpcrt4.dll、rpcss.dll必须系统版本匹配;禁止单独拷贝替换 combase.dll,会摧毁 COM+WinRT 整个子系统。 - 和已有系统组件关系
- VSS/VDS/DMutil:上层 COM 客户端,调用 ole32,最终落到 combase;
- dllhost.exe、wmiprvse.exe:COM 服务进程内部同样加载 combase.dll,注册类工厂到 rpcss 端点映射器;
- UWP/MSIX 打包应用:COM 隔离、无注册表 COM,完全依赖 combase 新能力。
四、配套链
上层调用组件
- 传统 COM 客户端:
vssapi.dll、vdisk.dll、dmutil.dll、WMI 客户端 wbemcli.dll;经由 ole32 转发 combase。 - WinRT / UWP / MSIX 应用:
RoActivateInstanceWinRT 激活 API 直接调用 combase。 - COM 服务进程:
vssvc.exe、vds.exe、dllhost.exe、wmiprvse.exe。 - 系统 Shell、设置、现代 Windows 应用。
运维配套命令
dcomcnfg.exe # DCOM AppID安全配置
sfc /scannow # 系统组件损坏修复
combase.dll 核心能力模块
- COM 单元调度器:STA / MTA / ASTA / NA 线程单元。
- 对象激活引擎:传统 CLSID + WinRT 隔离 COM 激活。
- Proxy‑Stub 列集引擎:传统 COM 接口 + WinRT IInspectable 接口序列化。
- 对象生命周期管理器:IUnknown 引用计数、幽灵代理、断开管理。
- DCOM 安全封装层:SSPI 参数封装,ACL 透传。
- WinRT 底层基座:IInspectable 对象模型基础。
五、逻辑链路(时序示例:Win11 客户端 CoCreateInstance 激活 VSS 对象)
- 客户端调用
CoInitializeEx,ole32 收到调用,直接转发至combase.dll,初始化本线程 COM 单元。 - 调用
CoCreateInstance(CLSID_VssSnapshotSet)。 - ole32 将参数转交 combase;combase 读取注册表 CLSID,识别为 Out‑of‑process COM,获取 AppID。
- combase 封装 DCOM 激活请求,调用 rpcrt4.dll 发起 LRPC 请求,发给 rpcss.exe。
- rpcss.dll 执行 ACL 校验;如 vssvc.exe 未运行,则启动 vssvc.exe。
- vssvc.exe 内部加载 ole32 → combase.dll;VSS 服务注册 COM 类工厂到 rpcss EPM 端点映射。
- rpcss 返回 vssvc.exe 的 LRPC 通信端点。
- rpcrt4.dll 接收端点,combase.dll 生成 COM 代理对象,代理接口指针逐层向上返回上层代码。
- 上层调用 VSS 接口方法;调用进入 combase 代理,rpcrt4 序列化,LRPC 发送 vssvc.exe;服务端 combase 存根反序列化执行业务。
- 业务完成调用
Release,combase 管理代理对象引用计数;调用CoUninitialize释放 COM 单元环境。
关键点:激活阶段依赖 rpcss.exe;会话建立后业务通信是客户端 ↔ vssvc.exe 点对点,不再经过 rpcss.exe。
六、边界(约束、坑点、失效条件)
1 ole32 与 combase 版本边界
- Win7 及更早:不存在 combase.dll,全部 COM 逻辑在 ole32.dll;
- Win8/Server2012 及以后:引入 combase.dll;ole32 保留作为兼容层外壳;旧 OLE 复合文档功能仍留在 ole32。
程序在 Win7 运行,不会加载 combase.dll。
2 ASTA 异步单元边界
combase 新增 ASTA(异步 STA),支持异步回调;旧 ole32 不支持 ASTA;老组件强行跑在 ASTA 会出现回调丢失、死锁。
3 隔离 COM / MSIX 边界
combase 支持无注册表 COM、打包应用隔离 COM;CLSID 信息存于应用包清单,不写入系统注册表;传统 dcomcnfg.exe 看不到隔离 COM 组件配置。
4 In‑Proc / Out‑of‑Process 边界
- InprocServer32:COM DLL 加载到调用进程;组件崩溃直接造成调用进程崩溃;
- LocalServer32 / DllSurrogate (dllhost.exe):独立进程隔离。
5 DCOM 远程边界
本机:LRPC (ALPC) 内核 IPC,不走 TCP; 跨机器 DCOM:目标机器 TCP135 (rpcss 监听)+ 动态端口;防火墙放行对应端口。
6 故障现象
0x80040154 REGDB_E_CLASSNOTREG:CLSID 不存在,combase 解析注册信息失败。0x80070005 E_ACCESSDENIED:rpcss 的 AppID ACL 校验拒绝;combase 仅透传请求。- 进程挂起卡死:ASTA/STA 线程模型误用,combase 调度死锁。
- UWP 应用 COM 调用失败:隔离 COM 清单配置错误,combase 无法定位激活类。
combase.dll 0xc0000005访问冲突:代理‑存根版本不匹配、跨线程非法调用接口指针、内存损坏。
高频认知误区
- ❌误区:combase.dll 替代 ole32.dll;✅不是完全替代,ole32 保留 OLE 遗留接口,现代 COM 路径转发 combase。
- ❌combase.dll 运行 rpcss.exe;✅combase.dll 加载在客户端 / 服务业务进程;rpcss.exe 运行 rpcss.dll,二者分工明确。
- ❌Win7 系统存在 combase.dll;✅Win7 无 combase.dll。
- ❌WinRT 是完全独立于 COM 的技术;✅WinRT 是 COM 的扩展,底层对象模型完全构建于 combase.dll。
DiskSnapshot(Windows Server 磁盘快照)完整解构
说明:DiskSnapshot 为 Windows Server 系列内置磁盘快照工具 / 能力,基于 VSS (Volume Shadow Copy Service) 卷影副本框架,把时间点卷快照导出为 VHD/VHDX 虚拟磁盘文件;区别于普通 VSS 卷影副本(仅本地卷内差异快照),DiskSnapshot 输出独立虚拟磁盘镜像文件。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界
一、底层原理
DiskSnapshot 不是独立全新快照内核,是VSS 上层应用工具链:
- 第一步调用 VSS COM 接口,对目标磁盘 / 卷创建时间点一致性卷影副本(Snapshot/Shadow Copy),借助
volsnap.sys内核过滤驱动完成 Copy‑On‑Write 写时复制,获取卷静态时间点视图。 - 在快照只读视图之上,执行块级拷贝,把整个卷块流导出为独立 VHD/VHDX 虚拟磁盘文件,输出的 VHDX 是脱离原系统的离线镜像,可挂载到其他 Windows 主机、Hyper‑V 虚拟机。
- 两种工作模式
- 模式 1:带 Writer(感知应用):通知 SQL、Exchange 等 VSS‑Writer,刷新缓存、冻结 IO,生成应用一致性快照再导出 VHDX。
- 模式 2:No‑Writer(裸磁盘快照):跳过所有应用 Writer,仅文件系统一致性,适合非数据库简单数据卷,速度更快,但数据库类会产生崩溃一致性镜像。
关键区分
- VSS 卷影副本:快照元数据与差异块存放在原卷
System Volume Information,不能直接脱离原主机。 - DiskSnapshot:在 VSS 快照基础上,块复制生成独立 VHD/VHDX 文件,可以拷贝到别的机器直接挂载使用。
二、依赖文件
| 组件名称 | 文件名 | 类型 | 作用 |
|---|---|---|---|
| DiskSnapshot 主程序 | disksnapshot.exe |
用户态可执行 | 磁盘快照主工具,调用 VSS COM,导出 VHD/VHDX |
| VSS 主服务进程 | vssvc.exe |
用户态服务进程 | 卷影副本协调服务,COM 接口宿主 |
| 软件快照提供程序 | swprv.dll |
用户态 DLL | 系统软件快照 Provider 实现 |
| 内核快照过滤驱动 | volsnap.sys |
内核驱动 | 实现 COW 写时复制,卷影副本内核 IO 拦截,快照卷只读视图提供 |
| RPC 远程调用 | rpcss.dll |
用户态 DLL | VSS 组件之间 COM‑RPC 通信基础 |
| 虚拟磁盘处理库 | vdisk.dll |
用户态 DLL | VHD/VHDX 虚拟磁盘文件创建、块写入、元数据管理 |
| 卷管理 API | dmutil.dll |
用户态 DLL | 获取磁盘、卷、分区布局信息,块枚举 |
| WMI | winmgmt服务 / wmiprvse.exe |
服务进程 | 部分 VSS Writer 依赖 WMI 环境 |
注册表关键存储:
HKLM\SYSTEM\CurrentControlSet\Services\VSS
HKLM\SYSTEM\CurrentControlSet\Services\VolSnap
保存 VSS、volsnap 驱动参数、快照配额、超时配置。
三、依赖关系
- 服务启动依赖链
RPCSS(RPC) → VSS(Volume Shadow Copy) → swprv(Software Shadow Copy Provider)
VSS 服务不运行,DiskSnapshot 直接报错,无法创建快照。
- 内核驱动依赖链
volsnap.sys存储过滤驱动挂载在 NTFS/ReFS 文件系统栈之上;必须 NTFS 或 ReFS,FAT32/exFAT 不支持 VSS 快照,DiskSnapshot 无法工作。 - 组件调用依赖
disksnapshot.exe→ VSS COM 接口 (IVssSnapshotMgmt) →vssvc.exe→ swprv.dll → 下发 IOCTL 到内核volsnap.sys拿到快照只读卷视图 → 调用vdisk.dll块拷贝写入 VHD/VHDX 文件。 - 权限依赖必须本地管理员权限;普通用户无法调用 VSS 创建快照、无法执行块级导出 VHDX。
- Writer 依赖(可选) 当不使用
‑nowriters参数,DiskSnapshot 会加载系统注册 VSS‑Writer(SQL、Exchange、NTDS 等),Writer 依赖 WMI、DCOM 环境。 - 存储依赖
- 创建 VSS 快照阶段:源卷必须预留 ShadowStorage 差异存储空间;
- 导出阶段:输出路径磁盘需要足够空闲空间存放完整 VHD/VHDX 镜像。
四、配套链
4.1 同体系配套工具
diskshadow.exe:Windows Server 内置交互式 VSS 脚本工具,管理卷影副本快照,可 expose 挂载快照卷,但不直接导出 VHDX。vssadmin.exe:查看 / 删除卷影副本,管理 ShadowStorage 快照存储配额。vshadow.exe:SDK 示例工具,创建持久快照。- Windows Server Backup:底层同样调用 VSS,备份输出为 VHDX,逻辑与 DiskSnapshot 同源。
4.2 命令示例(DiskSnapshot 典型用法)
# 创建应用一致性快照,C盘导出为C_Backup.vhdx
DiskSnapshot.exe C: D:\backup\C_Backup.vhdx
# No‑Writer模式,跳过应用写入器,文件系统一致性快照
DiskSnapshot.exe C: D:\backup\C_raw.vhdx /nowriters
4.3 上层配套
- PowerShell 可通过启动进程调用
disksnapshot.exe做脚本化批量快照导出; - Hyper‑V:生成的 VHDX 可直接附加给虚拟机;
- 挂载工具:
diskpart attach vdisk可把生成的 vhdx 离线挂载读取内容。
五、逻辑链路(完整时序)
disksnapshot.exe启动,校验管理员权限,读取源磁盘卷布局信息。- 请求 VSS COM 接口,发起创建快照集;RPC 通信交给
vssvc.exe。 - VSS 服务执行快照准备:
- 如果不带
/nowriters:枚举全部 VSS‑Writer,通知各应用准备备份,刷新内存缓存、冻结应用写入 IO(最大冻结时间 60 秒)Microsoft ...。 - 调用系统快照 Provider
swprv.dll,下发指令至内核volsnap.sys。
- 如果不带
volsnap.sys过滤驱动挂载到源卷 IO 栈,建立 Copy‑On‑Write 机制,生成卷影副本只读时间点视图。- Writer 解冻,业务应用恢复正常读写;此时源卷继续运行不中断。
- DiskSnapshot 拿到快照卷的只读设备路径;通过
vdisk.dll创建目标 VHDX 虚拟磁盘文件。 - 块级别循环读取快照卷(只读快照视图),逐块写入输出 VHDX 文件。
- VHDX 导出完成,自动清理临时 VSS 卷影副本(DiskSnapshot 生成的临时快照默认不持久驻留)。
- 返回成功 / 失败,输出日志;生成的 VHDX 文件可离线挂载使用。
重点:导出 VHDX 是块拷贝 IO 密集操作,创建快照本身极快;耗时主要在后面块复制写 VHDX 文件。
六、边界(约束、坑点、失效条件)
1 文件系统边界
- ✅支持:NTFS、ReFS;
- ❌不支持:FAT32、exFAT,无法创建 VSS 快照,DiskSnapshot 直接失败。
2 卷大小硬限制
VSS 系统 Provider 不支持大于 64TB 卷做快照;源卷 > 64TB,DiskSnapshot 报错 0x80042306Microsoft ...。
3 快照 Writer 模式边界
- 不带
/nowriters:依赖业务 VSS‑Writer 正常;如果 SQL/Exchange Writer 异常、崩溃,整个快照流程直接失败。 - 带
/nowriters:跳过应用 Writer,数据库会得到崩溃一致性镜像,数据库需要事后做修复,不可直接挂载启动业务,仅适合文件数据卷。
4 快照数量边界
单卷 VSS 卷影副本上限 64 个;DiskSnapshot 内部临时快照也计入配额;配额满无法新建快照,报错0x80042317。
5 存储空间边界
- 快照阶段:源卷 ShadowStorage 配额不足,快照创建失败;
- 导出阶段:输出 VHDX 目标磁盘空间不足,导出中途中断,产生损坏不完整 VHDX。
6 权限边界
必须管理员;UAC 未提升权限直接执行会静默失败。
7 输出产物边界
- DiskSnapshot 输出 VHD/VHDX 是完整块拷贝镜像,不是增量快照;每次执行输出完整镜像文件;
- DiskSnapshot 内部使用的临时快照,导出完成后自动删除,不会残留在系统;区别 vssadmin 创建持久化卷影副本。
8 故障失效条件
- VSS 服务停止、swprv 组件注册损坏 → 无法创建快照;
volsnap.sys驱动损坏、未加载 → COW 快照机制失效;- 第三方安全软件 / 存储过滤驱动与 volsnap 冲突 → IO 拦截异常,快照报错;
- 冻结 IO 超过 60 秒超时:应用 IO 冻结超时,VSS 自动终止快照流程,DiskSnapshot 失败Microsoft ...;
- 虚拟机内部运行 DiskSnapshot:仅对虚拟机内逻辑卷生效,不能绕过 Hyper‑V 拿到宿主机物理磁盘快照。
9 重要认知误区
- DiskSnapshot≠VSS;DiskSnapshot 是VSS 上层导出工具,真正快照内核仍然是 volsnap.sys;
- VSS 卷影副本 ≠ DiskSnapshot 输出 VHDX;前者是原卷内部差异快照,后者是独立离线虚拟磁盘文件。
DiskSnapshot 是 Windows 服务器操作系统中的一项功能,随着操作系统的更新,它也随之进行了多次改进和优化。到目前为止,DiskSnapshot 主要有以下版本:
Windows Server 2008 R2:这是 DiskSnapshot 首次亮相的版本,它随 Windows Server 2008 R2 一同发布。此版本`支持创建 VHD 格式的磁盘映像`。
Windows Server 2012 和 Windows Server 2012 R2:这两个版本的 DiskSnapshot 功能与 Windows Server 2008 R2 类似,但引入了对` VHDX 格式映像文件的支持`。
Windows Server 2016:此版本中的 DiskSnapshot 功能进一步优化,`提高了映像创建和恢复的速度和稳定性`。此外,它还`支持在创建映像时对数据进行加密和解密`。
Windows Server 2019:此版本中的 DiskSnapshot 功能与 Windows Server 2016 类似,但可能引入了一些性能和兼容性的改进。
Windows Server 2022:这是最新版本的 Windows 服务器操作系统,其中的 DiskSnapshot 功能也得到了更新。它引入了`更高效的数据压缩算法,以减小映像文件的大小,并提高了创建和恢复映像的速度`。
DiskSnapshot.exe是Windows操作系统提供的一种`磁盘快照技术`,可以用于`备份、还原以及创建系统镜像`。它可以捕获某个磁盘或卷的状态,并将其保存为一个`VHD或VHDX文件`,以便在需要时恢复到该状态。
使用DiskSnapshot的优点包括:
快速备份:可以在不停止服务或挂起应用程序的情况下,快速对磁盘进行备份。
可靠性:生成的快照是一个完整的、可靠的磁盘映像,可以用于还原磁盘状态。
灵活性:由于快照是一个文件,因此可以轻松地复制、移动、转移或存档。
使用DiskSnapshot,可以执行以下任务:
创建系统镜像:可以创建一个磁盘映像,包含操作系统、系统设置和应用程序。
备份磁盘或卷:可以对磁盘或卷进行快速备份,以便在需要时恢复。
还原磁盘或卷:可以使用快照文件来还原磁盘或卷的状态,包括文件、应用程序和系统设置。
要使用DiskSnapshot,可以使用命令行工具“diskpart.exe”。下面是一些常见的命令:
创建磁盘快照:使用"create snapshot"命令创建一个新的磁盘快照。
显示磁盘快照:使用"list snapshot"命令查看当前计算机上所有的磁盘快照。
删除磁盘快照:使用"delete snapshot"命令删除指定的磁盘快照。
还原磁盘快照:使用"apply snapshot"命令应用指定的磁盘快照,以还原磁盘状态。

浙公网安备 33010602011771号