在Windows 7上启动时,此代码非常好:

HANDLE hVol = CreateFile(L"\\\\.\\c:", GENERIC_WRITE | GENERIC_READ,
                         FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
// hVol is always successful (both of Win7 and 10), I double-checked
BYTE pData[sizeof(DWORDLONG) + 0x10000];
DWORD cb;
MFT_ENUM_DATA med;
med.StartFileReferenceNumber = 0;
med.LowUsn = 0;
med.HighUsn = MAXLONGLONG;
DeviceIoControl(hVol, FSCTL_ENUM_USN_DATA, &med, sizeof(med), pData, sizeof(pData), &cb, NULL);
err = GetLastError();


但是在Windows 10上运行时出现错误87(ERROR_INVALID_PARAMETER)。这可能是什么原因?

最佳答案

MFT_ENUM_DATA这实际上是typedef,它扩展为MFT_ENUM_DATA_V0MFT_ENUM_DATA_V1取决于NTDDI_VERSION

#if (NTDDI_VERSION >= NTDDI_WIN8)
typedef MFT_ENUM_DATA_V1 MFT_ENUM_DATA, *PMFT_ENUM_DATA;
#else
typedef MFT_ENUM_DATA_V0 MFT_ENUM_DATA, *PMFT_ENUM_DATA;
#endif


显然在您的情况下NTDDI_VERSION >= NTDDI_WIN8,并且您使用MFT_ENUM_DATA_V1

并且您不初始化必须设置为2或3的MaxMajorVersion

因此您需要或添加第med.MaxMajorVersion = 2;行(或3)。或使用MFT_ENUM_DATA_V0 med={};

09-30 21:47