文件过滤驱动中,VPB(卷参数块),它将文件系统卷设备和磁盘设备卷设备联系起来,结构如下:
typedef struct _VPB {
    CSHORT Type;
    CSHORT Size;
    USHORT Flags;
    USHORT VolumeLabelLength; // in bytes
    struct _DEVICE_OBJECT *DeviceObject;
    struct _DEVICE_OBJECT *RealDevice;
    ULONG SerialNumber;
    ULONG ReferenceCount;
    WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
} VPB, *PVPB;
realdevice 指向磁盘设备产生的卷设备,deviceobject指向文件系统产生的卷设备。
下面讨论几个问题。
1. 哪些结构拥有VPB指针?
 FILE_OBJECT, DEVICE_OBJECT
2. 所有的设备对象都需要VPB这个结构吗?
 只有磁盘设备,虚拟磁盘设备,cd-rom设备,磁带设备拥有,即设备类型是FILE_DEVICE_DISK, FILE_DEVICE_VIRTUAL_DISK,FILE_DEVICE_CD_ROM,FILE_DEVICE_TAPE。
3. VPB是如何诞生的?
根据2的解释,顾名思义,是在创建2中描述的设备成功后,诞生的,具体的可以参考reactos的代码,即iocreatedevice里面产生这个对象的。并且进行了初始化,
NTSTATUS NTAPI IopCreateVpb(PDEVICE_OBJECT DeviceObject)
{
PVPB Vpb;
        Vpb = ExAllocatePoolWithTag(NonPagedPool, sizeof(VPB), TAG_VPB);
if (!Vpb) return STATUS_UNSUCCESSFUL;

RtlZeroMemory(Vpb, sizeof(VPB));
        Vpb->RealDevice = DeviceObject;
        Vpb->Type = IO_TYPE_VPB;
        Vpb->Size = sizeof(VPB);
        DeviceObject->Vpb = Vpb;
        return STATUS_SUCCESS;
}
这里初始化了vpb,也初始化了磁盘设备的VPB,文件系统卷设备的初始化,是在该设备挂载完成后,完成前Vpb->DeviceObject是无效的。

Vpb的销毁没试过,我猜是磁盘设备卸载后才会销毁,否则一直存在,而且同一磁盘卷设备,vpb只有一份,无论是fileobject还是deviceobject里面的。

注意:文件系统卷设备不是2中的类型,故Vpb 为null。

4. Vpb的使用
1) IoGetRelatedDeviceObject函数中,先看实现:
 

对于非2中的那些设备类型,该函数直接该文件对象结构中的设备对象。
对于2中的那些设备类型,如果文件系统卷设备已经挂载完成,则fileobject->vpb是存在的,那么直接可以返回fileobject->vpb->deviceobject,即文件系统卷设备;如果文件系统卷设备挂载还在进行中,那么fileobject->vpb可能不存在,返回fileobject->devieobject->vpb->deviceobject,还是文件系统卷设备。
文件系统卷设备挂载完成后,
fileobject->vpb = fileobject->deviceobject->vpb;
fileobject->deviceobject=fileobject->vpb->realdevice

2) 在做文件系统过滤驱动时,当需要动态绑定新增的磁盘时,即文件系统控制设备收到irp_mj_file_system_control的IRP时,irpSp->Parameters.MoutVolume.Vpb字段即是上面讨论的挂载过程中的vpb,该vpb还不稳定,vpb->deviceobject还未初始化,必须挂载完成后才会初始化。

这里先讨论下这个irp和vpb,这个irp的来源,当然是磁盘卷设备,即磁盘卷设备创建后,创建了vpb,完成了部分初始化,然后通知文件系统开始装载这个卷,根据设备系统,来通知对应的文件系统,这里涉及到文件系统识别器,它来负责激活对应的文件系统,当文件系统激活后,创建一个irp,发给对应的控制设备,在这个irp的创建过程中,会将磁盘设备对象的vpb初始化到irpSp->Parameters.MoutVolume.Vpb字段上,将该irp发给文件系统控制设备。

sfilter的代码中,我们自己会创建设备,来attach这个文件系统控制设备上,目的是为了拦截这个irp,然后在vpb->deviceobject这个对象挂载完成后,再进行attach。

注意:这个IRP完成之前,白书上说,irpSp->Parameters.MoutVolume.Vpb可能会被设备栈的其他设备修改,故该指针不能一直使用,不过我们可以取出里面的realdevice,即磁盘的真实卷设备,然后在该irp完成之后,再根据devieobject->vpb,取出vpb->devieobject,即文件系统产生的卷设备,然后进行attach即可。

