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 本身不实现快照内核,是用户态前端工具程序。

  1. 它调用 VSS COM 组件,请求生成卷影副本(Shadow Copy),依靠内核驱动volsnap.sys完成写时复制 COW,获得卷的只读时间点一致视图。
  2. 获取快照卷设备路径之后,调用虚拟磁盘库vdisk.dll,执行块级复制,把快照卷完整块流写入 VHD/VHDX 文件。
  3. 导出完成自动删除本次生成的临时卷影副本,不保留快照在系统中。

两种运行模式:

  • 默认模式:调用 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删除临时快照
  1. 服务依赖RPCSS 服务必须运行 → VSS(Volume Shadow Copy)服务必须处于运行状态;VSS 停止,disksnapshot.exe 直接返回错误,无法创建快照。
  2. 权限依赖 必须提升本地管理员权限;UAC 未提升,COM 调用直接拒绝访问,操作失败。
  3. 文件系统依赖 源卷必须为 NTFS / ReFS;FAT32/exFAT 不支持 VSS 快照,直接报错。
  4. Writer 依赖(可选) 不带/nowriters:会加载系统注册 VSS Writer(NTDS、SQL、Exchange 等),Writer 依赖 DCOM/WMI 环境;任意关键 Writer 故障,整个快照流程终止。 带/nowriters:绕过所有 Writer,不再依赖应用 Writer 组件。
  5. 存储依赖
  • 快照阶段:源卷必须配置足够 ShadowStorage 快照存储空间;配额不足快照创建失败。
  • 导出阶段:目标输出磁盘必须有足够空闲空间存放完整 VHD/VHDX 镜像。

注意:disksnapshot.exe生成的快照是临时快照,导出完毕自动删除,不会保留在系统卷影副本列表。区别于vssadmin create shadow创建持久快照。

四、配套链

同系统配套工具

  1. diskshadow.exe:交互式 VSS 脚本工具,可以创建、expose 暴露快照卷,但本身不能导出 VHDX 文件
  2. vssadmin.exe:管理卷影副本、设置 ShadowStorage 配额、删除快照。
  3. 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 /?

上层调用配套

  1. 批处理 / PowerShell:直接调用可执行文件,自动化批量备份。
  2. 产物配套:生成 VHDX,可通过diskpart attach vdisk离线挂载;可直接附加到 Hyper‑V 虚拟机。

五、逻辑链路(完整时序)

  1. disksnapshot.exe启动,解析命令行参数(源卷、输出路径、/nowriters 标记);校验管理员权限。
  2. 加载vssapi.dll,初始化 VSS COM 客户端接口,创建快照集对象。
  3. 如果没有 /nowriters
    • VSS 服务枚举系统全部注册 VSS Writer;发送 PrepareForBackup 事件;
    • 各应用 Writer 把内存脏缓存落盘,短暂冻结 IO(默认最大冻结 60s)。
  4. 请求创建卷影副本;RPC 传递请求至vssvc.exe,调用swprv.dll,下发 IOCTL 到内核volsnap.sys
  5. volsnap.sys挂载过滤驱动到源卷 IO 栈,开启 Copy‑On‑Write,生成只读快照卷设备。
  6. Writer 收到 BackupComplete 事件,解冻业务 IO,业务程序恢复正常读写。
  7. disksnapshot.exe 获取快照卷的只读设备路径。
  8. 调用vdisk.dll,在目标路径创建空白 VHD/VHDX 虚拟磁盘。
  9. 块循环读取快照卷(只读时间点视图),逐块写入 VHDX 文件;此步骤是 CPU/IO 耗时主要部分。
  10. VHDX 块拷贝完成;通知 VSS 删除本次临时卷影副本,释放 volsnap 快照资源。
  11. 释放 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 模式边界

  1. 默认模式:依赖 VSS‑Writer 健康;某个 Writer 报错 / 挂起,整体快照直接失败;适合数据库、域控服务器。
  2. /nowriters模式:无应用一致性;数据库、AD 数据库得到崩溃一致性镜像;挂载后数据库需要执行修复,不能直接上线运行业务。

5 快照配额边界

单卷 VSS 卷影副本最大 64 个;disksnapshot 产生的临时快照也计入该计数;配额占满报错0x80042317

6 存储空间边界

  1. 源卷 ShadowStorage 空间不足 → 创建快照失败。
  2. 目标磁盘空间不足 → 块拷贝中途终止,产生损坏不完整 VHDX 文件。

7 超时边界

VSS Writer 冻结 IO 最长 60 秒;应用 IO 压力大冻结超时,快照流程直接终止失败。

8 第三方驱动冲突边界

第三方杀毒、存储过滤驱动与volsnap.sysIO 栈冲突,快照 IO 异常,返回 0x800423xx 系列错误。

9 产物边界

  1. disksnapshot.exe 输出完整全量 VHDX 镜像,不是增量快照,每次执行输出完整镜像。
  2. 内部临时快照导出后自动删除,不会残留在系统卷影副本列表,与vssadmin create shadow持久快照行为不同。

10 常见误区

  1. ❌误区:disksnapshot.exe在内核实现快照;✅真相:它只是用户态工具,真正快照内核是volsnap.sys
  2. ❌误区:VSS 卷影副本等于 VHDX;✅真相:卷影副本驻留原卷内部;disksnapshot 做块拷贝才生成独立可离线 VHDX。
  3. ❌误区:桌面 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 代理层。

  1. 对外暴露一套 C/C++ COM 接口(IVssBackupComponentsIVssSnapshotMgmt等),上层程序(disksnapshot、diskshadow、备份软件)调用这些接口发起快照任务。
  2. 内部封装 COM‑RPC,把本地 API 调用序列化,跨进程发送给服务端vssvc.exe
  3. 将服务端返回结果、错误码转换为 VSS 专用 HRESULT 错误码,返回调用方程序。
  4. 封装 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:管理快照存储配额、枚举 Provider
  • IVssEnumObject:枚举快照、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服务端)
  1. 强服务依赖vssapi.dll本身只是客户端库;如果 VSS(vssvc.exe) 服务未运行,CoCreateInstance 直接失败,返回 HRESULT 错误 0x80042302。 vssapi.dll 不会自动启动 VSS 服务;上层应用需要自行保证 VSS 服务处于运行。
  2. 权限依赖 大部分 VSS 接口需要管理员权限;普通用户调用IVssBackupComponents::SetContextAddToSnapshotSet会返回拒绝访问。 少数只读枚举接口允许普通用户调用。
  3. COM 依赖 依赖系统 COM 子系统正常;若 COM 注册表损坏,vssapi.dll 对象实例化直接失败。
  4. 关键隔离:

vssapi.dll【客户端】不会加载 swprv.dll、不会直接调用 volsnap.sys;这两个全部运行在 vssvc.exe 服务进程上下文。 vssapi.dll 只做命令转发,不参与 IO 拦截、写时复制。

  1. 版本依赖: 不同 Windows Server 版本 vssapi.dll 接口版本存在差异;新接口(增量快照、ReFS 增强快照)在旧系统不存在;跨版本拷贝 dll 无法兼容,VSS 是系统组件,不支持单独移植。

四、配套链

上层调用者(消费 vssapi.dll)

  1. disksnapshot.exe:调用IVssBackupComponents创建快照集,拿到快照设备路径。
  2. diskshadow.exe:交互式脚本工具,完全基于 vssapi.dll。
  3. Windows Server Backup:系统备份,核心依赖 vssapi.dll。
  4. 第三方备份软件:Veeam、Commvault 等 Windows 备份代理,均加载 vssapi.dll。

开发配套

  • SDK 头文件:vss.hvss.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 创建快照为例

  1. disksnapshot.exe 启动,加载 vssapi.dll
  2. 通过ole32.dll::CoCreateInstance实例化 VSS COM 对象(vssapi.dll 内实现客户端代理存根)。
  3. 客户端代理通过 rpcrt4.dll发起 RPC,连接到系统服务 vssvc.exe
  4. 调用IVssBackupComponents::GatherWriterMetadata
    • RPC 请求转发至 vssvc.exe;服务端枚举全部注册 VSS Writer;收集 Writer 元数据返回给 vssapi.dll;再回传给 disksnapshot。
  5. 调用AddToSnapshotSet,把目标卷加入快照集合。
  6. 调用DoSnapshotSet,真正触发快照生成:
    • RPC 命令给到 vssvc.exe;服务端依次执行 Writer Prepare、PrepareForSnapshot;
    • 调用 Provider (swprv.dll),下发 IOCTL 至 volsnap.sys 内核驱动,生成卷影副本;
    • 将快照 ID、快照只读设备路径,通过 RPC 传回 vssapi.dll。
  7. vssapi.dll 把快照信息、设备路径交付上层程序 disksnapshot.exe。
  8. disksnapshot.exe 拿到快照设备,执行块拷贝导出 VHDX。
  9. 调用DeleteSnapshotSet接口(vssapi.dll),RPC 通知 vssvc 删除临时快照。
  10. 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 不具备的能力(重要边界)

  1. ❌vssapi.dll 不能直接读写磁盘块;块读取、VHDX 生成,是上层程序(disksnapshot)调用 vdisk.dll 完成,vssapi 不参与。
  2. ❌vssapi.dll 不实现 COW 快照逻辑,不直接和 volsnap.sys 通信。
  3. ❌vssapi.dll 不会自动启动 VSS 服务;应用必须自行保证 vssvc.exe 处于运行状态。

