liweibin
驱动牛犊
驱动牛犊
  • 注册日期2006-02-19
  • 最后登录2009-09-26
  • 粉丝0
  • 关注0
  • 积分241分
  • 威望35点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
阅读:4297回复:4

文件重定向status_reparse

楼主#
更多 发布于:2007-07-24 09:12
查了一些文章,关于如何实现文件重定向,但是自己实现过程中系统还是崩了。
想要实现的功能如下,如打开c:\a.txt时,重定向到另一个文件b.txt,打开的是c:\b.txt
我是利用minifilter技术实现的,请帮我看看问题出在哪里?代码如下:

FLT_PREOP_CALLBACK_STATUS
FsPreCreate (
     __inout PFLT_CALLBACK_DATA Data,
     __in PCFLT_RELATED_OBJECTS FltObjects,
     __deref_out_opt PVOID *CompletionContext
     )
{
    UNICODE_STRING targetFile;
    PWCHAR        pBuffer = NULL;
    ULONG        len, maxlen;

    //判断是否对指定文件进行操作,如果是对指定的文件\testdir\a.txt进行操作
    if (IsCheckedFile(&(Data->Iopb->TargetFileObject->FileName)))
    {
        RtlInitUnicodeString(&targetFile, L"\\testdir\\b.txt");
        len = targetFile.Length;
        maxlen = targetFile.MaximumLength;
    
        pBuffer = (PWCHAR) ExAllocatePool(NonPagedPool, maxlen);
        if(!pBuffer)
        {
            return status;
        }
        
        wcsncpy(pBuffer, targetFile.Buffer, targetFile.Length);
        
        if( Data->Iopb->TargetFileObject->FileName.Buffer) {
            ExFreePool(Data->Iopb->TargetFileObject->FileName.Buffer);
        }

        Data->Iopb->TargetFileObject->FileName.Buffer = pBuffer;
        Data->IoStatus.Status = STATUS_REPARSE;
        Data->IoStatus.Information = IO_REPARSE;

        FltSetCallbackDataDirty(Data);

        //return STATUS_REPARSE;
        return FLT_PREOP_COMPLETE;
        }
    }
        
    return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}

最新喜欢:

lovehhylovehh...
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2007-07-24 10:06
记得本版的精华区有人帖过代码
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
liweibin
驱动牛犊
驱动牛犊
  • 注册日期2006-02-19
  • 最后登录2009-09-26
  • 粉丝0
  • 关注0
  • 积分241分
  • 威望35点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-24 10:46
谢谢大牛的关注!
这是我在论坛上找的关于重定向的帖子,也是基本按照这个思路写的,但不知道为什么还是出问题,呵呵

PDEVICE_EXTENSION deviceExtension;
PDEVICE_OBJECT attachedDevice;
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS status;
PFILE_OBJECT FileObject = irpSp->FileObject;
LARGE_INTEGER offset = irpSp->Parameters.Read.ByteOffset;
ULONG length = irpSp->Parameters.Read.Length;
WCHAR nameBuf[512];
UNICODE_STRING name;
UNICODE_STRING sourceName;
UNICODE_STRING destinationName;

if(!(DeviceObject->DriverObject==FsDriverObject))
{
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Information = 0;
status = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}


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

if(deviceExtension->RealDeviceObject==NULL)
{
IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(attachedDevice,Irp);
}


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

RtlInitEmptyUnicodeString(&name,nameBuf,512);

if (FileObject&&RtlCompareUnicodeString( &sourceName, &FileObject->FileName, TRUE ) == 0)
{

RtlCopyUnicodeString(&name,&FileObject->FileName);

DbgPrint("File Name: %ws",(&name)->Buffer);

ExFreePool(FileObject->FileName.Buffer);
FileObject->FileName.Length = 0;
FileObject->FileName.MaximumLength = name.MaximumLength;
FileObject->FileName.Buffer=(PWCHAR)ExAllocatePool(NonPagedPool, name.MaximumLength);

RtlInitUnicodeString( &destinationName, L"\\\\??\\\\G:\\\\user\\\\globaluser.txt" );
RtlCopyUnicodeString(&FileObject->FileName, &destinationName);

FileObject->FileName.Buffer[FileObject->FileName.Length/2] = UNICODE_NULL;

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);
}
liweibin
驱动牛犊
驱动牛犊
  • 注册日期2006-02-19
  • 最后登录2009-09-26
  • 粉丝0
  • 关注0
  • 积分241分
  • 威望35点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-24 16:16
记得以前devia大侠贴过一篇重定向的文章,不知大侠能否出手相助。
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
地下室#
发布于:2007-10-28 23:45
http://bbs.driverdevelop.com/simple/index.php?t103918.html
没看到FileName的Length和MaxLength的设置代码。。。
人总在矛盾中徘徊。。。
游客

返回顶部