C++ SetupDiXxx结构的堆栈损坏

C++ SetupDiXxx结构的堆栈损坏,c++,windows-8,device-driver,hid,C++,Windows 8,Device Driver,Hid,我对用于获取设备信息的结构有一些问题。据我所知,正确设置cbSize有点棘手,因此API写入的数据超出了预期范围(导致堆栈损坏)。到目前为止,我有以下代码: GUID guid; HidD_GetHidGuid(&guid); HDEVINFO info; info = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); SP_DEVINFO_DATA DeviceInf

我对用于获取设备信息的结构有一些问题。据我所知,正确设置cbSize有点棘手,因此API写入的数据超出了预期范围(导致堆栈损坏)。到目前为止,我有以下代码:

GUID guid;
HidD_GetHidGuid(&guid);

HDEVINFO info;
info = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

SP_DEVINFO_DATA DeviceInfoData;

memset(&DeviceInfoData, 0, sizeof(SP_DEVINFO_DATA));
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);


int deviceIndex = 0;
while (SetupDiEnumDeviceInfo(info, deviceIndex++, &DeviceInfoData))
{
    SP_INTERFACE_DEVICE_DATA data;
    data.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);

    int interfaceIndex = 0;


    while (SetupDiEnumDeviceInterfaces(info, &DeviceInfoData, &guid, interfaceIndex++, &data))
    {

        //https://msdn.microsoft.com/en-us/library/windows/hardware/ff551120%28v=vs.85%29.aspx
        //Get the required buffer size. Call SetupDiGetDeviceInterfaceDetail with a NULLDeviceInterfaceDetailData pointer, 
        //a DeviceInterfaceDetailDataSize of zero, and a valid RequiredSize variable. In response to such a call, this function
        //returns the required buffer size at RequiredSize and fails with GetLastError returning ERROR_INSUFFICIENT_BUFFER.

        SP_DEVICE_INTERFACE_DETAIL_DATA interfaceData;
        interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

        DWORD bufferSize = 0;
        SetupDiGetDeviceInterfaceDetail(info, &data, NULL, 0, &bufferSize, nullptr);

        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
            //Call the function again
            SetupDiGetDeviceInterfaceDetail(info, &data, &interfaceData, bufferSize, NULL, &DeviceInfoData);

            DWORD error = GetLastError();
            if (error != ERROR_SUCCESS)
            {
                printf("Could not obtain device interface details. Error: %d \n", error);
            }
        }
    }
我得到的错误是:

    Run-Time Check Failure #2 - Stack around the variable 'DeviceInfoData' was corrupted.
虽然我看到
SP\u接口\u设备\u数据
SP\u设备\u接口\u详细信息\u数据
导致相同的错误


非常感谢您的帮助

看起来您的
接口数据
缓冲区太小


再次检查
SetupDiGetDeviceInterfaceDetail
DeviceInterfaceDetailData
参数。

您的
interfaceData
缓冲区似乎太小


再次检查
SetupDiGetDeviceInterfaceDetail
DeviceInterfaceDetailData
参数。

您的
interfaceData
缓冲区似乎太小


再次检查
SetupDiGetDeviceInterfaceDetail
DeviceInterfaceDetailData
参数。

您的
interfaceData
缓冲区似乎太小


再次检查
DeviceInterfaceDetailData
参数以
SetupDiGetDeviceInterfaceDetail

如果您想获得有关驱动程序开发的更多信息,我建议您阅读
USB Complete
一书。我根据他们的解释解决了这个问题。问题如下:

首先,获取缓冲区大小:

SetupDiGetDeviceInterfaceDetail(info, &data, NULL, 0, &bufferSize, nullptr);
然后,根据返回的大小,使用malloc手动分配
PSP\u设备\u接口\u详细信息\u数据
结构:

PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceData;
interfaceData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
请注意
PSP\u设备\u接口\u细节\u数据前面的
p
。这是Microsofts针对该API的语义。它代表指针;查看文档时很容易遗漏的内容(如果您也遗漏了
->

SetupDiGetDeviceInterfaceDetail
函数返回整个结构的大小,因此需要将其分配到该大小。我见过一些例子,它们试图增加大小,直到错误消失。这种方法是错误的。。。原因很多。从
SetupDiGetDeviceInterfaceDetail
获取大小,然后根据该大小分配整个
PSP\u设备\u接口\u细节\u数据
内存块。不要忘记将cbSize设置为结构的大小
SP\u设备\u接口\u细节\u数据


再次,请注意命名约定中的
p
,因为很容易错误地获得
sizeof(PSP\u设备\u接口\u细节\u数据)

如果您想获得有关驱动程序开发的更多信息,我建议您阅读
USB Complete
。我根据他们的解释解决了这个问题。问题如下:

首先,获取缓冲区大小:

SetupDiGetDeviceInterfaceDetail(info, &data, NULL, 0, &bufferSize, nullptr);
然后,根据返回的大小,使用malloc手动分配
PSP\u设备\u接口\u详细信息\u数据
结构:

PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceData;
interfaceData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
请注意
PSP\u设备\u接口\u细节\u数据前面的
p
。这是Microsofts针对该API的语义。它代表指针;查看文档时很容易遗漏的内容(如果您也遗漏了
->

SetupDiGetDeviceInterfaceDetail
函数返回整个结构的大小,因此需要将其分配到该大小。我见过一些例子,它们试图增加大小,直到错误消失。这种方法是错误的。。。原因很多。从
SetupDiGetDeviceInterfaceDetail
获取大小,然后根据该大小分配整个
PSP\u设备\u接口\u细节\u数据
内存块。不要忘记将cbSize设置为结构的大小
SP\u设备\u接口\u细节\u数据


再次,请注意命名约定中的
p
,因为很容易错误地获得
sizeof(PSP\u设备\u接口\u细节\u数据)

如果您想获得有关驱动程序开发的更多信息,我建议您阅读
USB Complete
。我根据他们的解释解决了这个问题。问题如下:

首先,获取缓冲区大小:

SetupDiGetDeviceInterfaceDetail(info, &data, NULL, 0, &bufferSize, nullptr);
然后,根据返回的大小,使用malloc手动分配
PSP\u设备\u接口\u详细信息\u数据
结构:

PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceData;
interfaceData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
请注意
PSP\u设备\u接口\u细节\u数据前面的
p
。这是Microsofts针对该API的语义。它代表指针;查看文档时很容易遗漏的内容(如果您也遗漏了
->

SetupDiGetDeviceInterfaceDetail
函数返回整个结构的大小,因此需要将其分配到该大小。我见过一些例子,它们试图增加大小,直到错误消失。这种方法是错误的。。。原因很多。从
SetupDiGetDeviceInterfaceDetail
获取大小,然后根据该大小分配整个
PSP\u设备\u接口\u细节\u数据
内存块。不要忘记将cbSize设置为结构的大小
SP\u设备\u接口\u细节\u数据


再次,请注意命名约定中的
p
,因为很容易错误地获得
sizeof(PSP\u设备\u接口\u细节\u数据)

如果您想获得有关驱动程序开发的更多信息,我建议您阅读
USB Complete
。我根据他们的解释解决了这个问题。问题如下:

首先,获取缓冲区大小:

SetupDiGetDeviceInterfaceDetail(info, &data, NULL, 0, &bufferSize, nullptr);
然后,根据返回的大小,使用malloc手动分配
PSP\u设备\u接口\u详细信息\u数据
结构:

PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceData;
interfaceData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
请注意
PSP\u设备\u接口\u细节\u数据前面的
p
。这是Microsofts针对该API的语义。它代表指针;查看文档时很容易遗漏的内容(如果您也遗漏了
->

SetupDiGetDeviceInterface