Список каталогов в ядре Windows - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно узнать имена файлов конкретной папки.

Вы хотите прочитать содержимое, выполнив ZwCreateFile () с этим именем файла.

Для этого попробуйте получить имена файлов в папке, выполнив ZwQueryDirectoryFile ().

Однако, даже если в папке много файлов, только структура FILE_BOTH_DIR_INFORMATION с именем файла '.' И размер 2 в буфере возвращается.

Возвращаемое значение ZwQueryDirectoryFile () было хорошо сделано с помощью STATUS_SUCCESS.

Ниже приведен исходный код.

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") много файлов.

Я не знаю, почему это происходит.

Пожалуйста, помогите мне.

...