【发布时间】:2015-02-20 00:54:27
【问题描述】:
我在用于获取设备信息的结构方面遇到了一些问题。据我了解,正确设置 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_INTERFACE_DEVICE_DATA 和 SP_DEVICE_INTERFACE_DETAIL_DATA 导致同样的错误
非常感谢任何帮助!
【问题讨论】:
-
这不是错误,但是如果您要进行 memset 操作,我建议您直接使用
sizeof (DeviceInfoData)即变量,因此如果它的类型发生变化,它仍然可以工作。你也可以试试SP_DEVINFO_DATA DeviceInfoData = {}; -
好收获。是的,非常真实。谢谢!
-
您在第一次调用时检索必要的缓冲区大小,但将其传递给第二次调用实际上并未分配该空间。你在向 API 撒谎说有多少可用空间,所以它覆盖堆栈真的不是 API 的错。
标签: c++ windows-8 device-driver hid