阅读:1625回复:4
关于tooflat 的“隐藏文件、目录”的几个问题
前几天学习了tooflat 对隐藏文件和目录的代码,经过几天的调试和修改,现在终于成功了。不过还有一些问题要大牛们帮忙讲解一下。
第一:关于全路径问题。(其实还有一些基础问题要请问^_^) 大牛们都推荐楚狂人的“第二版”,教程里说,在sfread或sfwrite的时候不能获取全路径,这个说法也应用到DispatchDirectoryControl,获取全路径的方法是在sfcreate的时候来保存。但我的测试结果是:我首先是在sfcreate的前前后后不同地方试图打印出路径信息,但不知道为什么,sfilter的代码始终没有我要的结果,后来我开始在DispatchDirectoryControl里找,先是在while里找,再进到do语句里找,总之最后是找到了。先是在while之前,用RtlVolumeDeviceToDosName(devE->storage, &uDeviceName);得到盘符。再在while中得到FILE_OBJECT fo = irpsp->FileObject;得到路径,再进入do语句获取当前目录的文件dirinfo->FileName。整个过程我不太会用UNICODE_STRING把这一串字符联起来,所以我使用了最简单的char 类型和一系列的memset(),strcpy(), strcat()等函数。不知道用这些函数会不会有问题或者有什么隐患在里面。请大家看到这里的,不防指正一二^_^...另外这里面用到了ANSI_STRING类型做为中间的转换。不知道对一个NASI_STRING多次使用RtlUnicodeStringToAnsiString()和RtlFreeAnsiString()会不会有问题,我没看到别有多次这样使用的例子,都是只使用了一次。如果不使用RtlFreeAnsiString()会怎么样呢,会不会blue呢。 曾出现过多次蓝屏,有的提示BAK_POOL_HEADER.有的没有提示,只有出错地址(比较小的地址)。 第二:效率问题。 如果对很多文件进行隐藏时,会不会很慢,会不会蓝屏??有没有其它好一点的办法,我想过修改文件属性或标志,遍历目录的时候,先读文件属性,如果有隐藏标志,就跳过。这又有几个问题,1.如何修改文件的属性标示位,又不影响文件内容。2.每次遍历目录,要先读文件,会不会带来新的效率问题呢? 第三:判断文件是否要隐藏的时候有点问题。 if ((dirInfo->FileNameLength > 0) && (_wcsnicmp(HIDDEN_DIRECTORY, dirInfo->FileName, dirInfo->FileNameLength / sizeof(WCHAR)) == 0)) 这段比较有bug。如果有文件名前面几个相同。比如:文件1,文件12,文件123。这三个文件,如果你要隐藏的是文件123。那就会有问题了,三个文件都不见了。:) 另外,还有好多好多关于驱动开发的问题,一时也无从说起。…… |
|
沙发#
发布于:2007-05-18 12:40
补充:
还有一个就是关于在“终于搞定隐藏文件、目录了,好高兴啊!!!!!哈哈 ”中提问的问题,我把这代码放过就好了,不知道会不会有隐患呢 if (0 != _wcsicmp(fileNameBuffer, L"\\")) { ExFreePoolWithTag(fileNameBuffer, POOL_TAG); IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } 另外,这个获取文件路径的函数不是sfilter的代码,我也就没有用。 if (!NT_SUCCESS(GetFileName(DeviceObject, irpSp->FileObject, fileNameBuffer))) { ExFreePoolWithTag(fileNameBuffer, POOL_TAG); IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } 请多多指教。。。。 为什么我不能修改贴子,点击修改,只有删除的权限啊。。。。呜呜呜 |
|
板凳#
发布于:2007-06-01 09:14
不错,我用的C++来开发,直接写了个类来封装UNICODE_STRING,这样字符串的连接比较等可以直接用+,=来实现了,要省很多事的。
我自定义类如下,楼主要是懂C++可以看看,很多地方就很方便了。 class NEWUNICODE_STRING { public: unsigned short Length; unsigned short MaximumLength; PWCHAR Buffer; NEWUNICODE_STRING(); ~NEWUNICODE_STRING(); NEWUNICODE_STRING(unsigned short Len); NEWUNICODE_STRING(PWCHAR pwch); NEWUNICODE_STRING(UNICODE_STRING & ustr); NEWUNICODE_STRING(NEWUNICODE_STRING &nustr); NEWUNICODE_STRING & operator=(NEWUNICODE_STRING & nustr); bool operator==(NEWUNICODE_STRING &nustr); bool operator==(UNICODE_STRING &nustr); }; |
|
地板#
发布于:2007-06-04 14:36
如果你用了很多C++,建议看看最新一期的NT Insider,里面有一个德国人写的关于这方面的文章
|
|
|
地下室#
发布于:2007-06-04 16:41
谢谢两位指点..^_+
|
|