Minifilter文件及文件夹重定向

Minifilter文件及文件夹重定向

minifilter是windows驱动开发中针对文件的一个过滤驱动,上可以实现文件透明加密、应用沙盒、自动备份等功能。本文主要介绍通过PreCreate函数来实现文件及夹重定向操作。本文需要 Windows驱动开发的基本知识和Minifilter开发的基本知识。

前人已有经验

https://github.com/conand/Joker 这个项目的主要功能是把所有的.mp3格式的音频都重定向到某一个文件上,也就是说,你不管听啥歌,都是同一首。
关键代码如下,原理是:在打开文件之前,偷偷替换文件的路径,比如我打开C:\1.mp3。这时,FileObject->FileName的值应该是C:\1.mp3(举个例子,实际有点不一样),如果,我把FileObject->FileName修改成C:\2.mp3。那么,文件系统就会重新打开C:\2.mp3,那么后续的读取和写入都是针对2.mp3了。

FileObject = Data->Iopb->TargetFileObject;
FileObject->FileName = targetFile;
Data->IoStatus.Information = IO_REPARSE;
Data->IoStatus.Status = STATUS_REPARSE;
Data->Iopb->TargetFileObject->RelatedFileObject = NULL;
FltSetCallbackDataDirty(Data);//亲测这一句可以不要
return FLT_PREOP_COMPLETE;

(这个项目中有不少不需要的代码,可以精简很多)

文件夹重定向

由“前人已有经验”可知,我只需要把文件名称替换了,就可以重定向到另外一个文件,那么,我只需要在文件打开的时候,替换掉目标路径也就可以实现文件夹的重定向了,例如:C:\a文件夹需要重定向到D:\b文件夹,那么只需要minifilter检测到打开的是包含路径C:\a的文件,就直接把C:\a替换成D:\b即可。

PWCHAR source_path = L"C:\a";
PWCHAR redirect_path = L"C:\b";
PWCHAR current_path = (PWCHAR)ExAllocPool(PagedPool,BUFFER_SIZE);
UNICODE_STRING uni_current_path = {0};
RtlZeroMemory(current_path,BUFFER_SIZE);
RtlCopyMemory(current_path,nameInfo->Name.Buffer,nameInfo->name.length);
if(wcsstr(current_path,source_path )!=NULL){
	wcstrp(current_path,source_path,redirect_path );
	RtlInitUnicodeString(&uni_current_path,current_path);
	FileObject->FileName = uni_current_path;
	Data->IoStatus.Information = IO_REPARSE;
	Data->IoStatus.Status = STATUS_REPARSE;
	return FLT_PREOP_COMPLETE;
}

后续

需要重定向的文件或者文件夹写死在代码中,是没有意义的,需要在加上与应用程序的通讯,根据《寒江独钓-Windows内核安全编程》上minifilter那一章可以轻松完成。
本项目的编译环境为Windows7旗舰版+visual studio 2013+wdk8.1。
调试环境:windbg+com口+VirtualBox+Windows Xp sp1。
运行环境,Windows XP 32位、Windows 7 旗舰版(关闭强制签名)

你可能感兴趣的:(Windows驱动开发)