Re[2]: usb detect
От: Аноним  
Дата: 22.08.02 13:43
Оценка:
Здравствуйте Patalog, Вы писали:

P>Здравствуйте cr_pooh, Вы писали:


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

CP>>Спасибо

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


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


P>1. Перебираешь все контроллеры

P>HANDLE controller = CreateFile("\\\\.\\.HDC0"...)
P>HANDLE controller = CreateFile("\\\\.\\.HDC1"...) и т.д.

P>2. Получаешь имя хаба

P>
P>USB_ROOT_HUB_NAME root_name = { 0 };
P>DWORD bytes_returned = 0;
P>DeviceIoControl(controller, IOCTL_USB_GET_ROOT_HUB_NAME, 0, &root_name, sizeof(root_name), &bytes_returned, NULL);
P>const int actual_len = root_name.ActualLength;
P>unsigned char* key_raw = new unsigned char[actual_len];
P>USB_ROOT_HUB_NAME* root_name_W = reinterpret_cast<USB_ROOT_HUB_NAME*>(key_raw);
P>res = DeviceIoControl(controller, IOCTL_USB_GET_ROOT_HUB_NAME, NULL, 0, root_name_W, actual_len, &bytes_returned, NULL);
P>//root_name_W - в юникоде (под NT)
P>delete [] key_raw;
P>


P>3. Перечисляешь порты хаба

P>
P>USB_NODE_INFORMATION hub_info;

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

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


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

P>    delete [] connection_info_raw
P>}
P>


P>Короче что-то типа того.


Спасибо:) Но мне нужно без DDK как-то определить есть ли устройство или нет:)
Все равно — спасибо за ответ:)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.