文件重定向(采用文件过滤驱动实现)

26 篇文章 0 订阅
16 篇文章 1 订阅

原文:http://hi.baidu.com/tzpwater/blog/item/9bf66eb5196b1fe130add132.html/cmtid/65f21515aea03006c83d6d41

Windows的I/O管理器提供了一个方便的方法来重定向一个文件对象。通常使用文件过滤驱动(在文件打开和文件创建的操作中)实现该方法。操作方法如下:

1、在IRP_MJ_CREATE的分发函数中,获得FILE_OBJET的FileName属性。

2、用目标文件的完整路径替换原有的文件名字。

这个全名,包括卷设备对象的名字(例如,Device/HardDiskVolume0/Directory/MyFile.txt)。可以释放掉原有的FileName.Buffer,同时用自己定义的缓冲区(buffer,以NonPagedPool方式申请)替换它。

3、设置IoStatus的status字段为STATUS_REPARSE,然后设置Information字段为IO_REPARSE.

4、完成该IRP请求。

5、返回STATUS_REPARSE

I/O管理器接收到该返回后,便会触发另一个文件打开操作,并发送一个IRP_MJ_CREATE的请求。

 

而目标文件可以是本地或远程计算机。而若要重定向远程文件打开操作,文件名要遵循以下语法:

"/??/UNC/HostName/Share/File"

"/Device/Mup/HostName/Share/File"

"/Device/LanmanagerRedirector/HostName/Share/File"(在你的目标文件是CIFS/SMB/LanManager的情况下)

在你的首次打开/创建文件操作是相对于另一个文件对象的时候,没有必有修改FILE_OBJECT的RelatedFileObject域。在重定向时,I/O管理器只考虑FileName域,而不考虑RelatedFileObject域(在I/O管理器收到STATUS_REPARSE后,它便会释放该域)。

I/O管理器为了避免重定向的无限循环,在嵌套循环中加了一些限制:重定向操作的最大嵌套次数是32.

 

 

代码

IRP_MJ_CREATE例程里添加如下代码:

irpSp = IoGetCurrentIrpStackLocation(Irp);

   RtlInitUnicodeString(&cmpFileName, L"//hello.txt");

   KdPrint((">>> Create/Open FileName:%ws/n", irpSp->FileObject->FileName.Buffer));

   if (RtlCompareUnicodeString(&cmpFileName, &irpSp->FileObject->FileName, FALSE) == 0)

   {

    pusFileName = &(irpSp->FileObject->FileName);

    // 方法很简单

    // 就是把FileObject->FileName.Buffer释放掉

    // 然后自己ExAllocatePool...分配一个缓冲区用于保存重定向的文件名 这里需要是全文件名

    // FileObject->FileName指向新分配的缓冲区

    // 把新文件名拷贝到FileObject->FileName里

    // 设置Irp->IoStatus的值如下

    // Irp->IoStatus.Status = STATUS_REPARSE;

    // Irp->IoStatus.Information = IO_REPARSE;

    // 返回STATUS_REPARSE

    // 经测试跨卷访问也可以

    RtlInitUnicodeString(&usNewFileName, L"//??//E://123//hello.txt");

    pwNewNameBuffer = ExAllocatePool(PagedPool, usNewFileName.MaximumLength);

    if (pwNewNameBuffer == NULL)

    {

     Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;

     Irp->IoStatus.Information = 0;

 

     IoCompleteRequest( Irp, IO_NO_INCREMENT );

     return STATUS_INSUFFICIENT_RESOURCES;

    }

 

    ExFreePool( pusFileName->Buffer );

    pusFileName->Buffer = pwNewNameBuffer;

    pusFileName->MaximumLength = usNewFileName.MaximumLength;

    RtlCopyUnicodeString(pusFileName, &usNewFileName);

 

    Irp->IoStatus.Status = STATUS_REPARSE;

    Irp->IoStatus.Information = IO_REPARSE;

    IoCompleteRequest( Irp, IO_NO_INCREMENT );

    return STATUS_REPARSE;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重定向系统各临时文件夹到另外盘符 首先要在“开始”——“运行”内输入“regedit”打开注册表编辑器,然后要在“文件”下拉菜单中的“导出”功能备份好注册表,以防万一,接着在左侧窗口依次打开: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders 在右侧窗口里,你看到的“名称”就代表那些特殊的文件夹,“数据”就是它们所对应的默认存储路径。修改默认的路径就可以让你的桌面文件夹移动了,下面是所有的. 下面介绍一下各个“名称”所代表的文件夹 名称 含义 默认路径 AppData 应用程序数据目录 C:\Documents and Settings\User name\Application Data Cookies Cookies路径 C:\Documents and Settings\User name\Cookies Desktop 桌面路径 C:\Documents and Settings\User name\桌面 Favorites 收藏夹 C:\Documents and Settings\User name\Favorites NetHood NetHood路径 C:\Documents and Settings\User name\NetHood Personal 我的文档 C:\Documents and Settings\User name\My Documents PrintHood 打印 C:\Documents and Settings\User name\PrintHood Recent 文档项路径 C:\Documents and Settings\User name\Recent SendTo SendTo路径 C:\Documents and Settings\User name\SendTo Start Menu 开始菜单路径 C:\Documents and Settings\User name\「开始」菜单 Templates 新建文件目录 C:\Documents and Settings\User name\Templates Programs 程序菜单路径 C:\Documents and Settings\User name\「开始」菜单\程序 Startup 启动路径 C:\Documents and Settings\User name\「开始」菜单\程序\启动 History 网页历史记录 C:\Documents and Settings\ User name \Local Settings\History My Pictures 图片收藏 C:\Documents and Settings\User name\My Documents\My Pictures My Music 我的音乐 C:\Documents and Settings\User name\My Documents\My Music My Video 我的视频 C:\Documents and Settings\User name\My Documents\My Videos Cache Internet临时文件夹 C:\ Documents and Settings\User name \Temporary Internet Files 这些文件夹称为Shell文件夹 其中“User name”为当前用户的名称 了解了对应的文件夹,就可以根据自己的需要去更改对应的路径了。(千万不要在这儿改啊,那样可就瞎忙乎了,系统重起后它会恢复成原来的路径) 在同一层中你可以看到一个“User Shell Folders”的子键,即在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ User Shell Folders 这里包括了用户定制的所有Shell文件夹的值项。只要通过修改“数据”,就可以改变它们的存储路径。双击需要修改的名称,在弹出的“编辑字符串”的“数值数据”里填上你要更改的完整路径,按下“确定”就完成了。如果没有你需要的,可以在右边窗口单击鼠标右键,选择“新建”菜单中的“字符串值”命令,对应上表,添加一个用于Shell文件夹的字符串值。 在上面的文件夹中,并没有outlook的通讯簿和邮件存放路径,它们分别在 通讯簿路径: HKEY_CURRENT_USER\Software\Microsoft\WAB\WAB4\Wab File Name主键下,将

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值