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;
}

文件重定向(hook IRP_MJ_CREATE)相关推荐

  1. Win32位程序(64位系统)文件对话框的文件重定向问题

    目录 附注 问题背景 实验测试 解决方案 方案对比 参考文档 附注 1.解释下问题含义,指在一个64位Windows系统上面(譬如Win7x64,Win10x64),如果一个32位的程序调用系统API ...

  2. 文件重定向函数freopen

    头文件:stdio.h FILE *freopen( const char *filename, const char *mode, FILE *stream ); 参数说明: filename:需要 ...

  3. C语言文件重定向---“系统找不到指定的文件”

    今天在尝试文件重定向的时候,出了点小问题.目前已经解决了,所以来和大家分享一下. 问题描述 我打开cmd,然后输入 test.exe < stdin.txt > stdout.txt 结果 ...

  4. XenDesktop7.15CU3 文件重定向Bug

    最近部署一桌面项目使用XenDesktop 7.15 LTSR CU3版本,在做文件重定向时遇到"appdata"文件夹重定向始终无法生效,多次检查配置都没有任何问题. 后来开ca ...

  5. Windows重定向技术【文件重定向与注册表重定向】

    目录 重定向技术 重定向技术适用版本: 重定向技术产生原因:为了确保32位程序能够顺利运行 一:重定向-文件重定向 文件重定向原因:为了确保32位程序能够顺利运行 文件重定向产生场景: 文件重定向具体 ...

  6. linux shell编程输入输出,Linux shell编程 13标准输入、输出及文件重定向-dps文件怎么打开...

    5.6 标准输入.输出和错误 当我们在 s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件.由于文件描述符不容易记忆, s h e l l同时也给出了 ...

  7. shell语法----文件重定向

    每个进程默认打开3个文件描述符: stdin 标准输入,从命令行读取数据,文件描述符为0 stdout 标准输出,向命令行输出数据,文件描述符为1 stderr 标准错误输出,向命令行输出数据,文件描 ...

  8. linux 重定向文件,Linux 文件重定向

    在 Linux 系统中: 标准输入(stdin)默认为键盘输入:标准输出(stdout)默认为屏幕输出:标准错误输出(stderr)默认也是输出到屏幕. Linux Shell 环境中用 " ...

  9. linux中and运算符文件重定向,linux 重定向问题详解

    Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作. Linux默认 ...

最新文章

  1. 实现Java中的ArrayList
  2. sybase asa转mysql_为Sybase ASA创建外部存储过程(Java示例)
  3. 能用来写安卓吗_石粉能否用来制砂生产?能代替沙子使用吗?Z95
  4. Android JNI原理分析
  5. 面向对象写单片机程序-程序分层
  6. (转)ThreadPoolExecutor最佳实践--如何选择队列
  7. eclipse插件开发_开发Eclipse插件
  8. 《C Traps and Pitfalls》 笔记
  9. DataReader终结篇
  10. 我和2000万人在B站刷凤凰传奇
  11. Arcgis使用教程(八)地图文档(.Mxd)的使用方法详解
  12. svn 安装 IntelliJ IDEA 配置svn
  13. 关于yolov5出现报错 KeyError: ‘copy_paste‘之类Key问题解决办法
  14. 【稳定性day2】当当网的高可用之道
  15. maya python 游戏与影视编程指南pdf_Maya Python 游戏与影视编程指南
  16. PS马卡龙渐变海报制作教程
  17. 华硕飞行堡垒键盘背光灯无法显示怎么办?
  18. R语言作业一:矩估计、极大似然估计、拟合、对数正态分布、泊松分布、负二项分布
  19. 使用STM32Cube MX为STM32 CAN总线快速配置上手教程_HAL库_CAN协议_STM32_附波特率计算工具
  20. 计算机网络 万维网的文档

热门文章

  1. windows 7架设OpenSSH服务器实践
  2. 自建ES迁移至阿里云ES(使用脚本及logstash同步)
  3. Spring Boot配置视图解析器
  4. [译]ElasticSearch数据类型--string类型已死, 字符串数据永生
  5. 为什么白帽SEO更好?
  6. Asp.net中的两种刷新父窗体方法
  7. Go语言连接 zookeeper
  8. 强生进军医疗机器人、Deepmind利用深度学习算法检查乳腺癌X光,AI医疗的风口已到来?...
  9. 《Spark大数据分析:核心概念、技术及实践》一3.6 惰性操作
  10. Google Palette算法详解以及OC化