Я обновляю свой вопрос, чтобы лучше отражать то, что я на самом деле собирался. Чтобы быстро констатировать факт моей первоначальной путаницы, неверно утверждать, что существует отношение «1 к 1» между « GUID класса интерфейса устройства » и идентификатором экземпляра устройства . Устройство может иметь много интерфейсов устройства. Как отметил Бен Фойгт в комментариях, см. для получения дополнительной информации.
Как можно открыть дескриптор дочернего устройства после вызова CM_Get_Child (...)
функция?
В качестве примера возьмем следующий фрагмент кода:
#pragma comment (lib, "Setupapi.lib")
#pragma comment (lib, "Cfgmgr32.lib")
#include <iostream>
#include <Windows.h>
#include <Setupapi.h>
#include <Cfgmgr32.h>
#define GUID_STRING_SIZE 40
int main ()
{
CONFIGRET CMResult = CR_SUCCESS;
WCHAR DeviceInstanceID[] = L"USB\\VID_2109&PID_0813\\8&216C1825&0&4\0"; // Parent Device Instance ID.
DEVNODE ParentDeviceNode = (DWORD) 0; // A device instance handle. This handle is bounded to the local machine.
CMResult = CM_Locate_DevNode ((PDEVINST) &ParentDeviceNode, DeviceInstanceID, CM_LOCATE_DEVNODE_NORMAL);
if (CMResult != CR_SUCCESS)
{
std::cout << "No parent device node found." << std::endl;
return -1;
}
else
{
DEVINST NextChildDeviceNode = (DWORD) 0;
CMResult = CM_Get_Child ((PDEVINST) &NextChildDeviceNode, ParentDeviceNode, 0x0); // Gets the first child of the parent node. If this returns "CR_NO_SUCH_DEVNODE," then there is no child attached.
if (CMResult != CR_SUCCESS)
{
std::cout << "No child device node found." << std::endl;
return -2;
}
else
{
ULONG ChildInstanceIDBuffLength = 0;
CMResult = CM_Get_Device_ID_Size (&ChildInstanceIDBuffLength, NextChildDeviceNode, 0x0);
if (CMResult != CR_SUCCESS)
{
std::cout << "Could not get the size of the device instance ID of child device." << std::endl;
return -3;
}
else
{
WCHAR * ChildInstanceIDBuff = (WCHAR *) malloc (ChildInstanceIDBuffLength);
CMResult = CM_Get_Device_IDW (NextChildDeviceNode, ChildInstanceIDBuff, ChildInstanceIDBuffLength, 0x0);
if (CMResult != CR_SUCCESS)
{
std::cout << "Could not actual device instance ID string of child device" << std::endl;
return -4;
}
else
{
std::cout << "Found child device instance ID: ";
std::wcout << ChildInstanceIDBuff << std::endl;
/*
* Open handle to the child device node now!
*/
}
free (ChildInstanceIDBuff);
}
}
}
return 0;
}
Как я могу использовать только что полученного ребенка Идентификатор экземпляра устройства , чтобы открыть дескриптор устройства? CreateFile (...)
требуется полный путь к устройству, включая отсутствующий «GUID класса интерфейса устройства».
В частности, путь к устройству имеет следующий формат:
\\?\usb#vid_2109&pid_0813#7&3981C8D6&0&2#{[DEVICE_INTERFACE_GUID]}
, где:
- [DEVICE_INTERFACE_GUID] - Это " Класс интерфейса устройства" GUID «. Это НЕ то же самое, что " GUID класса настройки устройства ."
Похоже, что это не простой способ получить это " GUID класса интерфейса устройства"без некоторого уровня грубой силы (например, CM_Enumerate_Classes (...)
с использованием флага CM_ENUMERATE_CLASSES_INTERFACE). Есть ли функция, которую я могу вызвать, чтобы получить дескриптор устройства, используя только его « Идентификатор устройства », чтобы я мог затем вызвать DeviceIoControl (...)
и запросить информацию об устройстве?