在 linux 中有一个fstat
系统调用,它给出了inode
a 的编号filedescriptor
。
是否有任何系统调用或winapi
函数可以MFT Record Number
从其HANDLE
或文件路径中给出给定文件?
如果没有任何函数或系统调用,那么我应该如何访问其中MFT Record
的文件MFT Table
?
对于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
(我从这里取自结构名称)