8 常见故障现象

  1. CoCreateInstance 0x80042302:VSS 服务未运行 / DCOM 权限异常,vssapi 无法连接服务端。
  2. 调用 DoSnapshotSet 返回 0x80042317:快照存储配额已满,来自 swprv/volsnap,由 vssapi.dll 透传给上层程序。
  3. 程序崩溃快照残留:客户端进程退出,未调用 DeleteSnapshotSet,vssapi.dll 来不及发送清理指令。

vssvc.exe 完整解构

vssvc.exeVolume Shadow Copy Service,卷影副本协调服务进程;VSS 整个框架的调度中枢,COM‑RPC 服务端宿主。本身不执行快照 IO、不实现 COW 写时复制,负责协调 Requestor 请求者、VSS Writer 应用写入器、Snapshot Provider 快照提供程序三方组件协同工作。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界

一、底层原理

vssvc.exe是 Windows 系统服务进程,运行于 SYSTEM 权限上下文,作为 VSS COM 接口的服务端宿主。

  1. 接收来自客户端vssapi.dll(disksnapshot.exe、diskshadow.exe、备份软件)的本地 COM‑RPC 调用请求。
  2. VSS 全流程总调度:枚举系统注册全部 VSS Writer,按事件时序下发回调事件(OnIdentifyOnPrepareForSnapshotOnFreezeOnThaw),通知数据库、AD、注册表等组件刷新缓存、短暂冻结 IO,保障应用一致性快照博客园。
  3. 调用快照 Provider(默认swprv.dll软件快照提供程序;也可调用硬件存储厂商 Hardware Provider),下发创建 / 删除快照指令。
  4. Provider 向下通过 IOCTL 与内核驱动volsnap.sys交互,实现卷影副本 COW 写时复制;vssvc.exe不直接调用内核驱动,通过 Provider 做中转。
  5. 维护快照会话、快照集 GUID、Writer 元数据、快照存储配额配置;将执行结果、HRESULT 错误码通过 RPC 回传给上层请求者。
  6. 记录 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内核驱动
  1. 系统服务依赖链 RPCSS(RPC Endpoint Mapper) + DCOM Server Process LauncherVSS(vssvc.exe)swprv(Microsoft Software Shadow Copy Provider)服务Microsoft ...。

RPC 服务停止,则 vssvc 无法接收 COM 请求;vssvc 启动,但 swprv 服务禁用,软件快照创建直接失败。

  1. 进程内存边界 swprv.dll加载进 vssvc.exe 进程内部执行;volsnap.sys 运行在内核地址空间,和 vssvc 进程完全隔离。

vssvc.exe 崩溃,快照创建流程直接中断;但已经完成的持久快照元数据留存在内核 volsnap 中。

  1. 权限依赖 vssvc 自身以NT AUTHORITY\SYSTEM运行; 但客户端发起 COM 调用仍然需要调用方具备管理员权限;普通用户调用 VSS 修改类接口返回拒绝访问。
  2. Writer 外部进程依赖 VSS Writer 可以运行在独立进程(SQL Server、Exchange);vssvc 通过 COM 跨进程回调通知 Writer 执行冻结 / 解冻。任意一个关键 Writer 超时、崩溃,vssvc 终止整个快照集任务
  3. 文件系统前置依赖 源卷必须 NTFS / ReFS;该校验由 swprv+volsnap 执行;vssvc 接收返回错误向上透传给请求者。
  4. 版本强绑定vssvc.exevssapi.dllswprv.dllvolsnap.sys版本必须匹配;不支持单独替换其中某一个二进制,版本不匹配 COM 调用直接报错 0x80042302

四、配套链

上层请求者(全部依赖 vssvc.exe 服务运行)

  1. disksnapshot.exe:Server 快照导出 VHDX 工具
  2. diskshadow.exe:VSS 交互式脚本工具
  3. vssadmin.exe:快照管理命令行
  4. 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 发起快照为例

  1. disksnapshot.exe 加载vssapi.dll,COM‑RPC 连接至运行中的vssvc.exe服务进程,创建IVssBackupComponents会话对象。
  2. vssvc.exe 收到请求,执行GatherWriterMetadata:枚举本机全部注册 VSS Writer,发送OnIdentify事件,收集各 Writer 元数据、受保护文件组件列表,回传给客户端。
  3. vssvc 向全部 Writer 下发OnPrepareForSnapshot事件:通知应用完成未完成事务、刷内存脏缓存,为冻结 IO 做准备。
  4. vssvc 下发OnFreeze事件给所有 Writer:进入 IO 冻结窗口期,最大允许 60 秒;应用暂停新写入事务,内存数据落盘到磁盘。
  5. vssvc 调用本机快照 Provider (swprv.dll,加载在自身进程),请求创建快照集。
  6. swprv.dll 下发 IOCTL 控制码给内核volsnap.sys:挂载过滤驱动到源卷 IO 栈,开启 COW 写时复制,生成卷影副本只读设备。
  7. 快照时间点生成完成;vssvc 下发OnThaw事件给全部 VSS‑Writer:解除冻结,业务应用恢复正常 IO 读写
  8. vssvc 拿到快照 ID、快照只读设备路径,通过 RPC 返回给客户端 disksnapshot.exe。
  9. disksnapshot.exe 执行块拷贝导出 VHDX。
  10. 客户端调用DeleteSnapshotSet;RPC 通知 vssvc;vssvc 调用 Provider 删除临时快照,通知 volsnap 释放快照差异块资源。
  11. 会话释放,COM 对象销毁。

重要时序特征:真正业务冻结窗口只发生步骤 4‑6;快照一旦完成,立刻解冻业务 IO;块拷贝导出 VHDX 在解冻之后,不阻塞业务写 IOMicrosoft ...。

六、边界(约束、坑点、失效条件)

1 进程与会话边界

  1. vssvc 维护多个并行快照会话;每个请求者对应独立快照集对象;
  2. 如果客户端进程 (disksnapshot.exe) 崩溃退出,没有调用 DeleteSnapshotSet:vssvc 会保留会话对象,临时快照不会自动清理,会发生快照残留,需要 vssadmin 手动删除。
  3. 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 通信边界

  1. DCOM 安全权限被篡改:即使 vssvc 进程正常运行,客户端vssapi.dll无法建立 RPC 连接,报错0x80042302 VSS服务不可访问
  2. 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 常见认知误区

  1. ❌误区:vssvc.exe 实现快照写时复制;✅真相:vssvc 只是调度器;COW 内核逻辑由volsnap.sys完成。
  2. ❌误区:swprv.dll 运行独立进程;✅真相:swprv.dll 以 DLL 形式加载到 vssvc.exe 进程内部运行。
  3. ❌误区:vssvc 可以直接读写磁盘块;✅真相:vssvc 完全不做磁盘 IO,IO 操作全部交给 Provider 与内核驱动。
  4. ❌误区:关闭 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之间的桥梁。

  1. 实现 VSS 定义的 IVssSoftwareSnapshotProvider 接口;vssvc.exe 通过该接口下发:创建快照、删除快照、设置快照存储配额、查询卷影副本信息等指令。
  2. 打开卷设备对象(\\.\C: 这类原始卷句柄),向volsnap.sys下发一系列 IOCTL 控制码,完成内核侧快照的配置与生成。
  3. 管理Shadow Copy Storage(快照差异存储区域):配置源卷上用于存放 COW 写时复制差异块的存储空间大小、位置。
  4. 维护快照元数据:快照 ID、源卷 GUID、快照卷设备路径、快照上下文(临时 / 持久),在内核与用户态之间做状态同步。
  5. 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,执行快照逻辑
  1. 宿主强依赖 swprv.dll不能独立执行,必须被加载到vssvc.exe进程;swprv 对应系统服务名称 swprv,该服务本质是通知 SCM 允许被 vssvc 加载,swprv.dll 本身没有独立 exe 主入口。

服务swprv启动类型一般为手动;vssvc 运行时按需加载此 DLL。

  1. 内核驱动依赖volsnap.sys必须成功加载;若 volsnap.sys 未加载、损坏、被第三方过滤驱动阻止挂载,swprv 所有快照相关 IOCTL 调用直接失败,返回 VSS 错误码。
  2. 文件系统依赖 仅支持 NTFS / ReFS;FAT32/exFAT 卷下发快照 IOCTL,volsnap 返回失败,swprv 透传错误给 vssvc。
  3. 权限依赖 继承宿主vssvc.exeSYSTEM权限;需要对源卷原始卷设备具备完全访问权限。
  4. 版本绑定swprv.dllvssvc.exevolsnap.sys版本必须严格匹配;禁止单独复制替换 swprv.dll,版本不匹配会造成接口调用异常。
  5. 与 VSS‑Writer 解耦

