[资料] http://www.cppblog.com/Files/sleepwom/Windows%20File%20Filters%20Driver%20StudyII.rar
看的资料是狂人的 Windows File Filter Driver II
1. NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
); 函数是每个驱动的入口函数
2. DriverObject 简称 DO
DriverObject 是我们所写的驱动对应的 DriverObject, 在加载驱动时,由系统分配的一个对象
DriverObject 有一组函数指针,称为 dispatch functions, 开发驱动的任务就是撰写这些 dispatch function
3. RegistryPath 是专门用于记录本驱动相关参数的注册表路径,也是由系统分配的
4. 小试牛刀
保存为 testwdm.cpp
保存为 MAKEFILE
保存为 SOURCE
三个文件,然后就可以BUILD了
使用 DriverMonitor 加载驱动后,然后使用 WinObj.exe 查看
在 \FileSystem 下面就会多一个 MyFilter 的驱动
使用 DriverMonitor Stop Driver, 并删除 Driver
\FileSystem 下面的 'MyFilter' 就会消失
FastIo:
FastIo 是独立于普通的IRP的分发函数之外的另一组接口,但是他们的作用是一样的, 就是由驱动处理外部给予的请求,
而且所处理的请求也基本相同
FastIo例程返回 FALSE 表示不做任何事,这样这些请求都会通过IRP重新发送到 普通分发函数.
Q1. NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
函数无疑是驱动的入口函数,但操作系统加载驱动 至 system 线程调用 DriverEntry() 函数的过程是如何的?
Q2.在本例中,IoCreateDevice() 函数创建的设备是什么设备?假如我想过滤某个物理设备的IRP,是不是需要使用
IoCreateDevice() 函数去创建一个设备,并绑定到物理设备上面?
Q3: FastIo 接口位于 普通的 Driver分派函数之上?系统会先调用 FastIo 接口再调用 Driver的分派函数?
看的资料是狂人的 Windows File Filter Driver II
1. NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
); 函数是每个驱动的入口函数
2. DriverObject 简称 DO
DriverObject 是我们所写的驱动对应的 DriverObject, 在加载驱动时,由系统分配的一个对象
DriverObject 有一组函数指针,称为 dispatch functions, 开发驱动的任务就是撰写这些 dispatch function
3. RegistryPath 是专门用于记录本驱动相关参数的注册表路径,也是由系统分配的
4. 小试牛刀
#ifdef __cplusplus
extern " C "
{
#endif
#include " ntddk.h "
#ifdef __cplusplus
}
#endif
PDEVICE_OBJECT gSFilterControlDeviceObject;
VOID OnUnLoad(IN PDRIVER_OBJECT pDriverObject)
{
DbgPrint(( " Enter DriverUnload\n " ));
IoDeleteDevice( gSFilterControlDeviceObject );
DbgPrint(( " Leave DriverUnload\n " ));
}
extern " C " NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
DbgPrint( " Entry DriverEntry Function!\n " );
DriverObject -> DriverUnload = OnUnLoad;
// define a unicode string
UNICODE_STRING nameString;
RtlInitUnicodeString( & nameString, L " \\FileSystem\\MyFilter " );
// create a control driver
NTSTATUS status;
status = IoCreateDevice(DriverObject,
0 , // has no device extension
& nameString,
FILE_DEVICE_DISK_FILE_SYSTEM,
FILE_DEVICE_SECURE_OPEN,
FALSE,
& gSFilterControlDeviceObject);
if ( ! NT_SUCCESS( status ) )
{
DbgPrint(( " DriverEntry:Error Creating Control Device Object %wZ status = %08x \n " ),
& nameString, status);
return status;
}
DbgPrint( " Leave DriverEntry!\n " );
return STATUS_SUCCESS;
}
extern " C "
{
#endif
#include " ntddk.h "
#ifdef __cplusplus
}
#endif
PDEVICE_OBJECT gSFilterControlDeviceObject;
VOID OnUnLoad(IN PDRIVER_OBJECT pDriverObject)
{
DbgPrint(( " Enter DriverUnload\n " ));
IoDeleteDevice( gSFilterControlDeviceObject );
DbgPrint(( " Leave DriverUnload\n " ));
}
extern " C " NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
DbgPrint( " Entry DriverEntry Function!\n " );
DriverObject -> DriverUnload = OnUnLoad;
// define a unicode string
UNICODE_STRING nameString;
RtlInitUnicodeString( & nameString, L " \\FileSystem\\MyFilter " );
// create a control driver
NTSTATUS status;
status = IoCreateDevice(DriverObject,
0 , // has no device extension
& nameString,
FILE_DEVICE_DISK_FILE_SYSTEM,
FILE_DEVICE_SECURE_OPEN,
FALSE,
& gSFilterControlDeviceObject);
if ( ! NT_SUCCESS( status ) )
{
DbgPrint(( " DriverEntry:Error Creating Control Device Object %wZ status = %08x \n " ),
& nameString, status);
return status;
}
DbgPrint( " Leave DriverEntry!\n " );
return STATUS_SUCCESS;
}
保存为 testwdm.cpp
#
# DO NOT EDIT THIS FILE !!! Edit .\sources. If you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
! INCLUDE $(NTMAKEENV)\makefile.def
# DO NOT EDIT THIS FILE !!! Edit .\sources. If you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
! INCLUDE $(NTMAKEENV)\makefile.def
保存为 MAKEFILE
TARGETNAME
=
testwdm
TARGETPATH = .\sys
TARGETTYPE = DRIVER
SOURCES = testwdm.cpp
TARGETPATH = .\sys
TARGETTYPE = DRIVER
SOURCES = testwdm.cpp
保存为 SOURCE
三个文件,然后就可以BUILD了
使用 DriverMonitor 加载驱动后,然后使用 WinObj.exe 查看
在 \FileSystem 下面就会多一个 MyFilter 的驱动
使用 DriverMonitor Stop Driver, 并删除 Driver
\FileSystem 下面的 'MyFilter' 就会消失
FastIo:
FastIo 是独立于普通的IRP的分发函数之外的另一组接口,但是他们的作用是一样的, 就是由驱动处理外部给予的请求,
而且所处理的请求也基本相同
FastIo例程返回 FALSE 表示不做任何事,这样这些请求都会通过IRP重新发送到 普通分发函数.
Q1. NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
函数无疑是驱动的入口函数,但操作系统加载驱动 至 system 线程调用 DriverEntry() 函数的过程是如何的?
Q2.在本例中,IoCreateDevice() 函数创建的设备是什么设备?假如我想过滤某个物理设备的IRP,是不是需要使用
IoCreateDevice() 函数去创建一个设备,并绑定到物理设备上面?
Q3: FastIo 接口位于 普通的 Driver分派函数之上?系统会先调用 FastIo 接口再调用 Driver的分派函数?