yyffei
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分610分
  • 威望82点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
阅读:1625回复:4

关于tooflat 的“隐藏文件、目录”的几个问题

楼主#
更多 发布于:2007-05-18 12:31
前几天学习了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。那就会有问题了,三个文件都不见了。:)

另外,还有好多好多关于驱动开发的问题,一时也无从说起。……


yyffei
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分610分
  • 威望82点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
     }
请多多指教。。。。

为什么我不能修改贴子,点击修改,只有删除的权限啊。。。。呜呜呜
carwin
驱动牛犊
驱动牛犊
  • 注册日期2007-05-27
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分304分
  • 威望71点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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);
};
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-04 14:36
如果你用了很多C++,建议看看最新一期的NT Insider,里面有一个德国人写的关于这方面的文章
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
yyffei
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分610分
  • 威望82点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-04 16:41
谢谢两位指点..^_+
游客

返回顶部