DeviceIoControl GetLastError 87 (ERROR_INVALID_PARAMETER)
DeviceIoControl GetLastError 87 (ERROR_INVALID_PARAMETER)
此代码在 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_V0
或 MFT_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={};
此代码在 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_V0
或 MFT_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={};