【发布时间】:2017-07-28 11:47:39
【问题描述】:
据说可以实际打开和读取 NTFS 卷上的目录。但是,我尝试这个的代码不起作用,所以我尝试了谷歌,它找到了我 this。
关键的观察似乎是您必须使用 FILE_FLAG_BACKUP_SEMANTICS。所以,减少它,我基本上得到:
HANDLE hFile = CreateFile(L"C:\\temp", GENERIC_READ, FILE_SHARE_READ,
0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
DWORD dwFileSize = GetFileSize(hFile, 0);
char* buf = new char[dwFileSize];
DWORD dwBytesRead = 0;
BOOL b = ReadFile(hFile, buf, dwFileSize, &dwBytesRead, 0);
看起来很简单。不幸的是,它不起作用。
CreateFile 和 GetFileSize 都可以工作(句柄不是 INVALID_HANDLE_VALUE,非零且文件大小合理),但 ReadFile 返回 FALSE,dwBytesRead 为零,GetLastError 返回 1(“函数不正确”) .呵呵。
当我输入这个问题时,“类似问题”提示向我显示了this。关于使用AdjustTokenPrivileges 的业务非常有意义。然而,它没有帮助。在该示例中添加 ReadFile(并使用 c:\temp)会产生相同的行为。仔细阅读CreateFile docs 表明,即使没有 SE_BACKUP_NAME 权限,由于管理员权限,我也应该能够打开文件。
我尝试了多种排列方式:
- 指定目录名称的不同方式(
c:\temp、c:\temp\、\\.\c:\temp、\\?\c:\temp\等)。 - 不同的目录
- 不同的驱动器
- 不同的共享选项(0、FILE_SHARE_READ、FILE_SHARE_READ | FILE_SHARE_WRITE)
- 不同的访问权限(
GENERIC_READ、FILE_LIST_DIRECTORY、FILE_LIST_DIRECTORY + FILE_READ_EA + FILE_READ_ATTRIBUTES、FILE_LIST_DIRECTORY + FILE_READ_EA + FILE_READ_ATTRIBUTES + FILE_TRAVERSE) - 除了 FILE_FLAG_BACKUP_SEMANTICS(我认为这是必需的)之外,我看不到任何可能适用的标志,但我尝试了 FILE_FLAG_NO_BUFFERING 和 4096 字节对齐的缓冲区。没有。
我(目前)尝试了 152 种排列,但没有一个 ReadFiles 工作。我错过了什么?
我原来的假设不正确吗?真的不可能从目录中“读取”吗?还是只是我仍然缺少一些技巧?
我还应该提到什么?
- 我以管理员身份运行,可以对卷执行 CreateFile。
- 我的程序是 64 位,专为 unicode 构建的。
- Windows 7 x64
- NTFS 3.1 卷
- 外面多云(嘿,你永远不知道什么是重要的......)
【问题讨论】:
-
你可以打开一个目录的句柄来做某些事情,但调用
ReadFile不是其中之一。 -
msdn.microsoft.com/en-us/library/windows/desktop/… 有一个函数列表,您可以将目录句柄传递给这些函数。
-
您希望从目录中读取什么内容?文件列表?
-
这个问题的目标是能够对目录执行 ReadFile。答案似乎很明确:你不能。如果要读取目录的原始 $INDEX_ALLOCATION 数据,则需要以另一种方式进行(我已经开始编写)。 @JonathanPotter 如果您想发布您的 cmets 作为答案,我会接受。
-
文件系统驱动程序(也包括 ntfs)总是在
IRP_MJ_READ请求目录文件时返回错误代码。通常是STATUS_INVALID_DEVICE_REQUEST或STATUS_INVALID_PARAMETER
标签: windows winapi directory ntfs-mft