zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5632回复:26

coolice 和 vcmfc先生请进~

楼主#
更多 发布于:2003-02-11 19:32
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,不过,我还不知道如何设置。非常感谢二位的帮忙!!!

最新喜欢:

rhpengrhpeng
签名是什么?
thecxj
驱动牛犊
驱动牛犊
  • 注册日期2002-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-29 14:21
这段代码关键就是根目录处理
云中漫步1977
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-22 21:41
请问:lists.osr.com这个网站的全网址是什么?我怎么进不去!
rsman
驱动小牛
驱动小牛
  • 注册日期2003-01-14
  • 最后登录2016-01-22
  • 粉丝0
  • 关注0
  • 积分969分
  • 威望101点
  • 贡献值0点
  • 好评度92点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-16 23:46
 这代码没有考虑根目录,隐藏文件是链中的最后一个,你还要根据我的方式改进。

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;
 

ApcHookHideFile是在完成例程里调用的吗?
rsman
rsman
驱动小牛
驱动小牛
  • 注册日期2003-01-14
  • 最后登录2016-01-22
  • 粉丝0
  • 关注0
  • 积分969分
  • 威望101点
  • 贡献值0点
  • 好评度92点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-14 10:40
 这代码没有考虑根目录,隐藏文件是链中的最后一个,你还要根据我的方式改进。

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;
 


这段代码是在完成例程里处理吗?
rsman
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-13 13:32
to: zhangyl
很抱歉,我上班不能用QQ,MSN
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
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;
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-13 11:59
忘了说, 我的意思是说,对于根目录,即使是只有一个file,有时可能也不只有一个,我也不是说以那么目录名来做判断是不是根目录的。

  对于U般,未测试,这两天忙,可能帮不了你。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-13 11:47
QQ:15453072


证谁请说是IFS FILTER 开发.
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-13 11:45
对于移动硬盘,可能是有特殊的地方吧!,我再测试一下。


又得找个U盘,痛苦中。。。。。
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-02-13 11:16
Coolice先生,有些疑问,向你请教,我们QQ上说吧,我的QQ是9006476,你加我吧
签名是什么?
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-02-13 10:16
coolice说得对,那两个文件夹不是一定存在的
签名是什么?
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-02-13 10:15
特别是移动盘
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-02-13 10:14
\\recycled
\\System Volume Information
两个目录都不是必然存在的
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-02-13 08:59
vcmfc先生,咱们QQ上说吧,我的QQ是9006476
签名是什么?
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-02-13 00:45


从中发觉你跟踪不过认真。多用点心。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-02-13 00:44
重新编排我的方法:
do
{
if 是根目录吗?= 是
   //根目录路径处理
else
   //非根目录路径处理

//处理文件名
//检查该操作是否需要隐藏处理
offset = pDirInfo->NextEntryOffset;
if(offset != 0)
{
//正常处理
else
{
//当最后一个文件需要隐藏,需要特殊处理
}

} while( offset != 0 );
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-02-13 00:42
用你的方法,测试一下。


的确发现我的程序里有一个大大的BUG。

不过也再次证实我的方法是对的。

根目录下存在两个必有的目录:

\\recycled
\\System Volume Information

再加上我的测试MM共三个。

这里有一个小心点,就是处理文件名的地方,我就是这里发生BUG,现改正。
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-02-12 16:25
vcmfc,有办法测试根目录的,建一个临时文件夹,把其他文件夹暂时移进去,就可以了

coolice:我正准备试一试,有问题的话还要随时找您帮忙啊。
签名是什么?
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-02-12 10:43
不好办,我的盘都满满文件,有机会再试一下。
上一页
游客

返回顶部