[资料]
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. 小试牛刀
#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;
}
保存为 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
保存为 MAKEFILE
TARGETNAME=testwdm
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的分派函数?