首页
社区
课程
招聘
[原创]DiskPerf详解
发表于: 2015-3-16 14:38 11689

[原创]DiskPerf详解

2015-3-16 14:38
11689
DiskPerf - Disk Performance - 磁盘卷过滤驱动
d:\WinDDK\7600.16385.1\src\storage\filters\diskperf

DeDf:1815349357

本文代码直接来自Aod傲盾还原,细读发现其代码是寒江独钓里的代码,不过笔者做了一些改动。如果有版权发帖不妥,请联系告知笔者。
Q:你为什么要改diskperf,它不是很稳定么?
A:对某份源码的改动,使之从笔者角度看更好,固然开始会弄出BUG,但调试过程中,能学到和理解更多东西。然后一段时间后,A可能能学会写好的框架,而Q则会成为某框架的高端VIP用户。
文附代码目前能在笔者笔记本良好工作,起码能支持笔者完成这篇贴文。。

DriverEntry:
为全局的UNICODE_STRING g_RegistryPath分配空间,并把驱动的RegistryPath拷贝到g_RegistryPath。
初始化所有的IRP_MJ_XXX函数。
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL]  = DiskPerfWmi;
可见IRP_MJ_SYSTEM_CONTROL请求主要是WMI组件发送的。

DiskPerfAddDevice:
创建过滤设备并附加到下层设备,其中每个过滤设备有自己的设备扩展,设备扩展里有若干个(对应CPU核个数)DISK_PERF_COUNT结构,并且有一个WMILIB_CONTEXT结构来协助处理WMI请求。
设备扩展中的如下两个变量,
KEVENT PagingPathCountEvent;
ULONG  PagingPathCount;  // 页面文件的数量
是当系统打算在被过滤的卷上、建立页面文件时,要用到的;PagingPathCountEvent会在这里初始化。

DiskPerfDispatchPnp:
处理PNP请求;
IRP_MN_START_DEVICE 时调用DiskPerfStartDevice;
IRP_MN_REMOVE_DEVICE时调用DiskPerfRemoveDevice;
IRP_MN_DEVICE_USAGE_NOTIFICATION ---
当irpSp->Parameters.UsageNotification.Type 等于 DeviceUsageTypePaging时,
说明系统要在这个卷上建立页面文件了,发这个请求来询问设备是否支持;
irpSp->Parameters.UsageNotification.InPath 为TRUE 表示添加特殊文件(页面文件等),为 FALSE 表示移除。
具体代码里,实际上是当卷上存在页面文件时,要去除过滤设备DeviceObject->Flags的DO_POWER_PAGABLE标志。

其他PNP请求就直接下发了。

DiskPerfStartDevice:
先下发该IRP并等待其完成,设置过滤驱动的Characteristics,调用DiskPerfRegisterDevice,然后完成这个IRP。

DiskPerfRemoveDevice:
调用IoWMIRegistrationControl解除WMI的注册,去除过滤设备的挂接,并删除过滤设备,完成IRP。

DiskPerfReadWrite:
Read/Write的时候,获取一次TimeStamp,设置一个完成函数,完成的时候再获取一次TimeStamp,两次之差便是Read/Write的时间。
其中性能计数是分每个CPU核心存储的。
deviceExtension->QueueDepth这个变量其实是表示读写的状态的,当有一个读/写操作到来时,就+1,该操作完成时,就-1。可见当QueueDepth从0变1的时间,就是空闲时间。

DiskPerfIoCompletion:
这是读写操作的完成函数,主要是计算并写入性能计数。

DiskPerfDeviceControl:
除了IoControlCode 等于 IOCTL_DISK_PERFORMANCE,其他情况直接下发。
IoControlCode 等于 IOCTL_DISK_PERFORMANCE时,把每个cpu核心的计数值累加一下,返回应用层。

DiskPerfWmi:
只是调用WmiSystemControl,配合deviceExtension->WmilibContext,系统会代做部分WMI的处理。

DiskPerfRegisterDevice:
代码挺长的,不过都是IoBuildDeviceIoControlRequest创建请求向下层请求数据,最后IoWMIRegistrationControl注册WMI。

后面是3个WMI的处理函数,略。

DiskPerfAddCounters:
累加各性能计数。

-END-

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
  • 1.ZIP (12.34kb,53次下载)
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 35
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
下来看看
2015-4-1 15:06
0
游客
登录 | 注册 方可回帖
返回
//