重要边界:swprv.dll 完全不感知 VSS Writer(SQL/NTDS 等)。 Writer 冻结、解冻、元数据收集全部由上层vssvc.exe完成;swprv 只负责接收 “现在创建快照” 指令,不参与应用一致性逻辑。

四、配套链

上层调用方

  1. vssvc.exe:唯一直接加载 swprv.dll 的进程。
  2. 间接上层工具:disksnapshot.exediskshadow.exevssadmin.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 创建临时快照为例

  1. disksnapshot.exe → vssapi.dll → RPC → vssvc.exe。
  2. vssvc 完成全部 VSS Writer 事件流程(Prepare、Freeze),应用 IO 进入冻结窗口。
  3. vssvc 在自身进程内部加载swprv.dll,获取IVssSoftwareSnapshotProvider接口。
  4. swprv 调用NtOpenVolume打开源卷设备对象\\.\X:,获取卷句柄。
  5. swprv 下发IOCTL_VOLSNAP_SET_STORAGE_AREA:通知内核 volsnap.sys 确认快照差异存储区域位置与配额。
  6. swprv 下发IOCTL_VOLSNAP_CREATE_SNAPSHOT,请求内核生成卷影副本。
  7. volsnap.sys内核过滤驱动挂载至源卷 IO 栈,启用 Copy‑On‑Write 写时复制,生成只读快照卷设备,返回快照 ID、快照设备路径。
  8. swprv 接收内核返回结果,整理快照元数据,通过 COM 接口回传给 vssvc.exe。
  9. vssvc 立刻下发 Thaw 事件给所有 VSS‑Writer,解除应用 IO 冻结
  10. vssvc 把快照 ID、快照设备路径经 RPC 返回给客户端 disksnapshot.exe;disksnapshot 执行块拷贝导出 VHDX。
  11. 客户端发起 DeleteSnapshotSet;vssvc 调用 swprv 接口。
  12. swprv 下发IOCTL_VOLSNAP_DELETE_SNAPSHOT给 volsnap.sys,内核释放 COW 差异块资源;关闭卷句柄。

关键点:应用冻结窗口只在步骤 2‑7 之间;快照一旦在内核创建完成,马上解冻业务,块拷贝导出工作在解冻之后执行,不阻塞业务写入

六、边界(约束、坑点、失效条件)

1 进程边界

  1. swprv.dll 运行在vssvc.exe 地址空间;vssvc 进程崩溃,swprv 同时被卸载;正在进行的快照创建直接中止。
  2. swprv 没有独立进程;任务管理器看不到 swprv.exe。

2 卷大小硬上限边界

软件 Provider(swprv+volsnap)单卷上限 64TB;源卷 > 64TB,创建快照返回错误 0x80042306

该限制是 swprv/volsnap 软件快照的硬性限制;硬件快照 Provider 不受该 64TB 约束。

3 快照存储配额边界

  1. ShadowStorage 配额耗尽:swprv 调用创建快照 IOCTL 失败,返回0x80042317
  2. 快照差异存储区域不能跨卷;软件快照差异块只能存放在源卷本身,不能指定到别的磁盘。

4 快照上下文边界

swprv 支持两种快照上下文:

  • 临时快照 (volatile):disksnapshot.exe 使用;会话结束、系统重启,内核自动销毁快照。
  • 持久快照 (persistent):“以前的版本” 功能;快照元数据写入内核,系统重启后快照保留。

5 过滤驱动冲突边界

第三方杀毒、加密、存储过滤驱动,与volsnap.sysIO 栈冲突: swprv 下发 IOCTL 会返回 IO 错误;现象:vssadmin、disksnapshot 全部快照失败。故障点发生在内核,swprv 仅透传错误码。

6 文件系统边界

  • ✅ NTFS、ReFS
  • ❌ FAT32、exFAT、RAW:swprv 下发 IOCTL 直接失败,无法创建软件快照。

7 职责隔离边界(高频误区)

  1. ❌误区:swprv 负责通知数据库冻结 IO;✅真相:Writer 事件全部由 vssvc.exe 完成;swprv 只管告诉内核 “生成快照”。
  2. ❌误区:swprv 实现 COW 写时复制;✅真相:COW 在内核volsnap.sys;swprv 只是用户态指令下发器。
  3. ❌误区:swprv 可以用于硬件阵列快照;✅真相:硬件快照使用厂商专属 Provider,完全绕开 swprv.dll 与 volsnap.sys。

8 常见故障现象

  1. vssadmin list providers 看不到软件 Provider:swprv.dll COM 注册损坏。
  2. 创建快照报错 0x80042306:卷超过 64TB 软件 Provider 上限。
  3. 创建快照报错 0x80042317:ShadowStorage 快照配额已满。
  4. 部分快照失败,但 Writer 日志无报错:Writer 已经全部成功,故障发生在 swprv→volsnap 内核路径。

volsnap.sys 完整解构

volsnap.sysVolume Snapshot Driver,卷影副本内核过滤驱动;VSS 软件快照真正内核执行引擎,实现卷层 Copy‑On‑Write 写时复制、快照虚拟卷设备、差异块管理;位于存储 IO 过滤栈。swprv.dll 通过 IOCTL 下发指令控制该驱动。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界

一、底层原理

volsnap.sys是内核模式过滤驱动,工作在卷设备栈之上,文件系统 (ntfs.sys) 下层,拦截源卷全部 IRP 读写请求,实现块级快照虚拟化Microsoft ...。

  1. 过滤驱动挂载:收到用户态swprv.dll的创建快照 IOCTL,附加到目标卷设备栈;拦截IRP_MJ_WRITEIRP_MJ_READ、设备控制 IRP博客园。
  2. Flush‑and‑Hold 时间点冻结:执行IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES,刷新文件系统全部脏缓存,短暂排队阻塞写 IRP;在毫秒级窗口完成卷时间点原子冻结,生成磁盘块一致性视图,之后放行写 IOMicrosoft ...。
  3. Copy‑On‑Write (COW) 写时复制
    • 快照建立之后,源卷某个 LBA 块第一次被写入;volsnap 拦截写 IRP。
    • 原始未被覆盖的旧块复制到 DiffArea 差异存储区(System Volume Information 下稀疏文件)
    • 写完旧块到差异区之后,才允许新数据写入源卷。
    • 后续重复改写同一 LBA,不再重复拷贝;只拷贝首次修改块,不做整卷复制。
  4. 快照虚拟卷设备生成:动态创建只读内核设备对象 \Device\HarddiskVolumeShadowCopy{Snapshot‑GUID};该虚拟设备没有物理磁盘对应。读取快照 IO 时,驱动查询块映射表:未修改块直接读源卷;已修改旧块从 DiffArea 差异区读取,拼接出快照时间点视图;快照虚拟卷禁止任何写入 IRP,全部写请求直接拒绝博客园。
  5. 多快照共存管理:维护每个卷多张快照的块映射元数据;多个快照共享未变更块;删除快照时回收 DiffArea 稀疏文件簇资源。
  6. 接收 IOCTL 指令集,完成:创建快照、删除快照、设置 ShadowStorage 配额、查询快照状态、枚举快照 ID。

VSS 完整分层定位

  1. Requestor:disksnapshot.exe/diskshadow.exe → vssapi.dll(用户态客户端)
  2. vssvc.exe(协调调度、VSS‑Writer 事件)
  3. swprv.dll(vssvc 内部加载软件 Provider,下发 IOCTL)
  4. volsnap.sys(内核过滤驱动,本组件,真正实现 COW 快照)
  5. 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 / 磁盘端口驱动
  1. 上层交互边界用户态没有任何进程可以直接加载 volsnap.sys;全部控制命令必须经由swprv.dll通过 IOCTL 设备控制码下发。vssvc.exe、vssapi.dll 完全不直接和内核驱动通信。
  2. 文件系统强依赖:DiffArea 差异存储必须建立在 NTFS/ReFS 卷;FAT32/exFAT 卷,volsnap 拒绝创建快照。
  3. 过滤驱动栈冲突依赖:其他第三方加密、杀毒、存储过滤驱动如果挂载在 volsnap 上层 / 下层 IO 栈顺序错乱,会造成 IRP 处理异常、快照失败、蓝屏。
  4. 两种快照上下文
    • 临时快照 Volatile:内核元数据驻内存;系统重启自动全部销毁,disksnapshot.exe 使用该类型。
    • 持久快照 Persistent:快照元数据写入磁盘;重启系统之后快照仍然保留,对应 “以前的版本” 功能博客园。
  5. 版本绑定:volsnap.sys版本必须与swprv.dllvssvc.exevssapi.dll整套 VSS 组件版本严格匹配;不能单独拷贝替换驱动文件。
  6. 配额依赖:ShadowStorage(DiffArea)空间耗尽,volsnap 无法完成 COW 拷贝块,快照直接失败,向上返回错误透传给 swprv。

