Помогите, может кто сталкивался с подобной проблемой: надо определить есть ли USB устройство в системе или нет. Какими стандартными функцами то мона сделать в Visual C++. И какие есть стандартные функции для работы с USB устройствами из прикладной программы???
Спасибо
Здравствуйте 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
}
Короче что-то типа того.
Здравствуйте 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 как-то определить есть ли устройство или нет:)
Все равно — спасибо за ответ:)
Здравствуйте Аноним, Вы писали:
[skip]
А>Спасибо
Но мне нужно без DDK как-то определить есть ли устройство или нет
А>Все равно — спасибо за ответ
Дык ето все делается в юзер моде, так что от DDK тебе нужны лишь описание структур и кодов. Это можно просто оттуда выдернуть и вставить в свой заголовочный файл.
Т.е. драйвер для этого писать не нужно
Здравствуйте cr_pooh, Вы писали:
CP>Помогите, может кто сталкивался с подобной проблемой: надо определить есть ли USB устройство в системе или нет. Какими стандартными функцами то мона сделать в Visual C++. И какие есть стандартные функции для работы с USB устройствами из прикладной программы???
Современный программист на Бейсике написал бы так:
Set oDevices = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("SELECT * FROM Win32_USBController'")
If oDevices.Count > 0 Then
For Each oDevice In oDevices
MsgBox "Device: " & oDevice.Caption
Next
Else
MsgBox "Devices Not Found"
End If
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.