阅读:1314回复:10
隐藏文件还不完善啊
我在虚拟机测试时候没有问题,但是为什么拿到实机上执行测试就不对了呢?
我用DebugView看了一下,我的驱动的确是过滤了HideTest.txt文件名字了,但郁闷的是资源管理器就是可以看到我的C:\test\HideTest.txt,虚拟机跑就可以隐藏,不解啊 哪个中牛帮牛犊看看问题,大牛估计比较忙的;-*( BOOLEAN HandleDirectory(IN OUT PFILE_BOTH_DIR_INFORMATION DirInfo, IN PULONG lpBufLenth) { PFILE_BOTH_DIR_INFORMATION currentDirInfo = DirInfo; ULONG offset = 0; ULONG position = 0; ULONG newLenth = *lpBufLenth; WCHAR fileName[] = L"HideTest.txt"; do { offset = currentDirInfo->NextEntryOffset; if (!(FILE_ATTRIBUTE_DIRECTORY & currentDirInfo->FileAttributes) && (0 == wcsncmp(currentDirInfo->FileName, fileName, currentDirInfo->FileNameLength>>1))) { RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, *lpBufLenth - position - offset); newLenth -= offset; position += offset; } else { if (!(FILE_ATTRIBUTE_DIRECTORY & currentDirInfo->FileAttributes)) { KdPrint(("%08x File:%ws\n", currentDirInfo->FileAttributes, currentDirInfo->FileName)); } position += offset; currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset); } } while (0 != offset); *lpBufLenth = newLenth; return TRUE; } |
|
沙发#
发布于:2007-08-28 21:29
我刚才又仔细的测试了一遍,bug如下:
如果当前目录只有一个HideTest.txt则隐藏失败,要是你又创建了一个文件则可以隐藏 ![]() |
|
板凳#
发布于:2007-08-28 21:36
哦,知道问题在哪里了;-)只有一个文件时候
do { offset = currentDirInfo->NextEntryOffset; //offset = 0 。。。 { newLenth -= offset; //newLenth没有变化 position += offset; } 。。。 } while (0 != offset); 由于没有考虑到这个情况导致一个bug出现/V |
|
地板#
发布于:2007-08-28 23:03
BOOLEAN
HandleDirectory(IN OUT PFILE_BOTH_DIR_INFORMATION DirInfo, IN PULONG lpBufLenth) { PFILE_BOTH_DIR_INFORMATION currentDirInfo = DirInfo; PFILE_BOTH_DIR_INFORMATION lastDirInfo = NULL; ULONG offset = 0; ULONG position = 0; ULONG newLenth = *lpBufLenth; WCHAR fileName[] = L"Test.txt"; do { offset = currentDirInfo->NextEntryOffset; if (!(FILE_ATTRIBUTE_DIRECTORY & currentDirInfo->FileAttributes) && (0 == wcsncmp(currentDirInfo->FileName, fileName, currentDirInfo->FileNameLength>>1))) { currentDirInfo->FileName, currentDirInfo->FileNameLength)); if (0 == offset) { KdPrint(("l[%d][%d][%d][%d]\n", newLenth, *lpBufLenth, position, newLenth-(*lpBufLenth - position))); //Reset Last DirInfo NextEntryOffset To Zero!!! lastDirInfo->NextEntryOffset = 0; newLenth -= *lpBufLenth - position; } else { RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, *lpBufLenth - position - offset); newLenth -= offset; position += offset; } } else { position += offset; lastDirInfo = currentDirInfo; currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset); } } while (0 != offset); *lpBufLenth = newLenth; return TRUE; } 请注意一定要lastDirInfo->NextEntryOffset = 0; //Reset Last DirInfo NextEntryOffset To Zero!!! lastDirInfo->NextEntryOffset = 0; 可见Windows2000其实并是以BufLenth来处理的,而是依靠currentDirInfo->NextEntryOffset 我调试时候BufLenth 计算正确了,但是由于忘记处理currentDirInfo->NextEntryOffset = 0;导致Windows2000继续读取超出BufLenth 的下一个DirInfo,这应该是Windows2000的一个bug |
|
地下室#
发布于:2007-08-29 09:54
谢谢lz分享
|
|
5楼#
发布于:2007-08-29 11:49
更严重的是, 经测试在vista上好像没没作用, XP 2K, 可以.
|
|
6楼#
发布于:2007-08-29 15:12
Vista俺没有啊,估计是微软安全性提高了吧 但是感觉太花哨了
|
|
7楼#
发布于:2007-08-29 15:19
与安全性能无关,驱动是可以安装, 但起不到作用. 楼主可心试一下.
|
|
8楼#
发布于:2007-08-29 17:32
【vista过滤】
XP和2000判断FileInformationClass == FileBothDirectoryInformation, VISTA 下FileInformationClass ==FileIdBothDirectoryInformation ,做个判断,就可以了 ;-)刚在论坛上就看到了 |
|
9楼#
发布于:2007-08-30 08:57
楼主, 你的softice 是在XP下,使用还在2K下使用.我用下了一个想在XP下使用, 也打了补丁, 但不行.
你如果有在XP下可使用的softice, 能不能发个给我. 我也想在虚拟机上调试一下驱动, 光用DeBugView感觉不爽. |
|
10楼#
发布于:2007-08-30 11:39
我的是2K上的,DS3。2自带的
参考我的安装经历 http://bbs.driverdevelop.com/htm_data/11/0708/104847.html 调试的话我一般喜欢 DebugView,但是有时候会蓝屏的情况,根本看不到调试结果,这个时候就可以用ICE了,我的做法是: 首先在可疑代码中使用 _asm int 3;下断点,此中断会直接被ICE拦截并显示调试界面 然后你就可以使用src命令在源码状态下调试了,哈哈! |
|