- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 C 读取本地系统的 MFT。我在互联网上寻找解决方案,但没有找到。我希望有人为我提供一个教程,或者通过代码示例提供有关如何执行此操作的良好解释。提前致谢。
最佳答案
首先,我们需要使用 FILE_READ_DATA
权限打开卷句柄。
然后我们需要用NTFS_VOLUME_DATA_BUFFER
控制代码来查询FSCTL_GET_NTFS_VOLUME_DATA
。
从这里我们得到了单个 MFT 记录的大小 - BytesPerFileRecordSegment
,MFT 的总大小 - MftValidDataLength
.因此最大记录数为(MftValidDataLength.QuadPart/BytesPerFileRecordSegment)
。
正确的方法(与 NTFS 同步)是通过 FSCTL_GET_NTFS_FILE_RECORD
读取单个记录。
如果您想一次读取多条记录 - 当然可以直接从卷中读取。我们有 MFT 的起始 LCN - MftStartLcn
。但是MFT可以有几个不连续的片段。所以如果我们想获取所有片段位置,我们需要使用FSCTL_GET_RETRIEVAL_POINTERS
。要将LCN转换为卷偏移量,我们需要将其乘以BytesPerCluster
。
演示代码:
void ReadMft(PCWSTR szVolume)
{
HANDLE hVolume = CreateFileW(szVolume, FILE_READ_DATA, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, FILE_OPEN_FOR_BACKUP_INTENT, 0);
if (hVolume != INVALID_HANDLE_VALUE)
{
NTFS_VOLUME_DATA_BUFFER nvdb;
OVERLAPPED ov = {};
if (DeviceIoControl(hVolume, FSCTL_GET_NTFS_VOLUME_DATA, 0, 0, &nvdb, sizeof(nvdb), 0, &ov))
{
NTFS_FILE_RECORD_INPUT_BUFFER nfrib;
nfrib.FileReferenceNumber.QuadPart = nvdb.MftValidDataLength.QuadPart / nvdb.BytesPerFileRecordSegment - 1;
ULONG cb = __builtin_offsetof(NTFS_FILE_RECORD_OUTPUT_BUFFER, FileRecordBuffer[nvdb.BytesPerFileRecordSegment]);
PNTFS_FILE_RECORD_OUTPUT_BUFFER pnfrob = (PNTFS_FILE_RECORD_OUTPUT_BUFFER)alloca(cb);
do
{
if (!DeviceIoControl(hVolume, FSCTL_GET_NTFS_FILE_RECORD,
&nfrib, sizeof(nfrib), pnfrob, cb, 0, &ov))
{
break;
}
// pnfrob->FileRecordBuffer :
// here pnfrob->FileReferenceNumber FileRecord
} while (0 <= (nfrib.FileReferenceNumber.QuadPart = pnfrob->FileReferenceNumber.QuadPart - 1));
ReadMft2(szVolume, hVolume, &nvdb);
}
CloseHandle(hVolume);
}
}
void ReadMft2(PCWSTR szVolume, HANDLE hVolume, PNTFS_VOLUME_DATA_BUFFER nvdb)
{
static PCWSTR MFT = L"\\$MFT";
static STARTING_VCN_INPUT_BUFFER vcn {};
static volatile UCHAR guz;
PVOID stack = alloca(guz);
union {
PVOID buf;
PWSTR lpFileName;
PRETRIEVAL_POINTERS_BUFFER rpb;
};
buf = alloca(wcslen(szVolume) * sizeof(WCHAR) + sizeof(MFT));
wcscat(wcscpy(lpFileName, szVolume), MFT);
HANDLE hFile = CreateFileW(lpFileName, 0, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, FILE_OPEN_FOR_BACKUP_INTENT, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
OVERLAPPED ov{};
ULONG cb = RtlPointerToOffset(buf, stack), rcb, ExtentCount = 2;
do
{
rcb = __builtin_offsetof(RETRIEVAL_POINTERS_BUFFER, Extents[ExtentCount]);
if (cb < rcb)
{
cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
}
if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &vcn, sizeof(vcn), buf, cb, 0, &ov))
{
if (rpb->Extents->Lcn.QuadPart != nvdb->MftStartLcn.QuadPart)
{
__debugbreak();
}
if (ExtentCount = rpb->ExtentCount)
{
auto Extents = rpb->Extents;
ULONG BytesPerCluster = nvdb->BytesPerCluster;
ULONG BytesPerFileRecordSegment = nvdb->BytesPerFileRecordSegment;
LONGLONG StartingVcn = rpb->StartingVcn.QuadPart, NextVcn, len;
PVOID FileRecordBuffer = alloca(BytesPerFileRecordSegment);
do
{
NextVcn = Extents->NextVcn.QuadPart;
len = NextVcn - StartingVcn, StartingVcn = NextVcn;
DbgPrint("%I64x %I64x\n", Extents->Lcn.QuadPart, len);
if (Extents->Lcn.QuadPart != -1)
{
Extents->Lcn.QuadPart *= BytesPerCluster;
ov.Offset = Extents->Lcn.LowPart;
ov.OffsetHigh = Extents->Lcn.HighPart;
// read 1 record
ReadFile(hVolume, FileRecordBuffer, BytesPerFileRecordSegment, 0, &ov);
}
} while (Extents++, --ExtentCount);
}
break;
}
ExtentCount <<= 1;
} while (GetLastError() == ERROR_MORE_DATA);
CloseHandle(hFile);
}
}
关于c - 如何用C读取主文件表(MFT)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54606760/
我在一个项目中工作,我必须从驱动器中枚举文件名。我尝试了两种方法 MFT 解析和 使用 FindFirstFile 进行多线程处理。我比较了两种实现的执行时间,它显示较小的 MFT 大小执行速度更快,
我正在使用 DesktopDuplication API 捕获桌面并将样本从 RGBA 转换为 GPU 中的 NV12,并将其提供给 MediaFoundation 硬件 H264 MFT。这适用于
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我正在编写一些代码来解析 NTFS 卷中磁盘上的 MFT。这很简单,但是一个特殊的极端案例引起了我的注意,我在互联网上的任何地方都找不到明确的答案。 对于 NTFS 中的普通文件,如果文件的属性多于单
我正在尝试提取主文件表(MFT)的内容。我已从 NTFS 卷复制 MFT 并将其另存为 .bin 文件。现在我尝试使用Python中提供的unpack函数来读取这个文件。我正在读取为存储在文件记录的文
对于我正在做的一些商业项目,我需要能够读取存储在 $mft 文件中的实际数据。 我找到了一个 gpl lib这可能会有所帮助,但由于它是 gpl,我无法将它集成到我的代码中。 有人可以指点我可以使用的
我正在编写一个程序来删除 Windows NTFS 卷中的文件和所有相关属性(包括 0x30 $FILE_NAME、0x80 $DATA、0x90 $INDEX_ROOT 和 0xA0 $INDEX_
在网上寻找有关如何读/写 MFT 的解释时,我发现了以下部分:( http://www.installsetupconfig.com/win32programming/1996%20AppE_apni
我正在使用 Windows Media Foundation 创建视频播放应用程序。 我使用 IMFTransform 接口(interface)和下面链接中提到的其他一些强制接口(interface
我也是媒体基础编程和 Windows 编程的新手。 这个问题看起来可能很愚蠢,但我在任何地方都没有得到明确的答案。 我的应用程序是捕获屏幕、缩放、编码并将数据发送到网络。我希望提高管道的性能。所以我想
有什么方法可以用 Python 或 JavaScript 访问 NTFS 主文件表 (MFT)? 最佳答案 您需要一个库来分析 NTFS 文件系统中的主文件表 ($MFT)。 对于 Python,有
我正在尝试从 MFT 中删除一个文件记录,如果我打开原始分区并通过解析 MFT 文件到达所需的文件记录,我就成功了。这种方法的问题是我必须首先锁定卷,以便我可以在任何 MFT 文件记录上写入零,如果其
要使用 Windows Media Foundation Transform 解码 H264 流,目前的工作流程是这样的: IMFSample sample; sample->SetTime(time
在我的 C# 应用程序中,我已经有了一种检查文件系统的方法,但我想利用从主文件表 (MFT) 读取的优势,因为它要快得多。我了解 1) 它是专有规范,因此如有更改,恕不另行通知,以及 2) 只有当应用
有人遇到过 VideoToolbox 无法正确解码媒体基础变换 (MFT) 编码的 H264 的问题吗?解码帧的一半以上具有绿色 block 失真。我试过Livy Stork's example用于解
我现在尝试在 Win10 pro Insider 预览版上使用 MP3 编码器 mft,但无法设置输出媒体类型。 下面是我的代码: // Fill in MPEGLAYER3WAVEFORMAT da
我正在努力将两个音频流混合成一个输出流。 MFNode 有一个 AudioMixerMFT,但当我尝试构建这样的拓扑并执行它时 TopoEdit 崩溃: 注意:我尝试了 Windows SDK 7.1
我正在编写一个工具,用于查找 iTunes 库中丢失的文件,适用于 Mac 和 Windows。在 Mac 上,我可以使用神奇的“目录搜索”功能通过命名快速查找文件。 但是,在 Windows 上,似
媒体基础转换对象 (MFT) 可以实现输出缓冲区分配模型,其中缓冲区由 MFT 对象在内部分配。 如果是这种情况,内部分配的缓冲区将通过传递给 IMFTransform::ProcessOutput(
我想使用“英特尔® 快速同步视频 H.264 编码器 MFT”对视频进行编码。如果我从系统缓冲区创建 IMFSample,它运行良好。就像下面这样: IMFMediaBuffer *pBuffer =
我是一名优秀的程序员,十分优秀!