Что такое целевое устройство IOCTL_USB_GET_ROOT_HUB_NAME (драйвер IOCTL для конкретного драйвера USB) - PullRequest
0 голосов
/ 28 марта 2011

Меня немного смущает USB IOCTL IOCTL_USB_GET_ROOT_HUB_NAME . Каково целевое устройство этого? Хотя в документе MSDN WDK четко указано целевое устройство, меня все еще смущает пример USBVIEW, предоставленный WDK. Причина, по которой я запутался, заключается в следующем:

Я новичок в режиме ядра и записи драйвера USB в Windows и сейчас изучаю образец USBVIEW из набора драйверов Windows http://msdn.microsoft.com/en-us/library/ff558728(v=vs.85).aspx. MSDN описывает первый шаг, который выполняет образец USBVIEW:

Перечисление хост-контроллеров и root концентраторы. Хост-контроллеры имеют символические имена ссылок вида "HCDx", где x начинается с 0.

Используйте CreateFile (), чтобы открыть каждый хост контроллер символическая ссылка.

Создать узел в древовидном представлении, чтобы представлять каждый хост-контроллер.

После того, как хост-контроллер был открыт, отправьте хост-контроллер IOCTL_USB_GET_ROOT_HUB_NAME запросить получить символическую ссылку на имя корня концентратор, который является частью хоста Контроллер

Но я дважды проверил использование IOCTL_USB_GET_ROOT_HUB_NAME в MSDN http://msdn.microsoft.com/en-us/library/ff537326(v=VS.85).aspx который говорит:

IOCTL_USB_GET_ROOT_HUB_NAME является запрос управления вводом / выводом в пользовательском режиме. это запрос нацелен на USB-концентратор FDO .

Обратите внимание, что целью IOCTL_USB_GET_ROOT_HUB_NAME IRP является FDO концентратора USB. Однако, как описано в примере USBVIEW, мы только что получили символическую ссылку хост-контроллера, которая означает, что объект устройства является объектом устройства хост-контроллера. Как мы можем отправить ему IRP IOCTL_USB_GET_ROOT_HUB_NAME? Должны ли мы сначала получить USB-концентратор FDO?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Я думаю, это печальная ошибка копирования и вставки.IOCTL_USB_GET_ROOT_HUB_NAME действительно отправляется на хост-контроллер и, следовательно, обрабатывается хост-контроллером USB FDO.

Кстати, просто для того, чтобы познакомить вас с контекстом: термин «FDO» относится только к пользовательскому режиму -не так, как вы можете получить доступ к любому другому "xDO" в любом случае.Если вы должны были отправить этот IOCTL в режиме ядра, то, конечно же, вы можете отправить IOCTL любому конкретному объекту устройства в стеке устройств (обратите внимание, «может» не означает «следует»).Однако DeviceIoControl из приложения пользовательского режима всегда отправляет IOCTL в верхнюю часть стека устройств (поэтому он передает все фильтры, FDO и вниз в PDO).

Этот вопрос был задан в марте28, так что я очень надеюсь, что вы уже решили это:)

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

Как указано в документации, вам понадобится дескриптор хост-контроллера USB, но не очень понятно, как вы должны получить такой дескриптор.В USBView что-то похожее на эту функцию используется для получения имени пути устройства, передавая GUID_DEVINTERFACE_USB_HOST_CONTROLLER (включая initguid.h и usbiodef.h):

vector<wstring> EnumDevices(
    _In_    const GUID Guid
)
{
    vector<wstring> r;

    int index = 0;
    HDEVINFO hDevInfo = SetupDiGetClassDevs(&Guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

    SP_DEVINFO_DATA DevInfoData;
    memset(&DevInfoData, 0, sizeof(SP_DEVINFO_DATA));
    DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

    while (SetupDiEnumDeviceInfo(hDevInfo, index, &DevInfoData)) {
        index++;

        int jndex = 0;
        SP_DEVICE_INTERFACE_DATA DevIntData;
        memset(&DevIntData, 0, sizeof(SP_DEVICE_INTERFACE_DATA));
        DevIntData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

        while (SetupDiEnumDeviceInterfaces(
            hDevInfo,
            &DevInfoData, &Guid, jndex, &DevIntData
        )) {
            jndex++;

            // Get the size required for the structure.
            DWORD RequiredSize;
            SetupDiGetDeviceInterfaceDetail(
                hDevInfo, &DevIntData, NULL, NULL, &RequiredSize, NULL
            );

            PSP_DEVICE_INTERFACE_DETAIL_DATA pDevIntDetData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(
                sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + RequiredSize
            );
            memset(pDevIntDetData, 0, sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + RequiredSize);
            pDevIntDetData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

            SetupDiGetDeviceInterfaceDetail(
                hDevInfo,
                &DevIntData,
                pDevIntDetData, RequiredSize,
                NULL,
                &DevInfoData
            );

            r.push_back(wstring(pDevIntDetData->DevicePath));
            free(pDevIntDetData);
        }
    }

    return r;
}

Имейте в виду, что с помощью вышеуказанной функции вы также можетезапрашивать устройства типа GUID_DEVINTERFACE_USB_HUB и GUID_DEVINTERFACE_USB_DEVICE, которые могут устранить необходимость в непосредственном взаимодействии с хост-контроллером или концентраторами.

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