阅读:2052回复:11
过滤驱动程序中能否捕捉到关闭文件操作
过滤驱动程序中能否捕捉到关闭文件操作?
关闭文件时发送什么IRP?IRP_MJ_CLOSE?怎么区分是文件关闭时的close? |
|
沙发#
发布于:2007-11-24 10:33
好像没有,在Shell namespace extension 中捕获到
|
|
板凳#
发布于:2007-11-24 14:35
用一下StreamCtx,当FileObject销毁的时候会去释放这个Context,这个当作文件的关闭应该是合适的。
|
|
地板#
发布于:2007-11-26 10:11
谢谢两位的回答,我将试一试。
|
|
地下室#
发布于:2007-11-27 11:43
引用第2楼clarence于2007-11-24 14:35发表的 : 试了一下你说的方法。 步骤如下:(1)调用FsRtlInitPerStreamContext()初始化(2)调用FsRtlInsertPerStreamContext()保存StreamContext,当然先调用FsRtlLookupPerStreamContext()判断是否存在。 问题是:关闭文件时,好像没有执行步骤(1)中设置的回调函数(用输出检查)。 请教:能否指点一下使用StreamContext的方法。 |
|
5楼#
发布于:2007-11-27 13:28
我用的是Minifilter Driver,
{ FLT_STREAM_CONTEXT, 0, CleanupStreamContext, sizeof(STREAM_CONTEXT), CONTEXT_TAG }, Fileobject销毁的时候会去回调CleanupStreamContext。 原理应该是一样的。 我具体跟过,文件被close之后不一定会立刻去Free的,具体free的时刻不知道Ms是怎么确定的,可能和file reference有关吧。 注意,file reference 一定在自己driver里面reference一次就deference一次,否则的话就不会进你的free回调了。 |
|
6楼#
发布于:2007-11-27 15:52
先顶到最上面,期待LZ的总结,
|
|
|
7楼#
发布于:2007-11-28 15:16
放个代码,回调并没被调用,
VOID Per_StreamContext(PFILE_OBJECT FileObject){ PFSRTL_ADVANCED_FCB_HEADER fsadvfcb; PFSRTL_PER_STREAM_CONTEXT fsprectx; NTSTATUS RC; //1, 分配Per-Stream Context PVOID pCtx; //1,由FileObject 得到PFSRTL_ADVANCED_FCB_HEADER结构 fsadvfcb = FsRtlGetPerStreamContextPointer ( FileObject ); fsprectx = FsRtlLookupPerStreamContext(fsadvfcb , &co, &ci); if ( fsprectx == NULL ) { DbgPrint("%s\n", "look up null"); } else { return; } pCtx = ExAllocatePool(NonPagedPool, 512); if ( pCtx == NULL){ return ; } //预置Per-Stream Context FsRtlInitPerStreamContext( (PFSRTL_PER_STREAM_CONTEXT)pCtx, &co, &ci, freefunc); //关连Per-Stream Context 到一个File Stream RC = FsRtlInsertPerStreamContext( fsadvfcb, pCtx ); if ( !NT_SUCCESS( RC )) { DbgPrint("%s\n", "Insert failed"); ExFreePool(pCtx); } // FsRtlTeardownPerStreamContexts( fsadvfcb ); 此句真的会被自动调用? } |
|
|
8楼#
发布于:2007-11-28 16:20
typedef struct _FSRTL_PER_STREAM_CONTEXT {
LIST_ENTRY Links; PVOID OwnerId; PVOID InstanceId; PFREE_FUNCTION FreeCallback; -- 添上你的FreeCallback } FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; PFREE_FUNCTION FreeCallback 这个函数去回调~~ lagacy filter 没试过,试下应该是没问题的 |
|
9楼#
发布于:2007-11-28 17:11
VOID freefunc(
IN PVOID Buffer ) { if (Buffer == NULL) {} else { DbgPrint("%s\n", "FileObject be Closed"); ExFreePool(Buffer); } } 这是我的freeFunc 如果手工调用FsRtlTeardownPerStreamContexts( fsadvfcb );这么函数会被调用, 但资料上说,不用手工调用 Remove, 与Teardown, 。。。 |
|
|
10楼#
发布于:2007-11-28 18:39
对,耐心多等下,就应该能看见。不行你就shutdown,看看会不会进~
|
|
11楼#
发布于:2007-11-29 08:53
FsRtlInitPerStreamContext 的参数 co, ci 我定义为全局的 CHAR 没问题吧?
原来的参数类型为 PVOID |
|
|