阅读:4183回复:11
微过滤器中重定向文件到不同卷的问题
在微过滤器中,将文件重定向,在前操作回调中直接修改FILEOBJECT ,意思是将老的文件名缓存释放并换成新的文件,代码如下:
FileName = &(FileObject->FileName); FileNameBuffer = ExAllocatePool( NonPagedPool,NewFileName.MaximumLength ); if (!FileNameBuffer) { // Not enough resources. Complete the IRP with the appropriate status. Data->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; Data->IoStatus.Information = 0; return FLT_PREOP_SUCCESS_WITH_CALLBACK; } ExFreePool( FileName->Buffer ); FileName->Buffer = FileNameBuffer; FileName->MaximumLength = NewFileName.MaximumLength; RtlCopyUnicodeString( FileName, &NewFileName ); FltSetCallbackDataDirty(Data); 已经可以实现同卷文件重定向,但不同卷不行,按照微软文档:For example, a minifilter driver's preoperation callback routine can redirect an I/O operation to a different volume by changing the target instance for the operation. The new target instance must be an instance of the same minifilter driver at the same altitude on another volume.意思很明确,就是要将Data->Iopb->TargetInstance修改到微过滤驱动另一卷实例。我这样来实现:在全局声明一个实例变量:PFLT_INSTANCE ediskInstance,在绑定例程中将重定向的目标实例保存到这个变量中:ediskInstance = FltObjects -> Instance,最后,前操作回调中: Data->Iopb->TargetInstance = ediskInstance; 但这样并不能将文件重定向到不同的卷,并且,在微过滤驱动退出死机。请高手来指教一下。 |
|
沙发#
发布于:2008-03-16 19:12
该问题在OSR有热烈的讨论,有些启发意义。
http://www.osronline.com/ShowThread.cfm?link=125489 |
|
板凳#
发布于:2008-03-16 19:25
最后的结论好像居然是系统Bug,请高手讨论一下:
Your code appears right. This unload hang is actually caused by a bug in Filter Manager. When a filter changes the Data->Iopb->TargetInstance, it works functionally correct, however the filter unload may hang. This bug will be fixed in the next window release. You can try to request QFEs if this is critical to your product. Hui File System Filter manager and Filters Microsoft Corp. |
|
地板#
发布于:2008-03-17 11:29
它不说让你用QFEs吗?
|
|
|
地下室#
发布于:2008-04-27 15:54
用Sfilter是可以的
|
|
5楼#
发布于:2008-07-21 17:41
引用第3楼znsoft于2008-03-17 11:29发表的 : QFEs = ? |
|
6楼#
发布于:2008-07-21 18:16
quick fix engineering patches
|
|
|
7楼#
发布于:2008-08-04 00:32
这个问题有人解决没?
|
|
|
8楼#
发布于:2008-08-04 08:50
指针是不可靠的,嘿嘿......
|
|
|
9楼#
发布于:2008-08-04 21:02
FileName = &(FileObject->FileName);
FileNameBuffer = ExAllocatePool( NonPagedPool,NewFileName.MaximumLength ); if (!FileNameBuffer) { // Not enough resources. Complete the IRP with the appropriate status. Data->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; Data->IoStatus.Information = 0; return FLT_PREOP_SUCCESS_WITH_CALLBACK; } ExFreePool( FileName->Buffer ); FileName->Buffer = FileNameBuffer; FileName->MaximumLength = NewFileName.MaximumLength; RtlCopyUnicodeString( FileName, &NewFileName ); FltSetCallbackDataDirty(Data); 1. Minifilter是完全支持重定向操作的,其方法和逻辑过滤器驱动的实现方法相同! 2. 上面的代码对失败的处理明显有误"return FLT_PREOP_COMPLETE" |
|
|
10楼#
发布于:2008-08-04 21:43
1. Minifilter是完全支持重定向操作的,其方法和逻辑过滤器驱动的实现方法相同!
----------------------------------------------------------- 老大还能提示一下? |
|
11楼#
发布于:2008-08-05 10:42
|
|
|