进程边界:volsnap.sys 运行在内核;vssvc.exe 崩溃、退出,已经创建完成的持久快照不受影响,元数据保存在内核与磁盘 DiffArea 中

四、配套链

用户态上层消费组件

  1. swprv.dll:唯一用户态控制入口。
  2. 间接上层工具:disksnapshot.exediskshadow.exevssadmin.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 发起快照完整内核侧流程

  1. swprv.dll 打开源卷设备句柄\\.\X:,下发IOCTL_VOLSNAP_SET_STORAGE_AREA;volsnap 初始化 DiffArea 稀疏文件,校验快照存储配额。
  2. swprv 下发IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES
    • volsnap 通知下层 ntfs.sys 刷新全部脏页缓存、提交 NTFS 日志。
    • 短暂 Hold 排队所有写 IRP(毫秒级),源卷写 IO 被临时挂起,获得原子一致时间点博客园。
  3. 下发IOCTL_VOLSNAP_CREATE_SNAPSHOT
    • volsnap.sys 将自身过滤驱动附加到源卷设备 IO 栈。
    • 在内存建立快照块映射表。
    • 内核生成只读快照虚拟设备对象HarddiskVolumeShadowCopy{GUID}
  4. Hold 解除,放行排队的写 IRP;源卷业务 IO 恢复运行;通知上层 swprv.dll 快照创建完成;vssvc 立刻 Thaw 解冻 VSS‑Writer 应用。
  5. 快照运行期 COW 逻辑:源卷业务发生写入 IRP_MJ_WRITE
    1. volsnap 拦截写 IRP;查询块映射:该 LBA 是否第一次被修改。
    2. 如果首次修改:读取该 LBA 原始旧块,写入 DiffArea 差异稀疏文件。
    3. 更新块映射表,记录该 LBA 旧块存放位置。
    4. IRP 放行,允许新数据写入源卷磁盘。
  6. 读取快照虚拟卷 IO:
    • 读取请求下发到HarddiskVolumeShadowCopy{GUID}设备。
    • 查询块映射表:未修改块 → 直接读源卷;已经修改块 → 读取 DiffArea 里面保存的旧块,拼接返回快照视图。
  7. 删除快照: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 差异存储边界

  1. 软件快照 DiffArea 默认建立在源卷之上;可以指定到其他 NTFS 卷,但不能放在 FAT32 卷。
  2. DiffArea 配额耗尽:当大量写操作,差异块填满 ShadowStorage 配额;volsnap 无法继续执行 COW 复制,快照失效,旧快照可能被系统自动清理,事件日志报 volsnap Event ID 1。
  3. 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 职责隔离边界(高频误区)

  1. ❌volsnap.sys 不感知 VSS‑Writer,不做数据库缓存刷新、不处理应用一致性;只保证磁盘块时间点一致;数据库直接挂载快照得到是崩溃一致性副本,需要修复。
  2. ❌volsnap.sys 不会自动扩容 DiffArea;配额耗尽快照直接失效,不会自动扩大存储。
  3. ❌volsnap.sys 不做文件系统修复;底层磁盘坏道、NTFS 元数据损坏会直接造成快照异常。
  4. ✅volsnap 只做块层虚拟化,不处理上层文件语义。

8 重启行为边界

  • 临时快照(Volatile):全部内存元数据,系统重启直接销毁。
  • 持久快照(Persistent):元数据和 DiffArea 差异块保存在磁盘;重启之后仍然可用。

9 性能边界

快照启用后,源卷写入会带来写放大;每一个首次修改块,发生两次 IO(读旧块写入 DiffArea + 写新数据到源卷);高频繁大量写入业务,源卷写性能会下降。

10 常见故障现象

  1. volsnap Event ID 1:DiffArea 无法创建 / 空间不足。
  2. 0x80042317:快照数量达到 64 上限 / ShadowStorage 配额耗尽。
  3. 信号量超时 0x80070079:IO 栈冲突、存储子系统卡顿,IOCTL 执行超时。
  4. 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)的客户端代理。

  1. 对外暴露 VDS 全套 COM 接口(IVdsServiceIVdsDiskIVdsVirtualDiskIVdsVolume等),上层应用调用接口发起磁盘管理请求。
  2. 内部封装 COM‑RPC,把 API 调用序列化,跨进程发送给系统服务进程 vds.exe(Virtual Disk Service)。
  3. 接收 vds.exe 返回结果,将底层磁盘、存储驱动返回的错误转换为 VDS 标准 HRESULT 错误码,返回调用程序。
  4. 能力覆盖:物理磁盘枚举、分区 / 卷管理、VHD/VHDX 虚拟磁盘挂载 / 卸载、iSCSI 磁盘管理、RAID 卷、动态磁盘管理。

分层定位

  • 上层调用程序:diskpart.exe、第三方存储管理程序、部分备份软件
  • vdisk.dll(VDS COM 客户端,本组件)
  • ↓ COM‑RPC 本地进程通信
  • vds.exe(VDS 服务端进程)
  • 内核:vdisk.sys虚拟磁盘驱动、disk.sys磁盘驱动、iscsiprt.sysiSCSI 驱动

重要区分

  1. vdisk.dll:VDS(Virtual Disk Service)客户端 COM 库,面向物理磁盘、动态磁盘、VHD 管理。
  2. vdisklib.dll / vdiskapi.dll虚拟磁盘 API,专门用于 VHD/VHDX 创建、快照、块读写;disksnapshot.exe导出快照为 VHDX 使用的是这一组,不是 vdisk.dll
  3. 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
  1. 服务强依赖vdisk.dll只是客户端代理;如果 VDS 服务 vds.exe 未运行,CoCreateInstance 直接失败返回 HRESULT 错误;vdisk.dll 不会自动启动 VDS 服务,上层应用需要自行保证服务运行。
  2. 权限依赖 绝大部分磁盘修改接口(创建 VHD、挂载虚拟盘、修改分区)必须管理员权限;普通用户仅可以调用部分只读枚举接口。
  3. 进程内存边界vdisk.dll加载在调用者进程地址空间;所有真正磁盘业务逻辑运行在独立服务进程vds.exe;客户端进程崩溃,不会终止已经提交的磁盘任务。
  4. 版本绑定vdisk.dllvds.exe版本严格匹配,不支持单独拷贝 dll 跨系统移植;接口随 Windows 版本演进增减。
  5. 职责隔离边界

vdisk.dll不直接读写磁盘块,不解析 VHDX 文件格式;VHD 文件解析、块映射全部由内核vdisk.sys和服务端vds.exe完成。vdisk.dll 只做命令转发。

  1. 和 VSS 组件解耦 vdisk.dll 和 vssapi.dll/vssvc/swprv/volsnap没有直接依赖;VSS 快照由 volsnap 生成;导出 VHDX 使用vdisklib.dll而不是 vdisk.dll。

四、配套链

上层调用者(消费 vdisk.dll)

  1. diskpart.exe:磁盘分区管理命令行工具,核心依赖 vdisk.dll。
  2. 磁盘管理 MMC 控制台 (diskmgmt.msc)。
  3. 第三方存储管理软件,动态磁盘、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 为例)

  1. diskpart.exe 启动,加载vdisk.dll
  2. 通过ole32.dll::CoCreateInstance实例化 VDS 服务 COM 对象(vdisk.dll 内的客户端存根)。
  3. 客户端存根通过rpcrt4.dll发起本地 RPC,连接vds.exe服务进程。
  4. 调用IVdsVirtualDisk::Create接口,传入 VHD 路径、大小、类型参数;RPC 请求序列化发送给 vds.exe。
  5. vds.exe 服务端接收请求,执行参数校验,下发 IOCTL 至内核vdisk.sys驱动,在内核层完成 VHD/VHDX 文件创建。
  6. 内核驱动完成虚拟磁盘操作,执行结果回传给 vds.exe。
  7. vds.exe 把执行状态、错误码通过 RPC 回传给 vdisk.dll 客户端。
  8. vdisk.dll 转换 HRESULT,返回给 diskpart.exe。
  9. 业务完成,释放 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 接口能力边界

  1. vdisk.dll(VDS)支持 VHD1/VHDX,但VDS 不支持 VHDX 的动态块拷贝、快照导出;该能力属于vdisklib.dll虚拟磁盘 API。
  2. 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 常见故障现象

  1. CoCreateInstance 0x80040154:VDS 服务未运行 / COM 注册损坏。
  2. 返回 0x80070005 E_ACCESSDENIED:缺少管理员权限。
  3. VDS 服务卡死:diskpart 挂起,vdisk.dll 调用全部超时,需要重启 vds 服务。

高频误区

  1. ❌误区:vdisk.dll 直接操作 VHDX 文件;✅真相:VHDX 解析、块 IO 在内核 vdisk.sys;vdisk.dll 只是 RPC 转发层。
  2. ❌误区:disksnapshot.exe 依赖 vdisk.dll;✅真相:disksnapshot 使用vdisklib.dll块拷贝接口,与 vdisk.dll 无关。
  3. ❌混淆 vdisk.dllvdisk.sys;✅vdisk.dll 用户态 COM 客户端;vdisk.sys 内核虚拟磁盘驱动。

