これが私が使用しているコードです:
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は、USNChangeJournalからのものです。ルートハンドルを使用して変更ジャーナルを正常に読み取りました(したがって、正しいと思います)。各エントリに対して、frnとparent_frnがあります。ファイルへのフルパスを取得したいのですが、以下のコードは、frnをパスに変換しようとしている方法です。frnとparent_frnの両方が同じSTATUS_INVALID_PARAMETER
戻りコードを返します。