阅读:4297回复:4
文件重定向status_reparse
查了一些文章,关于如何实现文件重定向,但是自己实现过程中系统还是崩了。
想要实现的功能如下,如打开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; } |
|
最新喜欢:lovehh... |
沙发#
发布于:2007-07-24 10:06
记得本版的精华区有人帖过代码
|
|
|
板凳#
发布于: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); } |
|
地板#
发布于:2007-07-24 16:16
记得以前devia大侠贴过一篇重定向的文章,不知大侠能否出手相助。
|
|
地下室#
发布于:2007-10-28 23:45
http://bbs.driverdevelop.com/simple/index.php?t103918.html
没看到FileName的Length和MaxLength的设置代码。。。 |
|
|