使用MFT_ENUM_DATA监视NTFS卷上的删除和更改

时间:2017-07-30 21:36:04

标签: c++ windows winapi ntfs usn

我使用此代码填充磁盘上所有文件的数据库:

TCHAR szVolumePath[_MAX_PATH] = L"\\\\.\\d:";

HANDLE hDrive = CreateFile(szVolumePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);

MFT_ENUM_DATA_V0 med = { 0 };
med.StartFileReferenceNumber = 0;
med.LowUsn = 0;
med.HighUsn = MAXLONGLONG;

DWORD cb;
PUSN_RECORD pRecord;

unsigned char pData[sizeof(DWORDLONG) + 0x10000] = { 0 }; 

while (DeviceIoControl(hDrive, FSCTL_ENUM_USN_DATA, &med, sizeof(med), pData, sizeof(pData), &cb, NULL) != FALSE)
{
    pRecord = (PUSN_RECORD)&pData[sizeof(USN)];
    while ((PBYTE)pRecord < (pData + cb))
    {
        wstring sz((LPCWSTR)(PBYTE)pRecord + pRecord->FileNameOffset, pRecord->FileNameLength / sizeof(WCHAR));

        // file the database

        pRecord = (PUSN_RECORD)((PBYTE)pRecord + pRecord->RecordLength);
    }
    med.StartFileReferenceNumber = *(DWORDLONG *)pData;
}

循环完成后,数据库成功填充。

但是如何继续(作为后台任务)实时监控文件更改/删除?(例如:显示MessageBox()&#34;文件readme.txt已被。更名&#34)

我应该每隔1秒重新启动一次这样的循环,med.StartFileReferenceNumber =之前看到的最高FileReferenceNumber吗?

注意:我有点不愿意每1秒启动一次此代码(99%的情况下,没有任何内容)。相反,每10秒做一次就可以避免使用这么多资源,但是在检测到变化之前会有一段延迟,而我确实知道一些没有这种延迟的索引软件。

注2:我读过How can I detect only deleted, changed, and created files on a volume?但主要答案的目的是运行一次,而不是经常在后台运行。

注意3:我查看了Microsoft Keeping an Eye on Your NTFS Drives: the Windows 2000 Change Journal Explained 中这个有用的代码示例。

注意4:我应该保留FSCTL_ENUM_USN_DATA初始数据库加载,然后使用FSCTL_READ_USN_JOURNAL吗?

Note5:ReadDirectoryChangesWFindNextChangeNotification(前者提供了通知中的完整更改路径,后者并未真正使用),因为它无法提供{删除文件的{1}}(必须打开文件并使用FileReferenceNumber来获取它;但这对于删除的文件是不可能的);和FileReferenceNumber是更新文件数据库所必需的(文件数据库使用带有FileReferenceNumbers作为键的地图/字典)。

0 个答案:

没有答案