dmutil.dll 完整解构

dmutil.dll:Disk Management Utility DLL,磁盘管理实用库,属于 Windows Logical Disk Manager (LDM,逻辑磁盘管理器) 组件,专门负责动态磁盘、磁盘数据库 (LDM 数据库)、卷集、镜像卷、RAID‑5、跨区卷的用户态工具库;为 dmadmin.exediskmgmt.mscdiskpart.exe 提供 LDM 底层封装接口。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界

一、底层原理

dmutil.dll 用户态 DLL,无内核代码,是 LDM 逻辑磁盘管理器的用户态工具层,不直接操作内核驱动,负责解析、修改磁盘上私有 LDM 数据库(磁盘最后几个扇区存储 LDM 元数据库)。

  1. 封装 LDM 数据库读写 API:读取物理磁盘末尾扇区的 LDM 私有数据库,解析磁盘组、磁盘记录、分区记录、卷对象、 plex(镜像副本)、RAID‑5 条带元数据。
  2. 向上提供导出函数:创建动态磁盘、转换基本磁盘↔动态磁盘、创建镜像 / 跨区 / 条带 / RAID‑5 卷、修复 LDM 数据库、导入外部磁盘组、元数据校验。
  3. 和 LDM 服务进程dmadmin.exe通信;dmadmin 再向下与内核驱动dmio.sys交互。
  4. 将 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 磁盘类驱动

区分

  1. dmutil.dll:用户态,操作磁盘上 LDM 元数据库,高层工具 API;
  2. dmadmin.exe:LDM 服务进程;
  3. dmio.sys:内核驱动,实现动态磁盘卷 IO、镜像、RAID5 逻辑;
  4. 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物理磁盘驱动
  1. dmadmin.exe 强服务依赖dmutil.dll本身不直接下发 IOCTL 给dmio.sys;所有内核操作,必须通过dmadmin.exe中转。 dmadmin 服务启动类型:手动;操作动态磁盘时自动拉起;dmadmin 未运行,dmutil.dll 绝大多数修改接口调用失败。
  2. 权限依赖 几乎全部 dmutil.dll 导出 API 需要管理员权限;需要打开物理磁盘原始设备句柄\\.\PhysicalDriveN;普通用户仅可部分只读查询。
  3. 磁盘介质依赖
  • 仅对动态磁盘生效;基本 MBR/GPT 磁盘,LDM 数据库不存在,dmutil.dll 执行返回错误。
  • LDM 支持 MBR 动态磁盘、GPT 动态磁盘;但 GPT 动态磁盘有额外兼容性边界。
  1. 版本绑定dmutil.dlldmadmin.exedmio.sys版本严格匹配;禁止单独拷贝 dmutil.dll 跨系统使用;LDM 磁盘数据库格式随 Windows 大版本有微小变更。
  2. 进程内存边界 dmutil.dll 加载到调用进程(diskpart.exe/mmc.exe);真正内核 IO 运行在 dmadmin.exe 与内核 dmio.sys。

上层调用进程崩溃退出,dmutil.dll 卸载;已经提交给 dmadmin 的任务会继续在内核侧执行。

  1. 和 VDS/vdisk.dll 关系vdisk.dll(VDS)内部会间接调用dmutil.dll处理动态磁盘;VDS 是上层 COM 封装,dmutil.dll 是 LDM 底层实现。
  2. 和 VSS 组件解耦 dmutil.dll 与 vssapi.dll/vssvc.exe/volsnap.sys 无直接依赖;动态磁盘卷同样可以做 VSS 快照,属于两套独立子系统叠加。

四、配套链

上层调用者(消费 dmutil.dll)

  1. diskmgmt.msc 磁盘管理控制台(mmc.exe 加载 dmdskmgr.dll,dmdskmgr 调用 dmutil.dll)
  2. diskpart.execonvert dynamiccreate volume(mirror/stripe/raid5)命令底层调用 dmutil.dll
  3. VDS(vdisk.dll):处理动态磁盘时内部调用 dmutil.dll
  4. 旧版第三方磁盘管理工具

运维配套命令

:: 查看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 间接使用。

五、逻辑链路(完整时序示例:基本磁盘转换为动态磁盘)

  1. diskpart.exe 启动,加载dmutil.dll
  2. dmutil.dll 调用接口打开物理磁盘原始设备\\.\PhysicalDriveX,读取磁盘末尾扇区,检测是否存在 LDM 数据库。
  3. dmutil.dll 通过 IPC/RPC 连接dmadmin.exe服务进程。
  4. dmutil.dll 向 dmadmin 下发 “转换为动态磁盘” 任务参数。
  5. dmadmin.exe 接收任务,校验磁盘状态;调用内核 IOCTL,通知dmio.sys准备接管磁盘。
  6. dmadmin 执行原始磁盘写:在磁盘末尾扇区写入 LDM 私有元数据库,标记磁盘为动态磁盘。
  7. dmio.sys 内核驱动重新枚举磁盘设备,加载 LDM 磁盘组。
  8. dmadmin 把执行结果、错误码回传给 dmutil.dll。
  9. dmutil.dll 转换为 Win32 错误码返回 diskpart.exe。
  10. 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 硬件兼容性边界

  1. 动态磁盘不支持可移动 U 盘、SD 卡;dmutil.dll 拒绝转换。
  2. 某些 RAID 卡、存储虚拟化层下 LDM 动态磁盘会出现元数据库异常。

6 弃用边界(重要)

LDM(dmutil.dll/dmadmin.exe/dmio.sys)为遗留技术;微软不再推荐新部署动态磁盘;现代 Windows 使用 Storage Spaces(存储空间)替代。

  • Server 2022、Win11 仍然保留 LDM 用于兼容旧环境;但不再新增功能。
  • 存储空间使用完全另一套组件,不依赖 dmutil.dll

7 常见故障现象

  1. diskpart convert dynamic 报错:dmadmin 服务未启动 / 缺少管理员权限 / 磁盘为可移动介质。
  2. 磁盘管理显示 “无效动态磁盘”:磁盘末尾 LDM 数据库扇区损坏,dmutil.dll 解析元数据失败。
  3. 跨机器迁移动态磁盘,卷不显示:需要执行磁盘组导入,dmutil.dll 未识别外来磁盘组。

高频认知误区

  1. ❌误区:dmutil.dll 直接操作内核 dmio.sys;✅真相:必须经由 dmadmin.exe 服务进程中转。
  2. ❌误区:基本 GPT 磁盘会加载 dmutil.dll;✅真相:只有动态磁盘才使用 LDM 整套组件。
  3. ❌误区:停止 dmadmin 服务会导致动态磁盘卷无法读写;✅真相:dmadmin 仅做配置管理;IO 路径在内核 dmio.sys,卷读写继续工作。

rpcss.dll 完整解构

rpcss.dllRPC 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 对象激活调度器

  1. RPC 端点映射服务(Endpoint Mapper,EPM) 服务端程序注册 RPC 接口时,把「RPC 接口 UUID + 传输端点(LRPC/TCP/HTTP)」注册到 rpcss.dll 维护的内存数据库;客户端查询 EPM,拿到服务端通信端点,建立 RPC 会话。
    • 本地进程:LRPC(Local RPC,ALPC 底层)
    • 网络:TCP‑RPC、NP 管道 RPC、HTTP RPC。
  2. DCOM 对象激活调度 处理CoCreateInstanceEx跨机器 / 跨进程 COM 对象激活请求:读取注册表 CLSID/AppID 配置,决定:
    • 激活在现有进程、启动新进程、启动 COM + 组件、远程机器 DCOM 激活;
    • 权限校验(COM 安全、AppID 访问权限、启动权限)。
  3. COM 代理 / 存根 (Proxy‑Stub) 管理 加载接口代理 DLL,封送 / 解封送跨进程参数;处理接口 ID (IID) 解析。
  4. 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.sys RPC 内核传输驱动

关键区分

  1. rpcrt4.dll客户端 RPC 运行时,几乎所有进程都会加载,负责封送 RPC 参数、发起调用。
  2. rpcss.dllRPCSS 服务端核心,主要运行于rpcss.exe,负责端点映射、DCOM 对象激活、安全策略校验
  3. 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会话
  1. 系统关键服务强依赖 RpcSs(DCOM Server Process Launcher)是 Windows核心关键服务,启动类型:自动;不能禁用,禁用后绝大多数 COM 服务直接瘫痪

