Мне нужно узнать имена файлов конкретной папки.
Вы хотите прочитать содержимое, выполнив 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.
Очевидно, что в "\ SystemRoot" ("\ ?? \ C: \ Windows") много файлов.
Я не знаю, почему это происходит.
Пожалуйста, помогите мне.