S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

File System Filters Driver(一)

Posted on 2009-10-30 12:14 S.l.e!ep.¢% 阅读(317) 评论(0)  编辑 收藏 引用 所属分类: Windows WDM
[资料] 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的分派函数?

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理