这是我正在使用的代码:
std::wstring GetPathFromFileReference (DWORDLONG frn)
{
if (frn != 0)
{
HANDLE handle = NULL;
wchar_t file_buffer[2048] = { NULL };
wchar_t unicode_buffer[8] = { NULL };
UNICODE_STRING unicodeString;
unicodeString.Length = 8;
unicodeString.MaximumLength = 8;
unicodeString.Buffer = unicode_buffer;
OBJECT_ATTRIBUTES objAttributes = { NULL };
InitializeObjectAttributes(&objAttributes, &unicodeString, OBJ_CASE_INSENSITIVE, _root, NULL);
IO_STATUS_BLOCK ioStatusBlock = { NULL };
LARGE_INTEGER allocSize = { NULL };
int _result = NtCreateFile(&handle, GENERIC_ALL /*FILE_TRAVERSE*/ /* FILE_READ_DATA */, &objAttributes, &ioStatusBlock, /*&allocSize*/ NULL , NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_OPEN_BY_FILE_ID | FILE_NON_DIRECTORY_FILE /*FILE_OPEN_FOR_BACKUP_INTENT*/, NULL, NULL);
if (_result == S_OK)
{
typedef NTSTATUS (NTAPI *LPFN_NtQueryInformationFile) (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, int);
LPFN_NtQueryInformationFile pfnNtQueryInformationFile = (LPFN_NtQueryInformationFile)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationFile");
_result = pfnNtQueryInformationFile(handle, &ioStatusBlock, file_buffer, 4096, 9);
if (_result == S_OK)
{
return std::wstring(file_buffer + 2);
}
}
}
return L"";
}
调用NtCreateFile
失败,出现STATUS_INVALID_PARAMETER
. 该调用中注释掉的代码显示了我尝试过的其他事情。
RootDirectory 句柄肯定在 objAttributes 中设置(到 0x30)。我在代码的其他地方使用了相同的句柄,它运行良好。而且frn看起来也不错。
我不知道还有什么可以尝试或如何进一步缩小原因:(任何帮助将不胜感激。
编辑:我忘了提到我在这里想要实现的目标。对不起!frn 来自 USN Change Journal。我已经使用我的根句柄成功阅读了更改日志(因此我相信它是正确的),并且对于每个条目,我都有一个 frn 和 parent_frn。我想获取文件的完整路径,下面的代码是我尝试将 frn 转换为路径的方式。frn 和 parent_frn 都给出相同的STATUS_INVALID_PARAMETER
返回码。