vssvc.exe、vds.exe、dmadmin.exe、WMI、打印后台处理程序、事件日志全部依赖 RpcSs。

  1. 进程加载边界
  • rpcss.dll主要运行在rpcss.exe;部分客户端场景也会被加载到客户端进程;端点映射器 EPM 实例只存在 rpcss.exe 内
  • rpcrt4.dll:几乎每一个 Windows 进程都会加载。
  1. 权限依赖
  • rpcss.exe 以NT AUTHORITY\SYSTEM运行;DCOM 激活时依据 AppID ACL 校验调用方的启动权限、访问权限;权限不足返回E_ACCESSDENIED(0x80070005)
  1. 传输依赖
  • 本机本地 COM:底层 LRPC(ALPC,高级本地过程调用,内核 rpcrt4.sys),不走 TCP 网络。
  • 跨机器 DCOM:使用 TCP 135 端口(RPC 端点映射器)+ 动态端口。
  1. 版本绑定rpcss.dllrpcrt4.dllrpcrt4.sys版本必须系统匹配;不支持单独拷贝替换 rpcss.dll。
  2. 和前面存储组件关系

vssapi.dll/vds/dmutil.dll 全部依靠 ole32 → rpcrt4 → rpcss.dll 完成跨进程 COM 激活: 客户端不会直接连接 vssvc.exe,而是向 rpcss.dll 请求:“请激活 VSS COM 对象”,rpcss 负责拉起 / 找到 vssvc.exe,返回通信端点。

四、配套链

上层调用组件(全部依赖 rpcss.dll 能力)

  1. 系统 COM 子系统:ole32.dll,所有CoCreateInstance跨进程 / 远程 COM 对象。
  2. VSS 卷影副本:vssapi.dll 请求激活 vssvc.exe COM 对象。
  3. VDS 虚拟磁盘服务:vdisk.dll请求激活 vds.exe。
  4. LDM 磁盘管理:dmutil.dll请求激活 dmadmin.exe。
  5. WMI:wmiprvse.exe DCOM 激活。
  6. DCOM 远程组件、打印机服务、事件日志服务。

运维配套命令

:: 查看RpcSs服务状态
sc query RpcSs

:: 查看DCOM组件安全配置
dcomcnfg.exe

:: 查看本机RPC注册端点
rpcdump.exe

rpcss.dll 核心能力模块

  1. EPM EndPoint Mapper:RPC 端点注册、查询数据库。
  2. DCOM Activator:COM CLSID/AppID 解析、进程激活、安全 ACL 校验。
  3. RPCSS 安全层:SSPI 身份上下文管理。

五、逻辑链路(时序示例:客户端 CoCreateInstance 激活 VSS COM 对象)

  1. 客户端进程(例如 disksnapshot.exe)调用 ole32.dll::CoCreateInstance 请求 VSS 的 CLSID。
  2. ole32 委托 rpcrt4.dll(客户端 RPC 运行时)发起 LRPC 调用,向rpcss.exe(rpcss.dll)发送 DCOM 激活请求。
  3. rpcss.dll接收激活请求:
    1. 查询注册表 CLSID,找到对应的 AppID。
    2. 读取 AppID 的启动权限 ACL,校验调用方是否有权限启动该 COM 组件。
    3. 查询 EPM 数据库:vssvc.exe 是否已经在运行,是否已经注册 VSS RPC 接口端点。
  4. 如果 vssvc.exe 未运行:rpcss.dll 启动 vssvc.exe 服务进程;等待 vssvc 内部完成 COM 接口注册到 EPM (rpcss.dll)。
  5. rpcss.dll 把 vssvc 的 LRPC 通信端点句柄返回给客户端 rpcrt4.dll。
  6. 客户端 rpcrt4.dll 直接和 vssvc.exe 建立 LRPC RPC 会话,后续业务 RPC 不再经过 rpcss.dll
  7. 客户端调用 VSS 业务 COM 接口,执行快照逻辑。

⚠️关键点:rpcss.dll只负责「对象激活 / 端点查询」;一旦两端会话建立,后续业务通信不再经过 rpcss.exe/rpcss.dll。

六、边界(约束、坑点、失效条件)

1 服务生死边界

  1. RpcSs 服务停止:整个系统 COM‑RPC 跨进程激活全部失效;vss、vds、wmi 全部不可用;大量系统服务启动失败;Windows 无法正常运行。
  2. 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 常见故障现象

  1. 0x80040154 REGDB_E_CLASSNOTREG:CLSID 未注册,rpcss.dll 找不到 COM 类。
  2. 0x80070005 E_ACCESSDENIED:rpcss.dll 做 DCOM 启动 / 访问 ACL 校验不通过。
  3. RPC 服务器不可用 0x800706BA:rpcss.exe 未运行或远程机器 135 端口不通。
  4. 部分 COM 服务进程运行正常,但外部无法连接:服务没有把 UUID 注册进 rpcss.dll 的 EPM 端点映射器。

高频认知误区

  1. ❌误区:所有 RPC 调用流量都经过 rpcss.dll;✅真相:rpcss.dll只管激活与端点查询;会话建立完成,业务 RPC 直接客户端‑服务端点对点。
  2. ❌rpcrt4.dll 就是 rpcss.dll;✅rpcrt4.dll 是客户端 RPC 库,每个进程加载;rpcss.dll 驻留 rpcss.exe,负责 DCOM 激活和 EPM。
  3. ❌停止 vssvc.exe 会影响 rpcss;✅单向依赖:vssvc 依赖 rpcss,rpcss 不依赖 vssvc。

ole32.dll 完整解构

ole32.dllCOM / DCOM / OLE 核心运行时库,Windows 组件对象模型用户态核心实现;提供CoInitializeExCoCreateInstance整套 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 ...。

  1. COM 库初始化管理CoInitializeEx:初始化当前线程 COM 环境,选择线程模型 STA 单线程单元 / MTA 多线程单元 / NA 中性单元;维护线程‑对象亲和关系,校验 COM 线程模型契约;未初始化直接调用 COM API 全部失败Microsoft ...。
  2. 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 ...。
  3. Proxy‑Stub 参数封送 / 解封送(Marshal / Unmarshal) 跨进程 / 跨机器 COM 不能直接传递内存指针;ole32 负责:
    • 根据注册表Interface\{IID}加载配套代理存根 DLL;
    • 将 COM 接口入参按 NDR 网络数据表示序列化;RPC 返回后反序列化,提供代理对象给客户端;客户端调用代理,由代理转发 RPC 请求至真实服务对象博客园。
  4. COM 对象生命周期与引用计数 管理IUnknown::AddRef / Release引用计数;处理对象断开、代理销毁;跨进程场景维护存根生命周期;处理 MTA/STA 单元间接口封送 (列集 / 散集)。
  5. DCOM 安全层封装 封装 SSPI 安全调用;读取AppID注册表访问权限、启动权限 ACL;把安全参数向下透传给 RPC 层;远程 DCOM 激活时参与身份、权限校验;返回E_ACCESSDENIED安全错误码博客园。
  6. 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的激活路径。
  1. 进程加载特性 ole32.dll 被每一个使用 COM 的进程加载;客户端、COM 服务端进程均加载;不是单独服务进程,是进程内 DLL。

    rpcss.dll 只驻留在 rpcss.exe;ole32.dll 每个进程一份实例。

  2. 双向依赖:ole32.dll ↔ rpcrt4.dll ole32 依赖 rpcrt4 做 RPC 传输、NDR 序列化;rpcrt4 向上回调 ole32 完成 COM 代理‑存根调度博客园。
  3. 权限依赖
    • 进程内 Inproc COM:继承调用进程权限;
    • Out‑of‑process DCOM 组件:激活权限由 AppID ACL 控制;ole32/rpcss 共同校验启动权限;普通用户无法启动高权限 DCOM 组件返回0x80070005 E_ACCESSDENIED
  4. 线程模型强约束 ole32 严格执行 STA/MTA 契约;STA 组件 COM 对象只能被创建线程调用;跨线程调用必须经过 ole32 接口列集;违反线程模型直接造成死锁、内存损坏、随机崩溃
  5. 版本绑定 ole32.dll、combase.dll、rpcrt4.dll、rpcss.dll 版本必须系统匹配;禁止外部拷贝替换 ole32.dll,会造成整个 COM 子系统崩溃。
  6. 和之前系统组件的关系
    • vssapi.dll/vdisk.dll/dmutil.dll:上层 COM 客户端库,内部全部调用 ole32.dll 的CoCreateInstance
    • vssvc.exe、vds.exe、dmadmin.exe:COM 服务进程,自身也加载 ole32.dll,用于注册 COM 类工厂到 rpcss 端点映射器。

四、配套链

上层调用组件(全部依赖 ole32.dll)

  1. 系统 COM 客户端库:vssapi.dllvdisk.dlldmutil.dll、WMI 客户端 wbemcli.dll。
  2. 系统工具:diskpart.exediskmgmt.mscdcomcnfg.exe、PowerShell COM 对象。
  3. COM 服务进程:vssvc.exevds.exedmadmin.exedllhost.exe(COM Surrogate)wmiprvse.exe
  4. 应用程序: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:获取类工厂 IClassFactory
  • CoMarshalInterface / CoUnmarshalInterface:接口列集散集(跨进程指针传递)
  • CoUninitialize:反初始化 COM 库