文件过滤驱动 VPB 卷参数块 生命周期 IoGetRelatedDeviceObject相关推荐

  1. 基于Minifilter框架的文件过滤驱动理解

    概述 Minifilter即File System Minifilter Drivers,是Windows为了简化第三方开发人员开发文件过滤驱动而提供的一套框架,这个框架依赖于一个称之为Filter ...

  2. 文件过滤驱动实现目录重定向(一)

    By Fanxiushu  2015 转载或引用请注明原始作者 谈论这个问题前,先看看一个情况: 比如你上班的公司,可能有多个文件服务器,这些文件服务器通过FTP或者远程共享目录方式提供目录共享. 而 ...

  3. Windows 文件过滤驱动经验总结

    by ai3000 看了 ChuKuangRen 的第二版<文件过滤驱动开发教程>后,颇有感触.我想,交流都是 建立在平等的基础上,在抱怨氛围和环境不好的同时应该先想一想自己究竟付出了多少 ...

  4. TTEFS - 基于文件过滤驱动的透明加密内核

    更多产品信息:  http://www.byte2code.com 1产品综述 1.1产品简介 TTEFS(True Transparent Encryption File System)是一款文 ...

  5. android 文件过滤驱动,自己写的Xuetr工具驱动读写过滤驱动,并奉献上源码

    [C] 纯文本查看 复制代码#include /* First Driver */ //未文档化的函数->通过名字获取设备对象 NTKERNELAPI NTSTATUS ObReferenceO ...

  6. vc实现用文件系统过滤驱动实现文件隐藏的类

    调用一个开源的文件过滤驱动, 头文件 typedef struct _ATTACH_EXTENSION {      CHAR   VolumeLetter;   PDEVICE_OBJECT Vol ...

  7. Windows 文件系统过滤驱动开发教程 (第二版)

    Windows 文件系统过滤驱动开发教程 (第二版)       楚狂人-2007-上海 (MSN:walled_river@hotmail.com)          -1.  改版序....... ...

  8. Windows驱动_文件系统微小过滤驱动之一初识MiniFilter

    人的一生,就那么几十年,所有的人都无法知道下一刻会发生什么,我们活在当下,只能努力将自己目前的工作或生活过好.船到桥头自然直,况且,自己这么多年,经历了多多少少的风浪太多了,说到底还是不够自信,我应该 ...

  9. 文件系统过滤驱动开发(一)—Win32底层开发小组

    声明:本文无太多新意,只是介绍下学习经验,大神级人物(如总监大人)请略过,谢谢合作>_< 吐槽一下:学驱动算起来也是从上学期9月份开始吧,之前在家买了<Windows驱动开发技术详解 ...

最新文章

  1. 实验LVS+keepalived
  2. Service Mesh 和 API Gateway 关系深度探讨
  3. lombok链式调用_记一次使用 Lombok 翻车造成的事故!
  4. ICMP:Internet控制报文协议
  5. python odoo_odoo python 使用缓存
  6. Hadoop HA 深度解剖
  7. java 获取远程文件_java获取远程文件
  8. 除了写代码,还能如何晋升为高级工程师?
  9. java网络蜘蛛_基于java网络蜘蛛程序
  10. 后端提供的excel文档流如何下载?——前端基础知识
  11. 【聚类分析】基于FCM聚类实现交通干道车流量聚类分析及预测含Matlab源码
  12. 杂记【1】win10 密钥模式SSH登录CentOS7
  13. 代码托管平台的待办事项你知道吗 ?|GitCode
  14. linux增加/删除虚拟IP地址
  15. 10年资深DBA老郭(门下已出多位DBA学生)老男孩MySQL DBA标杆班实战视频教程
  16. 2022施工员-土建方向-通用基础(施工员)理论题库模拟考试平台操作
  17. IntelliJ IDEA 2018.3 x64 安装激活教程(全面)
  18. 股票及炒股票的基础知识
  19. Linux进程僵死原因排查思路
  20. python3 安装urllib3

热门文章

  1. 【BZOJ】4355: Play with sequence
  2. html制作图像画廊,创建 Web 照片画廊 (Photoshop)
  3. java后端中GET 和 POST 底层原理,深入了解一下
  4. Redis修行 — 基数统计:HyperLogLog
  5. Postman进阶篇动态参数、自定义动态参数及自定义动态参数全局变量断言
  6. 开机时间分析工具WPT Xperf使用
  7. bzoj 3036: 绿豆蛙的归宿
  8. 旧版微信内置浏览器x5核心无法打开,安装内核提示“内核下载失败115→115”,有相同情况吗
  9. http://mirrors.aliyun.com/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - “Could not res
  10. 《牛客刷verilog》Part III Verilog企业真题