Здравствуйте 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 как-то определить есть ли устройство или нет:)
Все равно — спасибо за ответ:)