gongxp123456
驱动牛犊
驱动牛犊
  • 注册日期2004-12-15
  • 最后登录2013-10-10
  • 粉丝0
  • 关注0
  • 积分617分
  • 威望383点
  • 贡献值1点
  • 好评度59点
  • 原创分0分
  • 专家分0分
阅读:4183回复:11

微过滤器中重定向文件到不同卷的问题

楼主#
更多 发布于:2008-03-16 17:48
在微过滤器中,将文件重定向,在前操作回调中直接修改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;
但这样并不能将文件重定向到不同的卷,并且,在微过滤驱动退出死机。请高手来指教一下。
gongxp123456
驱动牛犊
驱动牛犊
  • 注册日期2004-12-15
  • 最后登录2013-10-10
  • 粉丝0
  • 关注0
  • 积分617分
  • 威望383点
  • 贡献值1点
  • 好评度59点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-03-16 19:12
该问题在OSR有热烈的讨论,有些启发意义。
http://www.osronline.com/ShowThread.cfm?link=125489
gongxp123456
驱动牛犊
驱动牛犊
  • 注册日期2004-12-15
  • 最后登录2013-10-10
  • 粉丝0
  • 关注0
  • 积分617分
  • 威望383点
  • 贡献值1点
  • 好评度59点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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.
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2008-03-17 11:29
它不说让你用QFEs吗?
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
x-star
驱动小牛
驱动小牛
  • 注册日期2007-04-26
  • 最后登录2018-11-17
  • 粉丝0
  • 关注0
  • 积分65分
  • 威望664点
  • 贡献值1点
  • 好评度39点
  • 原创分1分
  • 专家分1分
  • 社区居民
地下室#
发布于:2008-04-27 15:54
用Sfilter是可以的
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-07-21 17:41
引用第3楼znsoft于2008-03-17 11:29发表的  :
它不说让你用QFEs吗?


QFEs = ?
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2008-07-21 18:16
quick fix engineering patches
一切都是时间问题!
iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-08-04 00:32
这个问题有人解决没?
I Believe I Can Fly,I Believe I Can Touch The sky!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2008-08-04 08:50
指针是不可靠的,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
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"
人总在矛盾中徘徊。。。
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-08-04 21:43
1. Minifilter是完全支持重定向操作的,其方法和逻辑过滤器驱动的实现方法相同!

-----------------------------------------------------------
老大还能提示一下?
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
11楼#
发布于:2008-08-05 10:42
人总在矛盾中徘徊。。。
游客

返回顶部