Re: usb detect
От: Patalog Россия  
Дата: 22.08.02 13:28
Оценка: 14 (1)
Здравствуйте cr_pooh, Вы писали:

CP>Помогите, может кто сталкивался с подобной проблемой: надо определить есть ли USB устройство в системе или нет. Какими стандартными функцами то мона сделать в Visual C++. И какие есть стандартные функции для работы с USB устройствами из прикладной программы???

CP>Спасибо

Посмотри в DDK src\wdm\usb\usbview. Там есть пример.

Алгоритм такой:

1. Перебираешь все контроллеры
HANDLE controller = CreateFile("\\\\.\\.HDC0"...)
HANDLE controller = CreateFile("\\\\.\\.HDC1"...) и т.д.

2. Получаешь имя хаба
USB_ROOT_HUB_NAME root_name = { 0 };
DWORD bytes_returned = 0;
DeviceIoControl(controller, IOCTL_USB_GET_ROOT_HUB_NAME, 0, &root_name, sizeof(root_name), &bytes_returned, NULL);
const int actual_len = root_name.ActualLength;
unsigned char* key_raw = new unsigned char[actual_len];
USB_ROOT_HUB_NAME* root_name_W = reinterpret_cast<USB_ROOT_HUB_NAME*>(key_raw);
res = DeviceIoControl(controller, IOCTL_USB_GET_ROOT_HUB_NAME, NULL, 0, root_name_W, actual_len, &bytes_returned, NULL);
//root_name_W - в юникоде (под NT)
delete [] key_raw;


3. Перечисляешь порты хаба
USB_NODE_INFORMATION hub_info;

char device_name[MAX_PATH];
wsprintf(device_name, "\\\\.\\%s", hub_name); //hub_name - имя хаба из предыдущего шага
    
HANDLE hub_device = CreateFile(device_name, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hub_device != INVALID_HANDLE_VALUE) {
    DWORD bytes_returned = 0;
    BOOL res = DeviceIoControl(hub_device, IOCTL_USB_GET_NODE_INFORMATION, &hub_info,
                  sizeof(USB_NODE_INFORMATION), &hub_info,
                  sizeof(USB_NODE_INFORMATION), &bytes_returned,
                  NULL);

const ports_num = hub_info.u.HubInformation.HubDescriptor.bNumberOfPorts; //число портов хаба
for(int i = 1; i <= ports_num; ++i) {
        int bytes_needed = sizeof(USB_NODE_CONNECTION_INFORMATION) + sizeof(USB_PIPE_INFO) * 30;;
        unsigned char* connection_info_raw = new unsigned char[bytes_needed];
    USB_NODE_CONNECTION_INFORMATION* connection_info = reinterpret_cast<USB_NODE_CONNECTION_INFORMATION*>(connection_info_raw);
        
    connection_info->ConnectionIndex = i;
    DWORD bytes_returned = 0;
    BOOL res = DeviceIoControl(hub_device, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION, 
                    connection_info, bytes_needed,
                    connection_info, bytes_needed,
                    &bytes_returned, NULL);


    if(connection_info->ConnectionStatus != NoDeviceConnected) {
        const int pipe_num = connection_info->NumberOfOpenPipes; //число пайпов
        USB_PIPE_INFO* pipe_info = reinterpret_cast<USB_PIPE_INFO*>(connection_info + 1);
        for(int j = 0; j < pipe_num; ++j) {
            const USB_ENDPOINT_DESCRIPTOR& endpoint_desc = pipe_info[j].EndpointDescriptor;
            const int max_packet_size = endpoint_desc.wMaxPacketSize);        }
    }

    delete [] connection_info_raw
}


Короче что-то типа того.
Почетный кавалер ордена Совка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.