XiangXiangRen
总版主
总版主
  • 注册日期2003-02-22
  • 最后登录2015-09-01
  • 粉丝13
  • 关注0
  • 积分1042分
  • 威望472点
  • 贡献值1点
  • 好评度145点
  • 原创分13分
  • 专家分1分
阅读:2088回复:0

微过滤器驱动开发指南 之五

楼主#
更多 发布于:2005-06-20 22:58
12.过滤器自产生I/O

某些微过滤器需要执行他们自己的I/O请求。在卷的微过滤器栈中,只有此过滤器以下的过滤器才能收到这些I/O请求。比如,一个防毒软件,可能希望在打开一个文件之前先读一下这个文件。在新的微过滤模式下,一个微过滤器有两种方法生成自己的请求:使用生成例程,类似现在的其他例程。此外就是使用旧的ZwXxx例程。

主要的I/O生成例程如下:

NTSTATUS
FLTAPI
FltAllocateCallbackData (
    IN PFLT_INSTANCE Instance,
    IN PFILE_OBJECT FileObject OPTIONAL,
OUT PFLT_CALLBACK_DATA *RetNewCallbackData
);

VOID
FLTAPI
FltPerformSynchronousIo (
    IN PFLT_CALLBACK_DATA CallbackData
    );

NTSTATUS
FLTAPI
FltPerformAsynchronousIo (
    IN PFLT_CALLBACK_DATA CallbackData,
    IN PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine,
    IN PVOID CallbackContext
    );

要使用这些例程,一个微过滤器可以首先调用FltAllocateCallbackData来分配一个 CallbackData.然后对应于不同的操作填写合适的参数。之后即可调用FltPerformSynchronousIo()或者是FltPerformAsynchronousIo()来实际发起I/O请求。参数Instance必须总是微过滤器发起此请求的实例。(译者注:不能由A实例分配而B实例来发起请求)。

此外过滤管理器导出了一些常用的实用例程,比如:

NTSTATUS
FLTAPI
FltCreateFile (
    IN PFLT_FILTER Filter,
    IN PFLT_INSTANCE Instance OPTIONAL,
    OUT PHANDLE   FileHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN PLARGE_INTEGER AllocationSize OPTIONAL,
    IN ULONG FileAttributes,
    IN ULONG ShareAccess,
    IN ULONG CreateDisposition,
    IN ULONG CreateOptions,
    IN PVOID EaBuffer OPTIONAL,
    IN ULONG EaLength,
    IN ULONG Flags
    );

如果Instance参数被忽略(译者注:指定为空.),那么CREATE请求会被发送到微过滤器栈的顶端(这导致本微过滤器会回环的看到自己发送的请求。)除非绝对必要,这是不明智的。如果被滥用,很容易导致死锁和栈溢出.

如果指定了这个参数(应该总是你自己当前的instance),那么仅仅向下发起此请求。所有的前面的调用此api的微过滤器之上的微过滤器(包括自己)都不会收到此请求.

FileHandle参数返回一个供Zw*系列函数调用的文件句柄.如果先前指定的Instance不为空,那么保证关于这个文件句柄的其他未来的I/O操作(通过Zw接口,FltClose(),等),都只能被这个发起Instance下面的Instance看到。

FltReadFile()和FltWriteFile()发起的I/O读写请求也只有下层实例才能看见。用于我们只有FileObject而没有文件句柄的时候。这些例程类似以前旧的过滤模型中自己发送IRP的读写方式.

重要提示:过滤器不需要使用FltReadFile()/FltwriteFile()来对一个FltCreateFile返回的文件句柄发起一个I/O请求.对于这种情况,使用Zw*()接口就可以发送到合适的实例上去。

NTSTATUS
FLTAPI
FltReadFile (
    IN PFLT_INSTANCE InitiatingInstance,
    IN PFILE_OBJECT FileObject,
    IN PLARGE_INTEGER ByteOffset OPTIONAL,
    IN ULONG Length,
    OUT PVOID Buffer,
    IN FLT_IO_OPERATION_FLAGS Flags,
    OUT PULONG BytesRead OPTIONAL,
    IN PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine OPTIONAL,
    IN PVOID CallbackContext OPTIONAL
    );

