阅读:5632回复:26
coolice 和 vcmfc先生请进~
vcmfc先生的话我没有明白,我发现的情形是这样的:
当第一个IRP_MJ_DIRECTORY_CONTROL和IRP_MN_QUERY_DIRECTORY到达的时候,stack->Flags的值为SL_RETURN_SINGLE_ENTRY,我把它直接往下传了,在我的complete routine里处理,我的complete routine发现只有一个entry被枚举了出来,当发现该entry应该被隐藏时,我把Irp->IoStatus.Information和Irp->UserBuffer设置为NULL,并返回了一个STATUS_NO_SUCH_FILE,结果,该文件夹没有被隐藏,如果不是SL_RETURN_SINGLE_ENTRY的情形,我可以memory move,一般抖没有问题。最主要的问题就是这一个entry无法解决。 我准备采用coolice的方案,不过,coolice的方案中,我觉得应该含有通配符,比如:*.bat之类的,应该对应IRP_MJ_DIRECTORY_CONTROL和IRP_MN_QUERY_DIRECTORY的filename,不过,我还不知道如何设置。非常感谢二位的帮忙!!! |
|
最新喜欢:![]()
|
沙发#
发布于:2003-12-29 14:21
这段代码关键就是根目录处理
|
|
|
板凳#
发布于:2003-02-22 21:41
请问:lists.osr.com这个网站的全网址是什么?我怎么进不去!
|
|
地板#
发布于:2003-02-16 23:46
这代码没有考虑根目录,隐藏文件是链中的最后一个,你还要根据我的方式改进。 ApcHookHideFile是在完成例程里调用的吗? |
|
|
地下室#
发布于:2003-02-14 10:40
这代码没有考虑根目录,隐藏文件是链中的最后一个,你还要根据我的方式改进。 这段代码是在完成例程里处理吗? |
|
|
5楼#
发布于:2003-02-13 13:32
to: zhangyl
很抱歉,我上班不能用QQ,MSN |
|
6楼#
发布于:2003-02-13 13:13
这代码没有考虑根目录,隐藏文件是链中的最后一个,你还要根据我的方式改进。
purpose: hide C:\\Apc\\TestH VOID ApcHookHideFile( PIRP Irp, PIO_STACK_LOCATION currentIrpStack ) { PFILE_BOTH_DIR_INFORMATION QueryBuffer = NULL; ULONG offset = 0; ULONG currentPosition = 0; ULONG bufferLength = currentIrpStack->Parameters.QueryFile.Length; ULONG NewLength = 0; WCHAR fileNameToRemove[] = L\"TestH\"; PUCHAR startEntryToRemove = NULL; PUCHAR startNextEntry = NULL; NewLength = bufferLength; QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer; if( QueryBuffer->NextEntryOffset > bufferLength ) return; do { offset = QueryBuffer->NextEntryOffset; DebugPrint( ( \"HookRoutine : QUERY_DIR : TestH - ws 0xd\\n\", QueryBuffer->FileName, QueryBuffer->NextEntryOffset ) ); if( wcsncmp(QueryBuffer->FileName, fileNameToRemove, 5 ) == 0 ) { startEntryToRemove = (PUCHAR) QueryBuffer; startNextEntry = (PUCHAR) QueryBuffer + offset; RtlMoveMemory( startEntryToRemove, startNextEntry, bufferLength - currentPosition - offset ); NewLength -= offset; break; } currentPosition += offset; QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) ( (PUCHAR) QueryBuffer + offset ); } while( offset != 0 ); Irp->IoStatus.Information = NewLength; } case IRP_MJ_DIRECTORY_CONTROL: if( currentIrpStack->MinorFunction == IRP_MN_QUERY_DIRECTORY ) { if( strncmp( fullPathName, \"C:\\\\0\", 3 ) == 0 ) { ApcHookHideFile( Irp, currentIrpStack ); } } break; |
|
7楼#
发布于:2003-02-13 11:59
忘了说, 我的意思是说,对于根目录,即使是只有一个file,有时可能也不只有一个,我也不是说以那么目录名来做判断是不是根目录的。
对于U般,未测试,这两天忙,可能帮不了你。 |
|
8楼#
发布于:2003-02-13 11:47
QQ:15453072
证谁请说是IFS FILTER 开发. |
|
9楼#
发布于:2003-02-13 11:45
对于移动硬盘,可能是有特殊的地方吧!,我再测试一下。
又得找个U盘,痛苦中。。。。。 |
|
10楼#
发布于:2003-02-13 11:16
Coolice先生,有些疑问,向你请教,我们QQ上说吧,我的QQ是9006476,你加我吧
|
|
|
11楼#
发布于:2003-02-13 10:16
coolice说得对,那两个文件夹不是一定存在的
|
|
|
12楼#
发布于:2003-02-13 10:15
特别是移动盘
|
|
13楼#
发布于:2003-02-13 10:14
\\recycled
\\System Volume Information 两个目录都不是必然存在的 |
|
14楼#
发布于:2003-02-13 08:59
vcmfc先生,咱们QQ上说吧,我的QQ是9006476
|
|
|
15楼#
发布于:2003-02-13 00:45
从中发觉你跟踪不过认真。多用点心。 |
|
16楼#
发布于:2003-02-13 00:44
重新编排我的方法:
do { if 是根目录吗?= 是 //根目录路径处理 else //非根目录路径处理 //处理文件名 //检查该操作是否需要隐藏处理 offset = pDirInfo->NextEntryOffset; if(offset != 0) { //正常处理 else { //当最后一个文件需要隐藏,需要特殊处理 } } while( offset != 0 ); |
|
17楼#
发布于:2003-02-13 00:42
用你的方法,测试一下。
的确发现我的程序里有一个大大的BUG。 不过也再次证实我的方法是对的。 根目录下存在两个必有的目录: \\recycled \\System Volume Information 再加上我的测试MM共三个。 这里有一个小心点,就是处理文件名的地方,我就是这里发生BUG,现改正。 |
|
18楼#
发布于:2003-02-12 16:25
vcmfc,有办法测试根目录的,建一个临时文件夹,把其他文件夹暂时移进去,就可以了
coolice:我正准备试一试,有问题的话还要随时找您帮忙啊。 |
|
|
19楼#
发布于:2003-02-12 10:43
不好办,我的盘都满满文件,有机会再试一下。
|
|
上一页
下一页