五、逻辑链路(时序示例:客户端创建 VSS COM 对象)

  1. 客户端进程调用CoInitializeEx,ole32.dll 初始化本线程 COM 单元(STA/MTA)。
  2. 调用CoCreateInstance(CLSID_VssSnapshotSet, ...)
  3. ole32 读取注册表 CLSID,识别该 CLSID 为Out‑of‑process COM 服务器,对应 AppID。
  4. ole32 封装 DCOM 激活请求,调用 rpcrt4.dll 发起 LRPC 调用,请求 rpcss.exe 进行对象激活。
  5. rpcss.dll (rpcss.exe) 完成 ACL 校验;若 vssvc.exe 未运行则启动 vssvc.exe。
  6. vssvc.exe 内部加载 ole32.dll,注册 VSS COM 类工厂到 rpcss 的 EPM 端点映射数据库。
  7. rpcss 将 LRPC 通信端点返回客户端 rpcrt4.dll。
  8. rpcrt4.dll + ole32 共同生成COM 代理对象;代理对象伪装成本地接口指针返回上层调用。
  9. 上层调用 VSS 接口方法;调用进入 ole32 代理,再经由 rpcrt4 序列化,LRPC 发送至 vssvc.exe;服务端存根反序列化执行真实业务逻辑。
  10. 业务完成调用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 边界

  1. InprocServer32 (DLL 组件):加载到调用者进程内部;组件崩溃直接造成客户端进程崩溃;
  2. LocalServer32 / DllSurrogate (dllhost.exe):独立进程隔离;组件崩溃不会直接弄死客户端。

3 DCOM 远程激活边界

  • 本机 COM:LRPC (ALPC) 内核 IPC,不使用 TCP 端口;
  • 跨机器 DCOM:目标机器 TCP 135 端口 (rpcss 监听),返回动态 RPC 端口;防火墙必须放行 135 与 DCOM 动态端口范围。

4 注册表 CLSID/AppID 边界

  1. CLSID 缺失:返回 REGDB_E_CLASSNOTREG(0x80040154),ole32 找不到 COM 类;
  2. 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 常见故障现象

  1. 0x80040154 REGDB_E_CLASSNOTREG:CLSID 未注册;ole32 读取注册表失败。
  2. 0x80070005 E_ACCESSDENIED:DCOM AppID 启动 / 访问 ACL 校验拒绝。
  3. 0x800706BA RPC服务器不可用:rpcss 服务未运行、远程 135 端口不通。
  4. ole32.dll 访问冲突 0xc0000005:COM 组件内存损坏、线程模型违规、代理‑存根版本不匹配。
  5. 进程退出卡死在CoUninitialize:COM 对象引用计数泄漏。

高频认知误区

  1. ❌误区:ole32.dll 运行在 rpcss.exe;✅ole32.dll 加载在每一个 COM 客户端与 COM 服务进程;rpcss.exe 内部运行 rpcss.dll
  2. ❌rpcrt4.dll 等于 ole32.dll;✅ole32 是 COM 上层对象模型;rpcrt4 是底层 RPC 传输库,二者分工明确双向依赖。
  3. ❌CoCreateInstance 总是启动新进程;✅进程内 Inproc COM 直接 DLL 加载,不涉及 rpcss.exe。
  4. ❌远程 COM 调用流量全部经过 rpcss.exe;✅rpcss 仅负责激活与端点查询;会话建立完成后点对点通信。

combase.dll 完整解构

combase.dllWindows 现代 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实现。

  1. 现代 COM 单元模型实现 实现 STA / MTA / ASTA(异步单线程单元)/ NA 中性单元;重构线程‑对象亲和调度;提供异步 COM 调用基础设施;修复旧 ole32 时代部分死锁、消息循环缺陷。CoInitializeExCoUninitialize在新版系统,ole32 直接转发到 combase 内部实现。
  2. COM 对象激活引擎
  • 支持传统:InprocServer32、LocalServer32、DllSurrogate (dllhost.exe);
  • 新增支持:WinRT 激活、打包应用 (MSIX) COM 注册、隔离 COM、注册 Free COM (无注册表 CLSID)
  • 读取 CLSID/AppID;处理进程内加载、跨进程 DCOM 激活请求;把 DCOM 激活请求向下交给rpcrt4.dll,经由 LRPC 发送rpcss.exe(rpcss.dll)完成进程启动、端点查询。
  1. Proxy‑Stub 列集 / 散集引擎重构 重构 NDR 序列化封装;支持传统 COM 接口,同时支持 WinRT 接口元数据;处理跨线程、跨进程、跨机器接口封送;支持异步接口调用模式,弥补旧 ole32 同步调用短板。
  2. 对象生命周期与引用计数管理 实现IUnknown引用计数基础;处理代理 / 存根生命周期、断开连接、幽灵代理 (ghost proxy);COM 对象泄漏检测基础设施;处理单元边界对象迁移。
  3. DCOM 安全层 封装 SSPI;解析 AppID ACL、Capability 权限;支持容器化、MSIX 打包应用的 COM 安全隔离;把安全参数透传给 RPC 层;生成E_ACCESSDENIED等标准 HRESULT。
  4. WinRT 底层支撑 WinRT (Windows Runtime) 构建在 combase 之上;IInspectable接口、语言投影、元数据解析,底层由 combase 提供基础 COM 对象模型;WinRT 本质是COM 的超集
  5. 兼容层转发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 / 打包应用进程)

关键区分

  1. ole32.dll:传统 OLE‑COM,保留复合文档、老旧 OLE 接口;大量逻辑转发 combase。
  2. combase.dll:Win8 + 现代 COM,重构内核,同时是 WinRT 运行时底座。
  3. 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 → 上层应用
  1. 进程加载边界combase.dll加载在每一个 COM/WinRT 使用的进程内,不是独立服务进程;rpcss.dll 只驻留在 rpcss.exe。
  2. 依赖单向关系
  • ole32.dllcombase.dll(新版系统大量 API 转发)
  • combase.dllrpcrt4.dll(RPC 传输、NDR 序列化)
  • combase.dll不直接和 rpcss.dll 通信;全部 RPC 请求经由 rpcrt4.dll 中转。
  1. 权限依赖
  • Inproc 组件继承调用进程权限;
  • Out‑of‑process DCOM:AppID ACL 校验由rpcss.dll执行;combase 负责封装激活参数、接收返回代理。
  1. 线程模型强约束 combase 严格执行 STA/MTA/ASTA 契约;违规跨线程直接造成死锁、内存损坏、幽灵代理。新增ASTA 异步单线程单元,支持异步回调,旧 ole32 不具备。
  2. 版本绑定combase.dllole32.dllrpcrt4.dllrpcss.dll必须系统版本匹配;禁止单独拷贝替换 combase.dll,会摧毁 COM+WinRT 整个子系统
  3. 和已有系统组件关系
  • VSS/VDS/DMutil:上层 COM 客户端,调用 ole32,最终落到 combase;
  • dllhost.exe、wmiprvse.exe:COM 服务进程内部同样加载 combase.dll,注册类工厂到 rpcss 端点映射器;
  • UWP/MSIX 打包应用:COM 隔离、无注册表 COM,完全依赖 combase 新能力。

四、配套链

上层调用组件

  1. 传统 COM 客户端:vssapi.dllvdisk.dlldmutil.dll、WMI 客户端 wbemcli.dll;经由 ole32 转发 combase。
  2. WinRT / UWP / MSIX 应用:RoActivateInstance WinRT 激活 API 直接调用 combase。
  3. COM 服务进程:vssvc.exevds.exedllhost.exewmiprvse.exe
  4. 系统 Shell、设置、现代 Windows 应用。

运维配套命令

dcomcnfg.exe          # DCOM AppID安全配置
sfc /scannow          # 系统组件损坏修复

combase.dll 核心能力模块

  1. COM 单元调度器:STA / MTA / ASTA / NA 线程单元。
  2. 对象激活引擎:传统 CLSID + WinRT 隔离 COM 激活。
  3. Proxy‑Stub 列集引擎:传统 COM 接口 + WinRT IInspectable 接口序列化。
  4. 对象生命周期管理器:IUnknown 引用计数、幽灵代理、断开管理。
  5. DCOM 安全封装层:SSPI 参数封装,ACL 透传。
  6. WinRT 底层基座:IInspectable 对象模型基础。

五、逻辑链路(时序示例:Win11 客户端 CoCreateInstance 激活 VSS 对象)

  1. 客户端调用CoInitializeEx,ole32 收到调用,直接转发至combase.dll,初始化本线程 COM 单元。
  2. 调用CoCreateInstance(CLSID_VssSnapshotSet)
  3. ole32 将参数转交 combase;combase 读取注册表 CLSID,识别为 Out‑of‑process COM,获取 AppID。
  4. combase 封装 DCOM 激活请求,调用 rpcrt4.dll 发起 LRPC 请求,发给 rpcss.exe。
  5. rpcss.dll 执行 ACL 校验;如 vssvc.exe 未运行,则启动 vssvc.exe。
  6. vssvc.exe 内部加载 ole32 → combase.dll;VSS 服务注册 COM 类工厂到 rpcss EPM 端点映射。
  7. rpcss 返回 vssvc.exe 的 LRPC 通信端点。
  8. rpcrt4.dll 接收端点,combase.dll 生成 COM 代理对象,代理接口指针逐层向上返回上层代码。
  9. 上层调用 VSS 接口方法;调用进入 combase 代理,rpcrt4 序列化,LRPC 发送 vssvc.exe;服务端 combase 存根反序列化执行业务。
  10. 业务完成调用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 边界

  1. InprocServer32:COM DLL 加载到调用进程;组件崩溃直接造成调用进程崩溃;
  2. LocalServer32 / DllSurrogate (dllhost.exe):独立进程隔离。

