SetupDiGetDriverInfoDetail 失败。 SP_DRVINFO_DETAIL_DATA 的尺寸太小?

SetupDiGetDriverInfoDetail fails. Size of SP_DRVINFO_DETAIL_DATA too small?

我正在调用设置 API 函数 SetupDiGetDriverInfoDetail,如下所示:

SP_DRVINFO_DETAIL_DATA_W driverDetailData = SP_DRVINFO_DETAIL_DATA_W();
driverDetailData.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA_W);
  
DWORD reqSize = 0;
  
ok = SetupDiGetDriverInfoDetailW(deviceList, nullptr, &driverData, &driverDetailData, sizeof(SP_DRVINFO_DETAIL_DATA_W), &reqSize);

调用returns false,最后的Windows错误代码是0x7a(ERROR_INSUFFICIENT_BUFFER”)。当我比较 cbSize 和 reqSize 时,我明白了原因:cbSize 是 1584 字节,reqSize 是 1622 字节。

如果我正确理解 SetupDiGetDriverInfoDetail 上的 MSDN 页面 (https://docs.microsoft.com/en-us/windows/win32/api/setupapi/nf-setupapi-setupdigetdriverinfodetailw),我的调用应该会按预期工作。

我错过了什么?如何正确调用 SetupDiGetDriverInfoDetail,以便输入缓冲区足够大以确保调用成功?

SP_DRVINFO_DETAIL_DATA 是可变长度结构,因为末尾有 HardwareID[ANYSIZE_ARRAY]; 缓冲区。一旦知道所需的大小,就可以动态分配它。

DWORD reqSize = 0;
SetupDiGetDriverInfoDetailW(deviceList, nullptr, &driverData, NULL, 0, &reqSize);

SP_DRVINFO_DETAIL_DATA_W *driverDetailData = (SP_DRVINFO_DETAIL_DATA_W *)calloc(1, reqSize);
driverDetailData->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA_W);

SetupDiGetDriverInfoDetailW(deviceList, nullptr, &driverData, driverDetailData, reqSize, &reqSize);