Получите случайную точку останова, а затем необработанное исключение при попытке использовать синтаксис из setup.api

Я часами просматривал этот код, пробуя разные вещи. Но безрезультатно. После запуска приведенного ниже кода иногда возникает исключение «.exe вызвал точку останова».

После нажатия кнопки «Продолжить» появится сообщение «Необработанное исключение в 0x00007FFCF935775F (ntdll.dll) в SeekThermalCPP_V3.exe: 0xC0000374: повреждена куча (параметры: 0x00007FFCF93B86B0)».

Затем я снова нажимаю продолжить и получаю мои фактические результаты (которые являются путями к устройствам).

Я попытался установить свои собственные точки останова и посмотреть на значения. Но все они выглядят хорошо. Я переключился между 32 и 64 битами, но это мало что значило.

Кажется, проблема возникает в GetDevicePathString (). если я удаляю его, в двух первых двух методах проблем не возникает.

Большое спасибо, любая помощь и / или совет будут оценены! Если я не делаю что-то правильно, пожалуйста, сообщите.


Код ниже

Я пытаюсь получить путь к устройству. Сначала я нахожу GUID, а затем я смотрю на интерфейсы устройства. Из SetupDiGetDeviceInterfaceDetail я пытаюсь получить SP_DEVICE_INTERFACE_DETAIL_DATA и получить DevicePath. Я хочу использовать этот путь устройства позже для отправки команд на мое USB-устройство. Я думаю об использовании WINUSB API для этого.

#include "stdafx.h"#include <iostream>
#include <string>
#include <windows.h>
#include <SetupAPI.h>
#include <Cfgmgr32.h>
#include <vector>
//#include <winusb.h>
#pragma comment (lib, "Setupapi.lib")

using namespace std;

vector<GUID> EnumerateAllWinUsbGuids();
void FindUsbDevicePath(GUID inputGUID);
void GetDevicePathString(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData);

int main()
{
vector<GUID> guid = EnumerateAllWinUsbGuids();
GUID guid0 = guid[0];

GUID guid1 = guid[1];FindUsbDevicePath(guid0);

FindUsbDevicePath(guid1);

std::getchar();
return 0;
}

vector<GUID> EnumerateAllWinUsbGuids()
{
vector<GUID> dataVECTOR;
HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);

PSP_DEVINFO_DATA devInfoData = new SP_DEVINFO_DATA();
devInfoData->cbSize = sizeof(SP_DEVINFO_DATA);

for (unsigned int i = 0;; i++)
{
bool checkINFO = SetupDiEnumDeviceInfo(DeviceInfoSet, i, devInfoData);

HKEY hkey = SetupDiOpenDevRegKey(DeviceInfoSet, devInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY);

if (!checkINFO)
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
RegCloseKey(hkey);
break;
}

wchar_t dataIN[MAX_DEVICE_ID_LEN];
unsigned long outLength = sizeof(dataIN);

LPCWSTR deviceProperty = L"DeviceInterfaceGUIDs";

long checkGET = RegGetValue(hkey, NULL, deviceProperty, RRF_RT_REG_SZ | RRF_RT_REG_MULTI_SZ, NULL, &dataIN, &outLength);

if (checkGET == 0)
{
GUID guid;
CLSIDFromString(dataIN, (LPCLSID)&guid);
dataVECTOR.push_back(guid);
}
}
return dataVECTOR;
}

void FindUsbDevicePath(GUID inputGUID)
{
HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(&inputGUID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (GetLastError() == 8)
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
}
cout << "LAST ERROR SetupDiGetClassDevs : " << GetLastError() << endl;

unsigned long i = 0;
while (true)
{
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

bool checkINFO = SetupDiEnumDeviceInterfaces(DeviceInfoSet, NULL, &inputGUID, i, &DeviceInterfaceData);
if (!checkINFO)
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
break;
}
GetDevicePathString(DeviceInfoSet, &DeviceInterfaceData);
i++;
}
}

void GetDevicePathString(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
{
unsigned long checkSize;
bool check = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, DeviceInterfaceData, NULL, 0, &checkSize, NULL);
cout << "LAST ERROR SetupDiGetDeviceInterfaceDetail 1: " << GetLastError() << endl;

unsigned long trueSize = checkSize;
int** pointerSize;
cout << "size of a pointer : " << sizeof(pointerSize) << endl;
unsigned long structlength = 6;
if (sizeof(pointerSize) == 8) { structlength = 8; }

PSP_DEVICE_INTERFACE_DETAIL_DATA mem = new SP_DEVICE_INTERFACE_DETAIL_DATA();
mem->cbSize = structlength;
check = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, DeviceInterfaceData, mem, trueSize, &checkSize, NULL);
cout << "LAST ERROR SetupDiGetDeviceInterfaceDetail 2: " << GetLastError() << endl;

wstring dataSTR = wstring(mem->DevicePath);
wcout << dataSTR << endl;
}

-1

Решение

Нашел мою ошибку.

Исправлено добавлением следующей строки в мой код:

 PSP_DEVICE_INTERFACE_DETAIL_DATA mem = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, size);

Мне нужно было выделить определенное количество байтов памяти. Причина этого заключается в том, что недостаточно памяти было выделено с использованием «new»; это мое предположение. Если кто-то знает, почему это решило проблему, пожалуйста, прокомментируйте ниже, чтобы дать больше информации.

Пример по ссылке ниже помог мне найти решение.

https://msdn.microsoft.com/en-us/library/windows/desktop/bb204769(v=vs.85).aspx

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]