5 DCOM 远程边界

本机:LRPC (ALPC) 内核 IPC,不走 TCP; 跨机器 DCOM:目标机器 TCP135 (rpcss 监听)+ 动态端口;防火墙放行对应端口。

6 故障现象

  1. 0x80040154 REGDB_E_CLASSNOTREG:CLSID 不存在,combase 解析注册信息失败。
  2. 0x80070005 E_ACCESSDENIED:rpcss 的 AppID ACL 校验拒绝;combase 仅透传请求。
  3. 进程挂起卡死:ASTA/STA 线程模型误用,combase 调度死锁。
  4. UWP 应用 COM 调用失败:隔离 COM 清单配置错误,combase 无法定位激活类。
  5. combase.dll 0xc0000005访问冲突:代理‑存根版本不匹配、跨线程非法调用接口指针、内存损坏。

高频认知误区

  1. ❌误区:combase.dll 替代 ole32.dll;✅不是完全替代,ole32 保留 OLE 遗留接口,现代 COM 路径转发 combase
  2. ❌combase.dll 运行 rpcss.exe;✅combase.dll 加载在客户端 / 服务业务进程;rpcss.exe 运行 rpcss.dll,二者分工明确。
  3. ❌Win7 系统存在 combase.dll;✅Win7 无 combase.dll。
  4. ❌WinRT 是完全独立于 COM 的技术;✅WinRT 是 COM 的扩展,底层对象模型完全构建于 combase.dll。

DiskSnapshot(Windows Server 磁盘快照)完整解构

说明:DiskSnapshot 为 Windows Server 系列内置磁盘快照工具 / 能力,基于 VSS (Volume Shadow Copy Service) 卷影副本框架,把时间点卷快照导出为 VHD/VHDX 虚拟磁盘文件;区别于普通 VSS 卷影副本(仅本地卷内差异快照),DiskSnapshot 输出独立虚拟磁盘镜像文件。 分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界

一、底层原理

DiskSnapshot 不是独立全新快照内核,是VSS 上层应用工具链

  1. 第一步调用 VSS COM 接口,对目标磁盘 / 卷创建时间点一致性卷影副本(Snapshot/Shadow Copy),借助volsnap.sys内核过滤驱动完成 Copy‑On‑Write 写时复制,获取卷静态时间点视图。
  2. 在快照只读视图之上,执行块级拷贝,把整个卷块流导出为独立 VHD/VHDX 虚拟磁盘文件,输出的 VHDX 是脱离原系统的离线镜像,可挂载到其他 Windows 主机、Hyper‑V 虚拟机。
  3. 两种工作模式
    • 模式 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 驱动参数、快照配额、超时配置。

三、依赖关系

  1. 服务启动依赖链 RPCSS(RPC) → VSS(Volume Shadow Copy) → swprv(Software Shadow Copy Provider)

VSS 服务不运行,DiskSnapshot 直接报错,无法创建快照。

  1. 内核驱动依赖链volsnap.sys存储过滤驱动挂载在 NTFS/ReFS 文件系统栈之上;必须 NTFS 或 ReFS,FAT32/exFAT 不支持 VSS 快照,DiskSnapshot 无法工作
  2. 组件调用依赖disksnapshot.exe → VSS COM 接口 (IVssSnapshotMgmt) → vssvc.exe → swprv.dll → 下发 IOCTL 到内核volsnap.sys拿到快照只读卷视图 → 调用vdisk.dll块拷贝写入 VHD/VHDX 文件。
  3. 权限依赖必须本地管理员权限;普通用户无法调用 VSS 创建快照、无法执行块级导出 VHDX。
  4. Writer 依赖(可选) 当不使用‑nowriters参数,DiskSnapshot 会加载系统注册 VSS‑Writer(SQL、Exchange、NTDS 等),Writer 依赖 WMI、DCOM 环境。
  5. 存储依赖
  • 创建 VSS 快照阶段:源卷必须预留 ShadowStorage 差异存储空间;
  • 导出阶段:输出路径磁盘需要足够空闲空间存放完整 VHD/VHDX 镜像。

四、配套链

4.1 同体系配套工具

  1. diskshadow.exe:Windows Server 内置交互式 VSS 脚本工具,管理卷影副本快照,可 expose 挂载快照卷,但不直接导出 VHDX
  2. vssadmin.exe:查看 / 删除卷影副本,管理 ShadowStorage 快照存储配额。
  3. vshadow.exe:SDK 示例工具,创建持久快照。
  4. 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 离线挂载读取内容。

五、逻辑链路(完整时序)

  1. disksnapshot.exe启动,校验管理员权限,读取源磁盘卷布局信息。
  2. 请求 VSS COM 接口,发起创建快照集;RPC 通信交给vssvc.exe
  3. VSS 服务执行快照准备:
    • 如果不带/nowriters:枚举全部 VSS‑Writer,通知各应用准备备份,刷新内存缓存、冻结应用写入 IO(最大冻结时间 60 秒)Microsoft ...。
    • 调用系统快照 Provider swprv.dll,下发指令至内核volsnap.sys
  4. volsnap.sys过滤驱动挂载到源卷 IO 栈,建立 Copy‑On‑Write 机制,生成卷影副本只读时间点视图。
  5. Writer 解冻,业务应用恢复正常读写;此时源卷继续运行不中断。
  6. DiskSnapshot 拿到快照卷的只读设备路径;通过vdisk.dll创建目标 VHDX 虚拟磁盘文件。
  7. 块级别循环读取快照卷(只读快照视图),逐块写入输出 VHDX 文件。
  8. VHDX 导出完成,自动清理临时 VSS 卷影副本(DiskSnapshot 生成的临时快照默认不持久驻留)。
  9. 返回成功 / 失败,输出日志;生成的 VHDX 文件可离线挂载使用。

重点:导出 VHDX 是块拷贝 IO 密集操作,创建快照本身极快;耗时主要在后面块复制写 VHDX 文件

六、边界(约束、坑点、失效条件)

1 文件系统边界

  • ✅支持:NTFS、ReFS;
  • ❌不支持:FAT32、exFAT,无法创建 VSS 快照,DiskSnapshot 直接失败。

2 卷大小硬限制

VSS 系统 Provider 不支持大于 64TB 卷做快照;源卷 > 64TB,DiskSnapshot 报错 0x80042306Microsoft ...。

3 快照 Writer 模式边界

  1. 不带/nowriters:依赖业务 VSS‑Writer 正常;如果 SQL/Exchange Writer 异常、崩溃,整个快照流程直接失败。
  2. /nowriters:跳过应用 Writer,数据库会得到崩溃一致性镜像,数据库需要事后做修复,不可直接挂载启动业务,仅适合文件数据卷。

4 快照数量边界

单卷 VSS 卷影副本上限 64 个;DiskSnapshot 内部临时快照也计入配额;配额满无法新建快照,报错0x80042317

5 存储空间边界

  1. 快照阶段:源卷 ShadowStorage 配额不足,快照创建失败;
  2. 导出阶段:输出 VHDX 目标磁盘空间不足,导出中途中断,产生损坏不完整 VHDX。

6 权限边界

必须管理员;UAC 未提升权限直接执行会静默失败。

7 输出产物边界

  • DiskSnapshot 输出 VHD/VHDX 是完整块拷贝镜像,不是增量快照;每次执行输出完整镜像文件;
  • DiskSnapshot 内部使用的临时快照,导出完成后自动删除,不会残留在系统;区别 vssadmin 创建持久化卷影副本。

8 故障失效条件

  1. VSS 服务停止、swprv 组件注册损坏 → 无法创建快照;
  2. volsnap.sys驱动损坏、未加载 → COW 快照机制失效;
  3. 第三方安全软件 / 存储过滤驱动与 volsnap 冲突 → IO 拦截异常,快照报错;
  4. 冻结 IO 超过 60 秒超时:应用 IO 冻结超时,VSS 自动终止快照流程,DiskSnapshot 失败Microsoft ...;
  5. 虚拟机内部运行 DiskSnapshot:仅对虚拟机内逻辑卷生效,不能绕过 Hyper‑V 拿到宿主机物理磁盘快照。

9 重要认知误区

  1. DiskSnapshot≠VSS;DiskSnapshot 是VSS 上层导出工具,真正快照内核仍然是 volsnap.sys;
  2. 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"命令应用指定的磁盘快照,以还原磁盘状态。

posted @ 2023-10-30 00:54  suv789  阅读(842)  评论(0)    收藏  举报