注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

基于文件过滤驱动的文件重定向  

2011-05-15 15:34:31|  分类: 驱动编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

NTSTATUS
SfCreate (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
 PSFILTER_DEVICE_EXTENSION deviceExtension;
 PDEVICE_OBJECT attachedDevice;
 PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
 NTSTATUS status;
 PFILE_OBJECT FileObject = irpSp->FileObject;
 
 UNICODE_STRING sourceName;
 UNICODE_STRING destinationName;

 //如果是控制设备就结束此IRP
 if(DeviceObject == gSFilterControlDeviceObject)
 {
  KdPrint(("if(DeviceObject == gSFilterControlDeviceObject)\n"));
  Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
  Irp->IoStatus.Information = 0;
  status = Irp->IoStatus.Status;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);
  return status;
 }
 
 ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));

 deviceExtension = DeviceObject->DeviceExtension;
 attachedDevice = deviceExtension->AttachedToDeviceObject;

 RtlInitUnicodeString( &sourceName, L"\\1.txt" );

 if (FileObject && RtlCompareUnicodeString( &sourceName, &FileObject->FileName, TRUE ) == 0)
 {
  // 释放掉FileObject->FileName.Buffer中的内存, 重新分配之
  ExFreePool(FileObject->FileName.Buffer);
  FileObject->FileName.Length = 0;
  FileObject->FileName.MaximumLength = 256;
  FileObject->FileName.Buffer=(PWCHAR)ExAllocatePool(NonPagedPool, 256);
  
  // 设定目标文件的全路径, 可以跨卷
  RtlInitUnicodeString( &destinationName, L"\\Device\\HarddiskVolume1\\2.txt" );
  RtlCopyUnicodeString(&FileObject->FileName, &destinationName);
  
  FileObject->FileName.Buffer[FileObject->FileName.Length/2] = UNICODE_NULL;

  // 设定IoStatus值 为 STATUS_REPARSE;
  Irp->IoStatus.Status = STATUS_REPARSE;
  Irp->IoStatus.Information = IO_REPARSE;
  IoCompleteRequest( Irp, IO_NO_INCREMENT );
  
  return STATUS_REPARSE;  
 }
 else
 {
  IoSkipCurrentIrpStackLocation(Irp);
  return IoCallDriver(attachedDevice,Irp);
 }
}

 

1.在未加载驱动的时候, 创建两个空白文件, 大小为0KB, 分别为1.txt 和 2.txt

基于文件过滤驱动的文件重定向 - Fly - 从C开始

 

2.加载驱动, 并打开1.txt 进行编辑.

基于文件过滤驱动的文件重定向 - Fly - 从C开始

  

3.保存文件后, 1.txt的大小没有变化, 而2.txt 的大小变成了1KB

基于文件过滤驱动的文件重定向 - Fly - 从C开始

 

4.关闭驱动后, 查看两个文本, 2.txt的内容是我们刚刚写入的, 文件重定向成功~

基于文件过滤驱动的文件重定向 - Fly - 从C开始

 

总结如下:

在做文件重定向时,确实应该在IRP_MJ_CREATE里进行重定向,而且应该这样做:
1,先释放原FileObject->FileName;


2,重新分配一个UNICODE_STRING,并将其Buffer设置为你想打开的文件全路径, 类似 "\\Device\\HarddiskVolume1\\2.txt" ;


3,Irp->IoStatus.Status=STATUS_REPARSE;
Irp->IoStatus.Informiation=IO_REPARSE;
IoCompleteRequeset(Irp,IO_NO_INCEMENT);
return STATUS_REPARSE;

  评论这张
 
阅读(1265)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018