白话VPB(volume parameter block)
为什么要绑定FS的CDO设备?
楚狂人在《Windows文件系统过滤驱动开发教程(第二版)》中写道:
“一个新的存储媒质被系统发现并在文件系统中生成一个Volume的过程称为Mounting.其过程开始的时候,FS的CDO将得到一个IRP,其Major Function Code为IRP_MJ_FILE_SYSTEM_CONTROL,Minor Function Code为IRP_MN_MOUNT。换句话说,如果我们已经生成了一个设备绑定文件系统的CDO,那么我们就可以得到这样的IRP,在其中知道一个新的Volume正在Mount.这时候我们可以执行上边所说的操作”
我们以微软源码sfilter进行分析
在我的另一篇《windows内核编程 白话设备栈》(http://blog.csdn.net/sqqsongqiqi/article/details/42297229)一文中截取一幅图
图1
如图1,我们的Sfilter!FiDO绑定在Ntfs!CDO之上。
在DriverEntry中设置IRP_MJ_FILE_SYSTEM_CONTROL的IRP处理函数:
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL]=SfFsControl;
下面我们用WinDBG来分析 SfFsControl 函数
在函数
NTSTATUS
SfFsControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)中 传入的 参数信息:
图2
DeviceObject的地址是0x86337998,是绑定在Ntfs!CDO上的FiDO的地址。这时候说明我们已经截获了发送给FS的IRP_MJ_FILE_SYSTEM_CONTROL。
我们记录下storageStackDeviceObject= irpSp->Parameters.MountVolume.Vpb->RealDevice;
图3
typedef struct_VPB {
CSHORT Type;
CSHORT Size;
USHORT Flags;
USHORT VolumeLabelLength;// inbytes
struct _DEVICE_OBJECT *DeviceObject; //文件系统上的卷设备对象
struct _DEVICE_OBJECT *RealDevice; //实际存储媒介设备对象
ULONG SerialNumber;
ULONG ReferenceCount;
WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH/sizeof(WCHAR)];
} VPB, *PVPB;
这里截取的IRP我们只能取出RealDevice,DeviceObject这个设备要到文件系统处理完之后才能取得。
新建一个FiDO
status = IoCreateDevice( gSFilterDriverObject,
sizeof( SFILTER_DEVICE_EXTENSION ),
NULL,
DeviceObject->DeviceType,
0,
FALSE,
&newDeviceObject );
图4
newDeviceObject的地址是0x861b73f8
newDevExt =newDeviceObject->DeviceExtension;
newDevExt->StorageStackDeviceObject =storageStackDeviceObject;
调用ObQueryNameString查询StorageStackDeviceObject 的设备名
图5
接下来调用 status= IoCallDriver( devExt->AttachedToDeviceObject, Irp );交给Ntfs!CDO处理
图6
Ntfs!CDO处理完之后生成VPB->VDO(0x8626a020)
图7
NTFS!VDO->NextDevice(0x862c8270)正是NTFS!CDO(0x862c8270)
图8
绑定FiDO到NTFS!VDO设备上
status = SfAttachDeviceToDeviceStack(
vpb->DeviceObject,
FiDO,
&newDevExt->AttachedToDeviceObject );
图9
最后我们绘制出FiDO附着在VDO上的全图
图10
白话VPB(volume parameter block)相关推荐
- 推荐一款截图神器——FSCapture
FSCapture FSCapture是一款抓屏工具,体积小巧.功能强大,不但具有常规截图等功能,更有从扫描器获取图像,和将图像转换为 PDF文档等功能.还有图片编辑,屏幕录像,编辑视频等强大的功能. ...
- 内核文件管理-IRP(一)创建或打开文件
内核下通过直接向 FSD (File System Driver) 发送 IRP (I/O Request Packet)来管理文件,可以绕过一些 API Hook. 本文讲怎样通过向 FSD 发送 ...
- C/C++ 实现文件透明加解密
今日遇见一个开超市的朋友,真没想到在高校开超市一个月可以达到月净利润50K,相比起我们程序员的工资,真是不可同日而语,这个世道啊,真是做程序员不如经商开超市, 我们高科技的从业者,真是造原子弹不如卖茶 ...
- Windows 文件系统过滤驱动开发教程 (第二版)
Windows 文件系统过滤驱动开发教程 (第二版) 楚狂人-2007-上海 (MSN:walled_river@hotmail.com) -1. 改版序....... ...
- Nova 启动虚拟机流程解析
目录 文章目录 目录 前言 从请求说起 nova-api service 阶段 前言 Nova 启动虚拟机的东西太多,持续更新- 从请求说起 无论是通过 Dashboard 还是 CLI 启动一个虚拟 ...
- 图表控件 c++_用C/C++编写16位虚拟内核
文章的范围是什么? 在本文中,我将试图简要介绍文件系统在引导加载程序中的重要性,并尝试编写一个虚拟内核,它只会显示一个提示,让用户输入文本.为什么我要嵌入我的引导加载程序到一个脂肪格式的软盘,它是如何 ...
- 操作系统真像还原 - MBR主引导程序初体验
;主引导程序 ;------------------------------------------------------------ SECTION MBR vstart=0x7c00mov ax ...
- 翻译《文件系统取证分析》第13章
第13章 NTFS 数据结构 这是关于NTFS的第三章亦是最后一章,这里我们将分析它的数据结构.前两章写了它的基本概念和怎么去解析它.对许多人来说,目前为止所涉及的知识已经足够了,但我们中的其他人想知 ...
- Windows引导过程(BIOS,UEFI)
通电后CPU首先执行的是主板引导程序,主板引导程序可分为BIOS和UEFI.BIOS是最早的方案,搭配MBR分区使用,BIOS逐渐被UEFI代替,UEFI一般搭配GPT分区使用,所以引导过程会有两种情 ...
最新文章
- 你们要的圣诞帽~ Python实现
- map可以用结构体作为健值吗?
- 随想录(matlab学习)
- ccd相机好修吗_CCD到底值不值得买,CCD相机入坑全过程
- C#基础6:枚举与结构体
- python json dump_为什么json.dump()没有以\ n结尾? - python
- day060 中间件及session源码
- java中参数 ...的用法和意思
- 小米手机开启开发者模式以及INSTALL_FAILED_USER_RESTRICTED报错处理
- 【澳大利亚英语】我的英语笔记。。。
- TCP/IP协议(2):各层网络设备
- C# 用户自定义控件添加到工具箱
- 基于javaee的社区医院远程挂号系统
- [Neo4j] CQL命令
- zcu104 AXI DMA速度测试总结
- 玩游戏计算机频繁重启,win7系统玩lol游戏电脑总是重启如何解决
- ios和android游戏平台,iOS和Android平台上的10款益智游戏
- java structs_Structs2 Action使用
- 2020焊工(高级)考试题及焊工(高级)考试软件
- python爬取下载m3u8加密视频,原来这么简单!
热门文章
- 阿龙的学习笔记---《程序员自我修养-链接、装载与库》读书笔记(一)
- JavaEE 面试题总结
- DIV布局 旅游出行网站设计——武汉旅游(11页) HTML+CSS+JavaScript dreamweaver作业静态HTML网页设计模板
- 基于virtuoso IC 618的LDO仿真实验
- 移动端软盘遮盖输入框的解决方案
- matlab汽车驱动力与行驶阻力,用matlab绘制汽车驱动力 行驶阻力平衡图
- ICCV 2021审稿结果出炉,有人已总结出了一份Rebuttal写作指南
- FreeRTOS消息队列
- 让智能更落地,让中台更智能
- “玲珑杯”ACM 热身赛 # 2.5 A-B (数论)