1

在 linux 中有一个fstat系统调用,它给出了inodea 的编号filedescriptor

是否有任何系统调用或winapi函数可以MFT Record Number从其HANDLE或文件路径中给出给定文件?

如果没有任何函数或系统调用,那么我应该如何访问其中MFT Record的文件MFT Table

4

1 回答 1

1

对于MFT Record Number给定的文件需要使用FileInternalInformation- 这里返回FILE_INTERNAL_INFORMATION。真的这是 48 低位MftRecordIndex和 16 高位SequenceNumber

struct 
{
    LONGLONG    MftRecordIndex : 48;
    LONGLONG    SequenceNumber : 16;
};

也看看MFT_SEGMENT_REFERENCE- 这是相同的结构

然后MFT Record用作FSCTL_GET_NTFS_FILE_RECORD输入数据 - FileReferenceNumber- 这FILE_INTERNAL_INFORMATION.IndexNumber只是(!)只有低 48 位(MftRecordIndex)所以你需要零高 16 位(SequenceNumber)然后使用FILE_INTERNAL_INFORMATION到位NTFS_FILE_RECORD_INPUT_BUFFER以了解NTFS_FILE_RECORD_OUTPUT_BUFFER大小 - 你需要首先获得NTFS_VOLUME_DATA_BUFFER帮助FSCTL_GET_NTFS_VOLUME_DATA并使用NTFS_VOLUME_DATA_BUFFER.BytesPerFileRecordSegment

NTSTATUS Test(POBJECT_ATTRIBUTES poa)
{
    HANDLE hFile, hVolume = 0;
    IO_STATUS_BLOCK iosb;

    NTSTATUS status = NtOpenFile(&hFile, SYNCHRONIZE, poa, &iosb, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT);

    if (0 <= status)
    {
        union 
        {
            FILE_INTERNAL_INFORMATION fii;

            NTFS_FILE_RECORD_INPUT_BUFFER nfrib;

            struct  
            {
                LONGLONG MftRecordIndex : 48;
                LONGLONG SequenceNumber : 16;
            };
        };

        if (0 <= (status = NtQueryInformationFile(hFile, &iosb, &fii, sizeof(fii), FileInternalInformation)))
        {
            //need open '\Device\HarddiskVolume<N>' or '<X>:'
            status = OpenVolume(hFile, &hVolume);
        }

        NtClose(hFile);

        if (0 <= status)
        {
            NTFS_VOLUME_DATA_BUFFER nvdb;

            if (0 <= (status = NtFsControlFile(hVolume, 0, 0, 0, &iosb, FSCTL_GET_NTFS_VOLUME_DATA, 0, 0, &nvdb, sizeof(nvdb))))
            {
                DWORD cb = FIELD_OFFSET(NTFS_FILE_RECORD_OUTPUT_BUFFER,
                    FileRecordBuffer[nvdb.BytesPerFileRecordSegment]);

                PNTFS_FILE_RECORD_OUTPUT_BUFFER pnfrob = (PNTFS_FILE_RECORD_OUTPUT_BUFFER)alloca(cb);

                SequenceNumber = 0;

                if (0 <= (status = NtFsControlFile(hVolume, 0, 0, 0, &iosb, 
                    FSCTL_GET_NTFS_FILE_RECORD, &nfrib, sizeof nfrib, pnfrob, cb)))
                {
                    NTFS_FILE_RECORD_HEADER* pnfrh = (NTFS_FILE_RECORD_HEADER*)pnfrob->FileRecordBuffer;;
                }
            }

            NtClose(hVolume);
        }
    }

    return status;
}

NTFS_FILE_RECORD_HEADER - 这是FILE_RECORD_SEGMENT_HEADER(我从这里取自结构名称)

于 2016-09-03T19:24:15.107 回答