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

隐藏文件夹有问题,请Coolice先生看过来

楼主#
更多 发布于:2003-02-10 11:46
如你所说,2000下的驱动有问题,我在completeroutine中处理Irp->userbuffer,但是,当只有一个entry时就出现问题了,这个entry不能隐藏掉,我想在dispatch里做,想构造自己的Irp,先把目录全部得出,不知道这样是否可行,另外,IRP_MJ_DIRECTORY_CONTROL的Irp该如何构造?请先生帮忙,40分太少,表示心意,感谢!!!
签名是什么?
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-10 12:07
我在Filter里不到万不得已,很少直接构造IRP往下传,因为直接用ZwCreateFile和ZwQueryDirectoryFile更简单些。

新的IFSKIT 里对ZwQueryDirectoryFile有以下说明:
This routine is available on Microsoft? Windows? XP and later.
但实际上2000下可以使用这个函数。

用ZwQueryDirectoryFile枚举目录所需的信息,过滤后再处理原先的IRP_MJ_DIRECTORY_CONTROL

zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-10 12:13
非常感谢您这么快就回复帖子!
原来我也想到过这样做,只是担心zwCreateFile不成功,我觉得,IRP_MJ_DIRECTORY_CONTROL来到的时候,该文件夹已经被打开了,我原来想,是否通过FileObject能够得到Handle,这样就可以Query了,不知道我是不是太多虑了。
签名是什么?
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-10 12:14
另外,是否这样做要考虑重入?
签名是什么?
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-10 12:21
用ZwCreateFile就需要考虑重入,如果直接构造IRP,用IoAllocateIrp
IoSetCompletionRoutine
IoCallDriver
KeWaitForSingleObject
应该没问题,不过我没有直接构造IRP_MJ_DIRECTORY_CONTROL的源代码,可以参考FILEMON里获得文件名的那一段,唯一的区别就是参数的填写
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-10 12:28
另外 ntfsd上有人提到了以下方法,我没有试过,如果可行应该更简单:

This one should hit the FAQ:-)
    When you receive D_C/Q_D IRP, pass it down, with your completion
routine returning STATUS_MORE_PROCESSING_REQUIRED.
    The dispatch routine of yours must wait for the completion routine
to finish (i.e. use KeWaitXXX on an event that would be signaled by the
completion routine).
    After you wait for the completion routine, start filtering entries
(this one is pure maths).
    If you filter out ALL the entries (i.e. there would be no files
returned to the caller), issue IoCallDriver again, with the same IRP.

  -> 注意这一步

Repeat previous 3 steps.
    If some entries are left (i.e. some entries would be returned to the
caller), set the Irp->IoStatus.Information field to tell the caller how
many bytes were copied, call IoCompleteRequest and return to the caller.
IoCompleteRequest is required, because your completion routine returned
STATUS_MORE_PROCESSING_REQUIRED.
    Of course, if the call fails (i.e. there are no files copied into
the buffer by the file system), then you\'d have to just return, and do
nothing extra.

    Regards, Dejan.
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-10 12:45
非常感谢!!!
我试试看!!!
签名是什么?
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-10 16:42
还有问题需要请教您,下面是一段使用ZwQueryDirectoryFile枚举目录的代码,其中,参数pFileName不知是什么格式,是*.*,a?.bat相似的格式,还是带路径的?比如:D:\\Sample\\a*.*;另外,有个MAX_DIR_INFO_LENGTH,不知道值是多少。
请您明示,谢谢!!!

代码如下:
NTSTATUS Dir(char * pFileName)
{
NTSTATUS Status;
HANDLE Handle=NULL;
ACCESS_MASK DesiredAccess=FILE_READ_DATA;
OBJECT_ATTRIBUTES ObjectAttributes;
ULONG FileAttributes=FILE_ATTRIBUTE_DIRECTORY;
ULONG ShareAccess=FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
ULONG CreateDisposition=FILE_OPEN;
ULONG CreateOptions=FILE_DIRECTORY_FILE;
ANSI_STRING AnsiString;
UNICODE_STRING UnicodeString;
WCHAR UnicodeStringBuffer[MAX_FILE_LENGTH];
char FileName[MAX_FILE_LENGTH];
PBYTE Info;
PFILE_BOTH_DIR_INFORMATION DirInfo;
IO_STATUS_BLOCK IoStatus;
IoStatus.Status = 0;
IoStatus.Information = 0;

//
// Get the name of the file
//
strcpy(FileName, \"\\\\DosDevices\\\\\");
strcat(FileName, pFileName);// <-- your file name here

//\"RtlInitAnsiString %s...\", FileName
RtlInitAnsiString(&AnsiString, FileName);
PrintStatus(STATUS_SUCCESS, NULL);

// setup our unicode string
UnicodeString.MaximumLength = MAX_FILE_LENGTH*2;
UnicodeString.Buffer = UnicodeStringBuffer;

//\"RtlAnsiStringToUnicodeString...\"
ObjectAttributes.ObjectName = &UnicodeString;
Status = RtlAnsiStringToUnicodeString(ObjectAttributes.ObjectName,&AnsiString, FALSE);
//PrintStatus(Status, NULL);

//
// Open the file
//
//\"ZwCreateFile...\"

ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
ObjectAttributes.RootDirectory = NULL;
ObjectAttributes.Attributes = 0;
ObjectAttributes.SecurityDescriptor = NULL;
ObjectAttributes.SecurityQualityOfService = NULL;

Status = ZwCreateFile(
&Handle,
DesiredAccess,
&ObjectAttributes,
&IoStatus,
NULL, // AllocationSize
FileAttributes,
ShareAccess,
CreateDisposition,
CreateOptions,
NULL, // EaBuffer
0); // EaLength
if (!NT_SUCCESS(Status))
goto CleanUp;
//
// allocate a large buffer that is 256 bytes long.
//
Info = (PBYTE)malloc(MAX_DIR_INFO_LENGTH);
RtlInitUnicodeString(&UnicodeString, L\"*\");
//printf(\"ZwQueryDirectoryFile...\");

// you will probably need to use an event - without
// one you might see \"status_pending\" returned.
Status = ZwQueryDirectoryFile(
Handle,
NULL,
ApcRoutine,
NULL,
&IoStatus,
Info,
MAX_DIR_INFO_LENGTH,
FileBothDirectoryInformation,
FALSE,
&UnicodeString,
TRUE);
if (!NT_SUCCESS(Status))
goto CleanUp;
DirInfo = (PFILE_BOTH_DIR_INFORMATION)Info;
while(DirInfo)
{
if (DirInfo->NextEntryOffset)
Info += DirInfo->NextEntryOffset;
else
Info = 0;
DirInfo = (PFILE_BOTH_DIR_INFORMATION)Info;
}
CleanUp:
if (Handle)
{
Status = NtClose(
Handle);
}
return(0);
}
签名是什么?
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-10 19:02
我不知道你的情形,不过我做到了。

在枚举目录,有两个特殊目录是必存在的,.,..,所以即使只有一个文件,在目录链还是有三个,我猜你的问题是,当要隐藏的文件是该链的最后一个,你还是用老方法处理,这是错误的,最后一个你不需要move memory,只需要修改NextOffset为0。


Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-11 09:55
pFileName 是目录名,不能有通配符
ZwCreateFile需要指定FILE_DIRECTORY_FILE标志
游客

返回顶部