VC文件过滤系统驱动开发Filemon学习笔记
2007-11-26 21:38:05 来源:WEB开发网此函数是拦截文件操作的中心,在其中获得了被操作的文件名字,并且根据操作类型,在
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);
在FilemonHookRoutine函数里,用一个宏实现了复杂的获得拦截到的被操作文件的名字:
PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp);
*nextIrpStack = *currentIrpStack;//此步设置了下层驱动的IO_STACK_LOCATION
直接设置了下层驱动IO堆栈的值。if( FilterOn && hookExt->Hooked ) {
GETPATHNAME( createPath )宏展开为:
GETPATHNAME( createPath );
}#define GETPATHNAME(_IsCreate)
fullPathName = ExAllocateFromNPagedLookasideList( &FullPathLookaside );
if( fullPathName ) {
FilemonGetFullPath( _IsCreate, FileObject, hookExt, fullPathName );
} else {
fullPathName = InsufficientResources;
}
更多精彩
赞助商链接