Windows内核中的目录列表

时间:2018-05-09 08:59:43

标签: windows file kernel driver system

我需要找出特定文件夹的文件名。

您希望通过使用该文件名执行ZwCreateFile()来读取内容。

为此,请尝试通过执行ZwQueryDirectoryFile()来获取文件夹中的文件名。

但是,即使文件夹中有很多文件,也只有文件名为'的FILE_BOTH_DIR_INFORMATION结构。并且返回Buffer中的大小2.

使用STATUS_SUCCESS完成了ZwQueryDirectoryFile()的返回值。

以下是源代码。

UNICODE_STRING DirectoryName;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE DirectoryHandle;
IO_STATUS_BLOCK IoStatusBlock;
PFILE_BOTH_DIR_INFORMATION DirInformation;

RtlInitUnicodeString(&DirectoryName, L"\\SystemRoot");
InitializeObjectAttributes(&ObjectAttributes, &DirectoryName, 

OBJ_CASE_INSENSITIVE, 0, 0);

    Status = ZwCreateFile(
&DirectoryHandle, 
FILE_LIST_DIRECTORY | SYNCHRONIZE, 
&ObjectAttributes, 
&IoStatusBlock, 
0, 0, 
FILE_SHARE_VALID_FLAGS, 
FILE_OPEN, 
FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE, 
0, 0);

if (NT_SUCCESS(Status))
{
    DBG("ZwCreateFile() Success");
}
else
{
    DBG("ZwCreateFile() Fail %08x", Status);
    return;
}

DirInformation = ExAllocatePool(NonPagedPool, sizeof(FILE_BOTH_DIR_INFORMATION) * 512);

Status = NtQueryDirectoryFile(
DirectoryHandle, 
0, 0, 0, 
&IoStatusBlock, 
DirInformation, 
sizeof(FILE_BOTH_DIR_INFORMATION) * 512, 
FileBothDirectoryInformation, 
TRUE, 0, 0);

if (NT_SUCCESS(Status))
{
    DBG("NtQueryDirectoryFile() Success");
}
else
{
    DBG("NtQueryDirectoryFile() Fail %08x", Status);
    ZwClose(DirectoryHandle);
    return;
}

while (1)
{
    UNICODE_STRING EntryName;
    EntryName.MaximumLength = EntryName.Length = (USHORT)DirInformation->FileNameLength;
    EntryName.Buffer = &DirInformation->FileName[0];

    DBG("TEST : %wZ", &EntryName);

    if (DirInformation->NextEntryOffset == 0)
    {
        break;
    }
    else
    {
        DirInformation = (PFILE_BOTH_DIR_INFORMATION)(((PUCHAR)DirInformation) + DirInformation->NextEntryOffset);
    }
}



以下是WinDbg的结果。

enter image description here

显然," \ SystemRoot"(" \ ?? \ C:\ Windows")中有很多文件。

我不知道为什么会这样。

请帮帮我。

0 个答案:

没有答案