Здравствуйте 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
}
Короче что-то типа того.