File System Filters Driver(一)

[资料] 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的分派函数?

你可能感兴趣的:(File System Filters Driver(一))