📄 实现对硬盘的监控.txt
字号:
MyFileSpy是我根据IFS KIT包里的File Spy例子修改而成,主要是为了初学者能很容易的掌握监控硬盘的驱动程序的实现原理。
为了便于理解,我将File Spy中与FASTIODISPATCH有关的全部删去,完全用标准的WDM中的回调例程来实现;并且将与控制台打印有关的也删去。因此可以清楚的看到,实现对硬盘的监控主要有以下几步:
1、使用ZwCreateFile打开到设备的文件句柄,如:
// open the file object for the given device
status = ZwCreateFile(
&fileHandle,
SYNCHRONIZE|FILE_READ_DATA,
&objectAttributes,
&openStatus,
NULL,
0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_OPEN,
FILE_SYNCHRONOUS_IO_NONALERT/*|FILE_DIRECTORY_FILE*/,////可以设置为打开目录
NULL,
0);
2、打开获得文件句柄的卷对象。即:
// get a pointer to the volumes file object
status = ObReferenceObjectByHandle(
fileHandle,
FILE_READ_DATA,
*IoFileObjectType,
KernelMode,
(PVOID*)&volumeFileObject,
NULL);
3、获得我们想挂接的对象的设备对像,使用
nextDriverDeviceObject =
IoGetRelatedDeviceObject( volumeFileObject );
4、根据想挂接的设备对像的类型建立合适的新设备对象,并将其挂接到设备调用链中。即:
status = IoCreateDevice(
DeviceObject->DriverObject,
sizeof(DEVICE_EXTENSION),
NULL,
nextDriverDeviceObject->DeviceType,
0,
FALSE,
&attachedDeviceObject);
//...
// Add our device object to chain
devext->NextDriverDeviceObject = IoAttachDeviceToDeviceStack(
attachedDeviceObject,
nextDriverDeviceObject );
至此,我们就完成了对指定设备对象的连接,在我们自己的驱动程序的Dispatch例程中就会截获对指定设备对象的所有IO调用。例子中我只是在IRP_MJ_CREATE调用中简单的打印了一下信息。
对挂接的设备对象解除挂接时,使用IoDetachDevice(devext->NextDriverDeviceObject);
需要说明的是:
1、这个例子还不完善,主要是为了容易看懂,有些清理工作没有完成。
2、虽说这个例子是IFS KIT包里的,但是在我删去FASTIODISPATCH的调用后,现在这个例子只需做简单的改动(将#include <ntifs.h>改为#include <WDM.h>,InitializeObjectAttributes参数中的OBJ_KERNEL_HANDLE注释掉)即可在win98下编译通过,我个人认为不会影响其主要功能,但是我只是编译成功了,由于98下没有Severce调用,需要做一个INF文件安装驱动程序,因此我没有实验。
3、现在这个例子我已经实现对硬盘各分区如C:和文件如C:\MyText.TXT的监控,对目录的监控需要修改ZwCreateFile的参数。
4、这个例子在Win2000下的使用方法和FileSpy一样。附件中会有FileSpy的源码,便于对照。
5、如果这个例子对你有所帮助,我感到不胜欣慰。
我的希望是对驱动程序开发有兴趣并有时间的同志能将此程序完善,并能将其更新。谢谢!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -