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