[MiniFilter]驱动隐藏文件夹的实现(支持Win7)
2010-11-03 14:22
645 查看
刚完成一个利用驱动隐藏文件夹的程序,隐藏文件的类似,现在贴出来共享给大家。
代码相对比较简单,我是在别人代码的基础上改的。
因为现在在网上找到的代码都是不支持XP以上版本的,所以我在别人代码的基础上添加了XP以上版本的支持。
现在该代码同时支持XP以下及XP以上版本(本人仅测试XP和Win7)。
利用驱动实现文件的隐藏主要是在IRP_MJ_DIRECTORY_CONTROL的后操作回调函数中处理其输入参数FLT_CALLBACK_DATA结构中的缓冲区数据。
该缓冲地址的获取是重点,Data->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBuffer(或MdlAddress)
网上现有代码不支持XP以上版本的原因是Vista或Win7返回的FileInformationClass结构不再是FileBothDirectoryInformation,而是FileIdBothDirectoryInformation
【注】虽然[b]利用驱动隐藏文件无法利用“显示隐藏文件”查看,但文件实际仍存在,通过路径仍然可以访问。[/b]
实现代码如下:
View Code
代码相对比较简单,我是在别人代码的基础上改的。
因为现在在网上找到的代码都是不支持XP以上版本的,所以我在别人代码的基础上添加了XP以上版本的支持。
现在该代码同时支持XP以下及XP以上版本(本人仅测试XP和Win7)。
利用驱动实现文件的隐藏主要是在IRP_MJ_DIRECTORY_CONTROL的后操作回调函数中处理其输入参数FLT_CALLBACK_DATA结构中的缓冲区数据。
该缓冲地址的获取是重点,Data->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBuffer(或MdlAddress)
网上现有代码不支持XP以上版本的原因是Vista或Win7返回的FileInformationClass结构不再是FileBothDirectoryInformation,而是FileIdBothDirectoryInformation
【注】虽然[b]利用驱动隐藏文件无法利用“显示隐藏文件”查看,但文件实际仍存在,通过路径仍然可以访问。[/b]
实现代码如下:
View Code
//实现目录隐藏,支持XP及以上版本 JiaSong[2010-11-1] FLT_POSTOP_CALLBACK_STATUS HideFilePostDirCtrl ( __inout PFLT_CALLBACK_DATA Data, __in PCFLT_RELATED_OBJECTS FltObjects, __in_opt PVOID CompletionContext, __in FLT_POST_OPERATION_FLAGS Flags ) { ULONG nextOffset = 0; int modified = 0; int removedAllEntries = 1; PFILE_BOTH_DIR_INFORMATION currentFileInfo = 0; PFILE_BOTH_DIR_INFORMATION nextFileInfo = 0; PFILE_BOTH_DIR_INFORMATION previousFileInfo = 0; PFILE_ID_BOTH_DIR_INFORMATION currentFileIdInfo = 0; PFILE_ID_BOTH_DIR_INFORMATION nextFileIdInfo = 0; PFILE_ID_BOTH_DIR_INFORMATION previousFileIdInfo = 0; UNREFERENCED_PARAMETER( FltObjects ); UNREFERENCED_PARAMETER( CompletionContext ); //不满足过滤条件的直接放过 if( FlagOn( Flags, FLTFL_POST_OPERATION_DRAINING ) || Data->Iopb->MinorFunction != IRP_MN_QUERY_DIRECTORY || Data->Iopb->Parameters.DirectoryControl.QueryDirectory.Length <= 0 || !NT_SUCCESS(Data->IoStatus.Status)) { return FLT_POSTOP_FINISHED_PROCESSING; } //XP及其以下版本,需要过滤 FileBothDirectoryInformation 类型的信息 if(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass == FileBothDirectoryInformation) { //我们可以得到一个缓存区,这个缓存里面就保留着文件夹中所有的文件信息。 //根据这个缓存的结构遍历处理,过滤掉要隐藏的文件名就能达到隐藏的目的了 if (Data->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress != NULL) {//缓存地址 currentFileInfo=(PFILE_BOTH_DIR_INFORMATION)MmGetSystemAddressForMdlSafe( Data->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress, NormalPagePriority ); } else {//缓存地址 currentFileInfo=(PFILE_BOTH_DIR_INFORMATION)Data->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBuffer; } if(currentFileInfo==NULL)return FLT_POSTOP_FINISHED_PROCESSING; previousFileInfo = currentFileInfo; do { //Byte offset of the next FILE_BOTH_DIR_INFORMATION entry nextOffset = currentFileInfo->NextEntryOffset; //后继结点指针 nextFileInfo = (PFILE_BOTH_DIR_INFORMATION)((PCHAR)(currentFileInfo) + nextOffset); KdPrint(("1.FileName: %S, ShortName: %S\n",currentFileInfo->FileName,currentFileInfo->ShortName)); if(_wcsnicmp(currentFileInfo->FileName,g_prefixName,wcslen(g_prefixName))==0) { KdPrint(("1.g_prefixName: %S, currentFileInfo->FileName: %S\n",g_prefixName,currentFileInfo->FileName)); if( nextOffset == 0 ) { previousFileInfo->NextEntryOffset = 0; } else {//更改前驱结点中指向下一结点的偏移量,略过要隐藏的文件的文件结点,达到隐藏目的 previousFileInfo->NextEntryOffset = (ULONG)((PCHAR)currentFileInfo - (PCHAR)previousFileInfo) + nextOffset; } modified = 1; } else { removedAllEntries = 0; //前驱结点指针后移 previousFileInfo = currentFileInfo; } //当前指针后移 currentFileInfo = nextFileInfo; } while( nextOffset != 0 ); } //vista或win7返回的结构不再是FileBothDirectoryInformation.而是FileIdBothDirectoryInformation else if(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass ==FileIdBothDirectoryInformation) { if (Data->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress != NULL) { currentFileIdInfo=(PFILE_ID_BOTH_DIR_INFORMATION)MmGetSystemAddressForMdlSafe( Data->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress, NormalPagePriority ); } else { currentFileIdInfo=(PFILE_ID_BOTH_DIR_INFORMATION)Data->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBuffer; } if(currentFileIdInfo==NULL)return FLT_POSTOP_FINISHED_PROCESSING; previousFileIdInfo = currentFileIdInfo; do { //Byte offset of the next FILE_ID_BOTH_DIR_INFORMATION entry nextOffset = currentFileIdInfo->NextEntryOffset; nextFileIdInfo = (PFILE_ID_BOTH_DIR_INFORMATION)((PCHAR)(currentFileIdInfo) + nextOffset); KdPrint(("2.FileName: %S, ShortName: %S\n",currentFileIdInfo->FileName,currentFileIdInfo->ShortName)); if(_wcsnicmp(currentFileIdInfo->FileName,g_prefixName,wcslen(g_prefixName))==0) { KdPrint(("2.g_prefixName: %S, currentFileInfo->FileName: %S\n",g_prefixName,currentFileIdInfo->FileName)); if( nextOffset == 0 ) { previousFileIdInfo->NextEntryOffset = 0; } else { previousFileIdInfo->NextEntryOffset = (ULONG)((PCHAR)currentFileIdInfo - (PCHAR)previousFileIdInfo) + nextOffset; } modified = 1; } else { removedAllEntries = 0; previousFileIdInfo = currentFileIdInfo; } currentFileIdInfo = nextFileIdInfo; } while( nextOffset != 0 ); } if( modified ) { if( removedAllEntries ) { Data->IoStatus.Status = STATUS_NO_MORE_FILES; } else { FltSetCallbackDataDirty( Data ); } } return FLT_POSTOP_FINISHED_PROCESSING; }
相关文章推荐
- 青松卓然 js2854的博客 [MiniFilter]驱动隐藏文件夹的实现(支持Win7)
- Filter Manager Support for Minifilter Drivers 过滤管理器对微过滤驱动的支持
- 虚拟机网络驱动(共享文件夹)不见了的解决方案-适用于win7~win10 and Windows Server 2008~Windows Server 2012R2
- win7 64-bit minifilter
- 文件系统Minifilter驱动(一)
- vc实现用文件系统过滤驱动实现文件隐藏的类
- jz2440 win7 64位系统mini usb驱动无法兼容的解决方案,及其使用u-boot烧写Nand-flash的方法
- Windows Minifilter驱动 - 调式 (4)
- inf文件安装Minifilter驱动
- 关于驱动隐藏那点事(不触发PG 支持win10)
- 文件系统Minifilter驱动(一)
- 编写驱动拦截NT的API实现隐藏文件目录
- 解决VMware vSphere Client与本机的鼠标无缝移出移入、剪贴板共享、共享文件夹等问题,实现虚拟机上虚拟硬件的驱动
- 文件系统Minifilter驱动(九)
- C#编程实现统计文件夹内文件和隐藏文件的方法示例
- win7操作系统在哪显示隐藏文件夹
- [代码]Delphi实现获取文件及文件夹大小(支持超过2G的大文件)
- cmd命令实现加密文件夹--建立隐藏目录--autorun病毒的简单防御
- 文件系统Minifilter驱动(二)
- 让mayfish支持mysqli数据库驱动的实现方法