1

これが私が使用しているコードです:

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戻りコードを返します。

4

1 に答える 1

4

NtCreateFileのドキュメントに関するコメントには、次のように書かれています。

FILE_OPEN_BY_FILE_ID を使用する場合、ObjectAttributes.RootDirectory ハンドルにボリュームへのハンドルを入力する必要があります。そうしないと、STATUS_INVALID_PARAMETER が返されます。

ボリュームへのハンドルを開くには、X がドライブ文字でCreateFileあるパスを使用して使用できます。\\.\X:末尾のバックスラッシュがないことに注意してください。CreateFileのドキュメントには、それに関する情報があります (文字列「Opens the C: volume.」を探してください)。

于 2013-01-07T09:49:59.623 に答える