⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 文件重定向操作.txt

📁 文件系统驱动开发的文档资料(IFS DDK)
💻 TXT
字号:
在文件系统过滤驱动的IRP_MJ_CREATE例程当中过滤所有向X盘的访问请求,将FileObject中的FileName改为c:\test_dir\...,然后返回STATUS_REPARSE,并且在Irp的IoStatus.Information置为IO_REPARES,应该就可以了。

==================
STATUS_REPARSE
============
DefineDosDevice

=================
sfilter的重定向操作的源码,大家帮忙看看

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

这段代码添加在sfcreate中。现在可以实现同盘文件的重定向,例如,当发打开G:\\globaluser.txt的请求,实际打开的是G:\\user\\globaluser.txt 
但将G:\\user\\globaluser.txt改为不同盘的文件时就显示“系统找不到指定路径”,应该是可以实现不同盘重定向操作的,大家帮帮忙。 
另外一个问题:请问sfilter可不可以实现网络文件的重定向。 
=======================
这个代码是好使的。包括不同盘,网络盘。 
上次的错误很幼稚,呵呵,我把目标目录设置为F:\\user\\globaluser.txt,而实际我在F盘建立的是F:\\usr\\globaluser.txt,所以就显示找不到指定路径了。 
我现在在做查询目录的重解析,不知道哪位考虑过,给点建议呀。不知道能不能实现,正在瞎捣鼓。等我做出来了也把源码贴出来。 
========================
重定向如果是在ifs filter,可简单,改路径,如果不同符,fsd object也改一下也可以.
============
老大,你的意思是说:在不同一个盘的情况下,修改改一下Fsd object 就可以直接传给下一层文件系统了?
========================
22
==============
我可以把部分关键代码贴上来,让大家批评指正,程序比较长,我不能全贴,见谅。我又没说要你的Money:),仍旧可以通过邮件找我。想一个星期学会FSD的开发,可能性不太大,除非你有很深DDK开发经历。有点泼冷水了,不过还是希望下面的代码能给你一点帮助。 

DbgPrint((\"REPARSE in create:\")); 

CUString CUTargetName(&AnsiSource.Buffer[2]); 
CUTargetName=CUString(\"\\\\??\\\\C:\\\\user\")+CUTargetName; 

#if DBG 
ANSI_STRING filename; 
RtlUnicodeStringToAnsiString( &filename, &(UNICODE_STRING)CUTargetName, TRUE ); 
DbgPrint((\" \'%s\' \\n\",filename.Buffer)); 
RtlFreeAnsiString(&filename); 
#endif 

ExFreePool(FileObject->FileName.Buffer); 
FileObject->FileName.Length = 0; 
FileObject->FileName.MaximumLength = ((UNICODE_STRING)CUTargetName).MaximumLength; 
// and allocate fresh space 
FileObject->FileName.Buffer=(PWCHAR)ExAllocatePool(NonPagedPool, ((UNICODE_STRING)CUTargetName).MaximumLength); 

RtlCopyUnicodeString(&FileObject->FileName, (PUNICODE_STRING)&((UNICODE_STRING)CUTargetName)); 
FileObject->FileName.Buffer[FileObject->FileName.Length/2] = UNICODE_NULL; 

pIrp->IoStatus.Status = STATUS_REPARSE; 
pIrp->IoStatus.Information = IO_REPARSE; 
IoCompleteRequest( pIrp, IO_NO_INCREMENT ); 

RtlFreeAnsiString(&AnsiSource); 

return STATUS_REPARSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -