Использование стека драйверов Bluetooth
После загрузки и инициализации стека драйверов Bluetooth Windows обнаруживает активные устройства Bluetooth, которые уже были связаны. Затем стек драйверов создает идентификаторы устройств (идентификаторы устройств) для всех парных устройств. Затем стек драйверов использует стандартные механизмы Plug and Play (PnP) для загрузки соответствующего драйвера профиля для каждого устройства. Загружаемый драйвер профиля выбирается на основе INF-файла, устанавливающего драйвер профиля, и идентификатора устройства, созданного стеком драйверов Bluetooth и описанного в разделе Установка устройства Bluetooth.
Драйверы профилей взаимодействуют со стеком драйверов Bluetooth с помощью стандартного механизма на основе пакета запроса ввода-вывода (IRP), используемого всеми драйверами на основе архитектуры WDM. Драйвер профиля взаимодействует со своим устройством, выделяя и отправляя IRP в стеке драйверов Bluetooth в драйвер порта Bluetooth, Bthport.sys.
Драйвер профиля выделяет и инициализирует IRP для обработки Bthport.sys. Затем драйверы профиля взаимодействуют со своими устройствами с помощью запросов IOCTL, которые доставляются на устройство с помощью IRP_MJ_INTERNAL_DEVICE_CONTROL или IRP_MJ_DEVICE_CONTROL IRP. Драйвер профиля указывает один из кодов управления вводом-выводом в следующем списке в IRP.
Стек драйверов Bluetooth поддерживает следующие ioCTL для вызывающих объектов режима ядра через IRP_MJ_DEVICE_CONTROL:
IOCTL_BTH_SDP_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO
Стек драйверов Bluetooth поддерживает следующие объекты IOCTL и BRB в режиме ядра (как правило, для обмена данными между драйверами) через IRP_MJ_INTERNAL_DEVICE_CONTROL:
BRB_L2CA_OPEN_CHANNEL_RESPONSE
BRB_GET_DEVICE_INTERFACE_STRING
IOCTL_INTERNAL_BTHENUM_GET_DEVINFO
IOCTL_INTERNAL_BTHENUM_GET_ENUMINFO
Дополнительные сведения об использовании ioCTL, описанных в предыдущих списках, см. в разделе Bluetooth IOCTLs.
Драйверы профилей в основном используют IOCTL_INTERNAL_BTH_SUBMIT_BRB для взаимодействия с функциями, предоставляемыми в стеке драйверов Bluetooth. Драйвер профиля использует IOCTL_INTERNAL_BTH_SUBMIT_BRB для доставки структуры данных переменной длины, называемой блоком запросов Bluetooth (BRB), на управляемое устройство. Драйверы профилей используют brb для открытия и закрытия подключений к удаленным устройствам, а также для выполнения большинства задач ввода и вывода. IOCTL_INTERNAL_BTH_SUBMIT_BRB содержит BRB, в котором подробно описывается выполняемая операция Bluetooth. Дополнительные сведения о сборке и отправке BRB в стеке драйверов Bluetooth см. в статье Создание и отправка BRB.
Каждый BRB начинается со стандартного заголовка, определенного структурой BRB_HEADER , которая указывает тип BRB, который определяет структуру остальной части BRB. Элемент Type , который должен равняться одному из значений перечисления BRB_TYPE , определяет тип операции Bluetooth, запрашиваемой драйвером профиля. Структура и размер BRB зависят от типа BRB. Элемент Length структуры BRB_HEADER указывает размер BRB в байтах. Функции BthAllocateBrb, BthInitializeBrb и BthReuseBrb автоматически задают элементы Type и Length .
Например, чтобы открыть подключение к удаленному устройству, укажите один из кодов функций, BRB_L2CA_OPEN_CHANNEL или BRB_SCO_OPEN_CHANNEL, чтобы указать, что драйвер профиля пытается открыть канал подключения L2CAP или SCO к удаленному устройству. Стек драйверов Bluetooth использует элемент Status структуры BRB для возврата кода состояния, относящегося к Bluetooth.
Для каждого BRB драйвер профиля должен выделить и инициализировать соответствующую структуру со сведениями об выполняемой операции Bluetooth.
В следующей таблице описаны структуры, соответствующие конкретным ББР, которые могут выдаваться драйверами профилей.
Блок запросов Bluetooth (BRB) | Соответствующая структура |
---|---|
BRB_HCI_GET_LOCAL_BD_ADDR | _BRB_GET_LOCAL_BD_ADDR |
BRB_L2CA_REGISTER_SERVER | _BRB_L2CA_REGISTER_SERVER |
BRB_L2CA_UNREGISTER_SERVER | _BRB_L2CA_UNREGISTER_SERVER |
BRB_L2CA_OPEN_CHANNEL | _BRB_L2CA_OPEN_CHANNEL |
BRB_L2CA_OPEN_CHANNEL_RESPONSE | _BRB_L2CA_OPEN_CHANNEL |
BRB_L2CA_CLOSE_CHANNEL | _BRB_L2CA_CLOSE_CHANNEL |
BRB_L2CA_ACL_TRANSFER | _BRB_L2CA_ACL_TRANSFER |
BRB_L2CA_UPDATE_CHANNEL | _BRB_L2CA_UPDATE_CHANNEL |
BRB_L2CA_PING | _BRB_L2CA_PING |
BRB_REGISTER_PSM | _BRB_PSM |
BRB_UNREGISTER_PSM | _BRB_PSM |
BRB_SCO_REGISTER_SERVER | _BRB_SCO_REGISTER_SERVER |
BRB_SCO_UNREGISTER_SERVER | _BRB_SCO_UNREGISTER_SERVER |
BRB_SCO_OPEN_CHANNEL | _BRB_SCO_OPEN_CHANNEL |
BRB_SCO_OPEN_CHANNEL_RESPONSE | _BRB_SCO_OPEN_CHANNEL |
BRB_SCO_CLOSE_CHANNEL | _BRB_SCO_CLOSE_CHANNEL |
BRB_SCO_TRANSFER | _BRB_SCO_TRANSFER |
BRB_SCO_GET_CHANNEL_INFO | _BRB_SCO_GET_CHANNEL_INFO |
BRB_SCO_GET_SYSTEM_INFO | _BRB_SCO_GET_SYSTEM_INFO |
BRB_SCO_FLUSH_CHANNEL | _BRB_SCO_FLUSH_CHANNEL |
BRB_ACL_GET_MODE | _BRB_ACL_GET_MODE |
BRB_ACL_ENTER_ACTIVE_MODE | _BRB_ACL_ENTER_ACTIVE_MODE |
BRB_GET_DEVICE_INTERFACE_STRING | _BRB_GET_DEVICE_INTERFACE_STRING |
Дополнительные сведения об использовании IOCTL и BRB по Bluetooth см. в разделе Создание и отправка BRB.