文件过滤系统驱动开发Filemon学习笔

豆豆网   技术应用频道   2007年12月30日    社区交流

内容摘要:WINDOWS文件过滤系统驱动开发,可用于硬盘还原,防病毒,文件安全防护,文件加密等诸多领域。而掌握核心层的理论及实践,对于成为一名优秀的开发人员不可或缺。

  此函数是拦截文件操作的中心,在其中获得了被操作的文件名字,并且根据操作类型,在

  switch( currentIrpStack->MajorFunction ) {

  }

  中针对不同的MajorFunction,打印出相关操作信息。

  因此函数体太长 不再全部列出。

  其函数体总体框架为:得到被操作的文件名字,打印相关操作信息,然后下发IRP到底层驱动。

  在下发IRP到底层驱动处理前,本层驱动必须负责设置下层IO堆栈的内容。这样下一层驱动调用IoGetCurrentIrpStackLocation()时能得到相应的数据。

  设置下层IO堆栈的内容,一般用两个函数来实现:

  IoCopyCurrentIrpStackLocationToNext( Irp )

  此函数一般用在本驱动设置了完成例程时调用,把本层IO _STACK_LOCATION 中的参数copy到下层,但与完成例程相关的参数信息例外。因为本驱动设置的完成例程只对本层驱动有效。

  IoSkipCurrentIrpStackLocationToNext(Irp)

  此函数的作用是:直接把本层驱动IO堆栈的内容设置为下层驱动IO堆栈指针的指向。因两层驱动IO堆栈的内容完全一致,省却copy过程。

  而在Filemon的处理中,它用了一个特别的办法,没有调用此两个函数,FilemonHookRoutine函数体里面有三句代码:

PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp);
PIO_STACK_LOCATION nextIrpStack  = IoGetNextIrpStackLocation(Irp);
*nextIrpStack = *currentIrpStack;//此步设置了下层驱动的IO_STACK_LOCATION
直接设置了下层驱动IO堆栈的值。
在FilemonHookRoutine函数里,用一个宏实现了复杂的获得拦截到的被操作文件的名字:if( FilterOn && hookExt->Hooked ) {
    GETPATHNAME( createPath );
}
GETPATHNAME( createPath )宏展开为:#define GETPATHNAME(_IsCreate)                         
    fullPathName = ExAllocateFromNPagedLookasideList( &FullPathLookaside );
    if( fullPathName ) {                          
      FilemonGetFullPath( _IsCreate, FileObject, hookExt, fullPathName );
    } else {                                
      fullPathName = InsufficientResources;               
    }

来源:vckbase    作者:郝朝    责编:豆豆技术应用

正在加载评论...