我需要找出特定文件夹的文件名。
您希望通过使用该文件名执行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的结果。
显然," \ SystemRoot"(" \ ?? \ C:\ Windows")中有很多文件。
我不知道为什么会这样。
请帮帮我。