Получите случайную точку останова, а затем необработанное исключение при попытке использовать синтаксис из setup.api - PullRequest
0 голосов
/ 06 июня 2018

Я часами просматривал этот код, пробуя разные вещи.Но безрезультатно.После запуска приведенного ниже кода иногда возникает исключение «.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 Ответ

0 голосов
/ 07 июня 2018

Обнаружил мою ошибку.

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

 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...