NTSTATUS
FLTAPI
FltWriteFile (
    IN PFLT_INSTANCE InitiatingInstance,
    IN PFILE_OBJECT FileObject,
    IN PLARGE_INTEGER ByteOffset OPTIONAL,
    IN ULONG Length,
    IN PVOID Buffer,
    IN FLT_IO_OPERATION_FLAGS Flags,
    OUT PULONG BytesWritten OPTIONAL,
    IN PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine OPTIONAL,
    IN PVOID CallbackContext OPTIONAL
);

微过滤器发出I/O可能为同步也可能为异步.当I/O被指定为异步,微过滤器提供一个回调例程.当系统完成了I/O请求回调例程会被调用.

13 卸载/注销/解除绑定的规则

解除绑定意味着一个微过滤实例将被销毁.这个微过滤器不在会因为任何对卷的操作而被调用(当然除非还有别的实例绑定在这个卷上).

卸载一个微过滤器意味着它的代码将不在存在于内存中。这往往在系统关闭的时候发生。或者是一个新版本的微过滤器在不关闭系统的情况下安装了(译者注:那么这时旧版本的微过滤器被卸载了。)

一个微过滤器可以自己把自己从一个卷解除绑定(调用FltDetachVolume),不过更通常的情况是在用户界面上解除的。一个微过滤器即使是有未完成的I/O请求的时候,依然可以解除绑定.此时,微过滤器的完成例程会被调用,而且所有的未完成的I/O操作都带有标记FLT_COMPLETION_DETACHED.当这些操作以后实际完成时,微过滤器就不会再收到这些完成回调了。

当一个微过滤器实例被解除绑定的时候,系统回调用这个微过滤器的所有的没有清除的上下文的释放例程,包括文件,流,流文件对象等和这个实例相关的对象。

14. 支持例程

除了已经讨论过的接口之外,过滤管理器提供了一组支持例程来帮助微过滤器完成他需要的工作。这里列出一部分附加的例程。请查阅过滤管理器IFS文档来获得这些例程的更多信息:
对象,名字转换:
FltGetFilterFromName()
FltGetVolumeFromName()
FltGetVolumeInstanceFromName()
卷,实例,设备对象转换历程:
FltGetVolumeFromInstance(), FltGetFilterFromInstance()
FltGetVolumeFromDeviceObject()
FltGetDeviceObject()
FltGetDiskDeviceObject()
获取对象信息例程:
FltGetVolumeProperties()
FltIsVolumeWriteable
FltQueryVolumeInformation(), FltSetVolumeInformation()
FltGetInstanceInformation()
FltGetFilterInformation()
枚举例程:
FltEnumerateFilters()
FltEnumerateVolumes()
FltEnumerateInstances()
FltEnumerateFilterInformation()
FltEnumerateInstanceInformationByFilter()
FltEnumerateInstanceInformationByVolume()
FltEnumerateVolumeInformation()
Oplock例程:
FltInitializeOplock()
FltUninitializeOplock()
FltOplockFsctrl()
FltCheckOplock()
FltOplockIsFastIoPossible()
FltCurrentBatchOplock()
目录改变通知例程:
   (译者注:目录改变通知在文件系统中的意义是当目录改变后,通知操作系统,使操作系统可以在界面上做出一些改变,比如显示的目录结构变化等等,专门有一种IRP可以干这个事情。)       FltNotifyFilterChangeDirectory()
其他: FltGetRequestorProcess(), FltGetRequestorProcessId()

15.构建一个微过滤器

构建一个微过滤器应用所需要的所有的东西都可以在过滤管理器IFS开发包中找到。这包括:
1.用来构建一个微过滤器和一个使用了过滤管理器接口的用户态应用程序的完整的构建环境。
2.所有的在一台机器上安装过滤管理器组件用于开发的安装包。当然如果以后的windows版本内部包含了过滤管理器组件,那么就没有必要了。
3.微过滤器示例的代码。
所有的微过滤器包含头文件FltKernel.h,而且连接FltMgr.lib.而应用程序应该包含头文件FltUser.h,并连接库FltLib.lib。




--------------------------------------------(全文完)----------------------------------------------------
本文翻译仅仅用做交流学习。我不打算保留任何版权或者承担任何责任。不要引用到赢利出版物中给
您带来版权官司。本文的翻译者是楚狂人,如果有任何问题,你可以通过邮箱
MFC_Tan_Wen@163.com,或者是QQ16191935,或者是MSN walled_river@hotmail.com与我交流。
游客

返回顶部