WEB开发网
开发学院软件开发VC 文件过滤系统驱动开发Filemon学习笔 阅读

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

 2007-12-30 21:37:20 来源:WEB开发网   
核心提示: 此函数是拦截文件操作的中心,在其中获得了被操作的文件名字,文件过滤系统驱动开发Filemon学习笔(4),并且根据操作类型,在switch( currentIrpStack->MajorFunction ) {}中针对不同的MajorFunction,没有调用此两个函数,Filemo

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

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;               
    }

上一页  1 2 3 4 5 6  下一页

Tags:文件 过滤

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接