DiskPerf代码分析(供学习驱动开发的朋友参考)

DiskPerf代码分析

总体分析:

Diskperf过滤驱动监视磁盘的存取操作,并且获取磁盘的性能数据。该驱动支持PnP,电源管理和WMI。但该驱动不支持64位平台。

The DiskPerf filter driver monitors disk access and captures performance data. This driver supports Plug and Play (PnP), power management, and Microsoft Windows Management Instrumentation (WMI). This driver is not 64-bit compliant.from wdk》】)

主要函数分析:

1.     DiskEntry函数(详细流程参见流程图DiskEntry.vsd)

NTSTATUS 
DriverEntry( 
    IN PDRIVER_OBJECT DriverObject, 
    IN PUNICODE_STRING RegistryPath 
    ) 
函数说明: 
    可安装驱动的初始化入口点。 
    这个方法直接被I/O管理器调用,用来创建磁盘性能驱动。这里的driver对象创建好, 
    然后Pnp管理器调用DiskPerfAddDevice来把它附加到启动设备上。 
参数: 
   DriverObject – 磁盘性能驱动对象。 
   RegistryPath – 指向一个unicode的字符串,表示路径。 
也就是注册表中,驱动特定的键。 
返回值: 
    STATUS_SUCCESS 如果成功的话

2.     DiskPerfAddDevice函数(详解DiskPerfAddDevice.vsd

NTSTATUS 
DiskPerfAddDevice( 
    IN PDRIVER_OBJECT DriverObject, 
    IN PDEVICE_OBJECT PhysicalDeviceObject 
    )  

函数说明: 
    为对应得物理设备对象(PDO=Physical Device Object)创建一个新的过滤设备对 
象(FiDO)。然后把这个设备对象“粘”到驱动的堆栈上去。 
参数:
    DriverObject – 磁盘性能驱动对象。 
    PhysicalDeviceObject – 下层驱动的物理设备对象。 
返回值: 
    NTSTATUS

3.     DiskPerfDispatchPnP函数(详细流程参见流程图DiskPerfDispatchPnP.vsd

NTSTATUS 
DiskPerfDispatchPnp( 
    IN PDEVICE_OBJECT DeviceObject, 
    IN PIRP Irp 
    ) 
方法说明: 
    PNP分派 
参数: 
    DeviceObject    - 设备对象 
    Irp            - I/O请求包 
返回值: 
    NTSTATUS

4.     DiskPerfRemoveDevice函数(详细流程参见DiskPerfRemoveDevice.vsd

NTSTATUS 
DiskPerfRemoveDevice( 
    IN PDEVICE_OBJECT DeviceObject, 
    IN PIRP Irp 
    ) 
函数说明: 
    当设备被移除时调用此函数。 
    首先将把自身从WMI反注册,删除自身前把自己从 
    设备栈上移除。 
参数: 
    DeviceObject – 指向设备对象的指针 
    Irp – 指向irp的指针 
返回值: 
    移除设备后的状态

5.     DiskPerfReadWrite函数(详细流程参见DiskPerfReadWrite.vsd

NTSTATUS 
DiskPerfReadWrite( 
    IN PDEVICE_OBJECT DeviceObject, 
    IN PIRP Irp 
    )

函数说明: 
    这是diskperf驱动粘帖到的磁盘的读写入口点。 
    这个驱动收集统计信息并且设置完成方法,这样当 
    请求完成时可以收集额外的信息。然后调用下层的 
    驱动。 
参数: 
    DeviceObject 
    Irp 
返回值: 
    NTSTATUS

6.     DiskPerfIoCompletion函数(详细流程参见DiskPerfCompletion.vsd

NTSTATUS 
DiskPerfIoCompletion( 
    IN PDEVICE_OBJECT DeviceObject, 
    IN PIRP          Irp, 
    IN PVOID          Context 
    ) 
函数说明: 
    完成一个IRP后,本方法从系统获取控制。 
    它将计算IRP开始时间和当前时间的差异, 
    然后减小队列深度 
参数: 
    DeviceObject –为IRP准备 
    Irp          - 刚完成的I/O请求。 
    Context      - 未使用 
返回值: 
    IRP 的状态

7.     DiskPerfDeviceControl函数(详细流程参见流程图DiskPerfDeviceControl.vsd

NTSTATUS 
DiskPerfDeviceControl( 
    PDEVICE_OBJECT DeviceObject, 
    PIRP Irp 
    ) 
函数说明: 
    设备控制分派函数,只处理磁盘性能设备控制。 
    所有其他的控制命令都直接发送给下层磁盘驱动。 
    磁盘性能驱动返回当前的性能数据快照。 
参数: 
    DeviceObject – 活动上下文 
    Irp          -设备控制参数快 
返回值: 
    返回状态。

说明

1.    绿色字体为仔细研读的部分。

2.    驱动中有关电源管理、WMI的部分暂时没有仔细研究。

3.    有关IRP的同步机制以及有关的锁机制还不明白,有待进一步学习研究。

你可能感兴趣的:(C++)