Como usar o Bluetooth Driver Stack

Após o Windows carregar e inicializar a pilha de drivers Bluetooth, a pilha de drivers deteta dispositivos Bluetooth ativos que já foram emparelhados. Em seguida, o stack de drivers gera identificadores de dispositivo (IDs de dispositivo) para todos os dispositivos emparelhados. Em seguida, a pilha de drivers usa mecanismos padrão Plug and Play (PnP) para carregar o driver de perfil apropriado para cada dispositivo. O driver de perfil a ser carregado é selecionado com base no arquivo INF que instala o driver de perfil e o identificador do dispositivo, conforme gerado pela pilha de drivers Bluetooth e descrito em Instalando um dispositivo Bluetooth.

Os controladores de perfil comunicam-se com a pilha de controladores Bluetooth através do mecanismo padrão baseado em 'pacote de pedido de I/O' (IRP) empregado por todos os controladores com base na arquitetura WDM. Um driver de perfil comunica-se com um dispositivo alocando e enviando IRPs pela pilha de drivers até ao driver da porta Bluetooth, Bthport.sys.

Um controlador de perfil aloca e inicializa os IRPs para serem processados por Bthport.sys. Em seguida, os drivers de perfil comunicam-se com os seus dispositivos usando solicitações IOCTL que são enviadas para o dispositivo através de um IRP_MJ_INTERNAL_DEVICE_CONTROL ou IRP_MJ_DEVICE_CONTROL IRP. O driver de perfil especifica um dos códigos de controlo de entrada/saída (E/S) presentes na lista seguinte no IRP.

A pilha de drivers Bluetooth suporta os seguintes IOCTLs para chamadores no modo núcleo através de IRP_MJ_DEVICE_CONTROL:

IOCTL_BTH_DISCONNECT_DEVICE

IOCTL_BTH_GET_DEVICE_INFO

IOCTL_BTH_GET_LOCAL_INFO

IOCTL_BTH_GET_RADIO_INFO

IOCTL_BTH_SDP_ATTRIBUTE_SEARCH

IOCTL_BTH_SDP_CONNECT

IOCTL_BTH_SDP_DISCONNECT

IOCTL_BTH_SDP_REMOVE_RECORD

IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH

IOCTL_BTH_SDP_SERVICE_SEARCH

IOCTL_BTH_SDP_SUBMIT_RECORD

IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO

A pilha de drivers Bluetooth suporta os seguintes chamadores de modo kernel IOCTLs e BRBs (geralmente para comunicação driver-to-driver) através IRP_MJ_INTERNAL_DEVICE_CONTROL:

BRB_HCI_GET_LOCAL_BD_ADDR

BRB_L2CA_REGISTER_SERVER

BRB_L2CA_UNREGISTER_SERVER

BRB_L2CA_OPEN_CHANNEL

BRB_L2CA_OPEN_CHANNEL_RESPONSE

BRB_L2CA_CLOSE_CHANNEL

BRB_L2CA_ACL_TRANSFER

BRB_L2CA_UPDATE_CHANNEL

BRB_L2CA_PING

BRB_REGISTER_PSM

BRB_UNREGISTER_PSM

BRB_SCO_REGISTER_SERVER

BRB_SCO_UNREGISTER_SERVER

BRB_SCO_OPEN_CHANNEL

BRB_SCO_OPEN_CHANNEL_RESPONSE

BRB_SCO_CLOSE_CHANNEL

BRB_SCO_TRANSFER

BRB_SCO_GET_CHANNEL_INFO

BRB_SCO_GET_SYSTEM_INFO

BRB_SCO_FLUSH_CHANNEL

BRB_ACL_GET_MODE

BRB_ACL_ENTER_ACTIVE_MODE

BRB_GET_DEVICE_INTERFACE_STRING

IOCTL_INTERNAL_BTH_SUBMIT_BRB

IOCTL_INTERNAL_BTHENUM_GET_DEVINFO

IOCTL_INTERNAL_BTHENUM_GET_ENUMINFO

Para obter mais informações sobre como usar as IOCTLs descritas nas listas anteriores, consulte IOCTLs Bluetooth.

Os drivers de perfil usam principalmente IOCTL_INTERNAL_BTH_SUBMIT_BRB para se comunicar e interagir com a funcionalidade fornecida na pilha de drivers Bluetooth. Um driver de perfil usa IOCTL_INTERNAL_BTH_SUBMIT_BRB para fornecer uma estrutura de dados de comprimento variável chamada Bluetooth Request Block (BRB) para o dispositivo que gerencia. Os drivers de perfil usam BRBs para abrir e fechar conexões com dispositivos remotos e para executar a maioria das tarefas de entrada e saída. IOCTL_INTERNAL_BTH_SUBMIT_BRB contém um BRB que descreve melhor a operação Bluetooth a ser executada. Para saber mais sobre como criar e enviar BRBs para baixo da pilha de drivers Bluetooth, consulte Construindo e enviando um BRB.

Cada BRB começa com um cabeçalho padrão definido pela estrutura BRB_HEADER que especifica o tipo de BRB, que determina a estrutura do restante do BRB. O membro Type , que deve ser igual a um dos valores encontrados na enumeração BRB_TYPE , determina o tipo de operação Bluetooth que o driver de perfil solicita. A estrutura e o tamanho do BRB variam de acordo com o tipo de BRB. O membro Length da estrutura BRB_HEADER especifica o tamanho, em bytes, do BRB. As funções BthAllocateBrb, BthInitializeBrb e BthReuseBrb definem automaticamente os membros Type e Length .

Por exemplo, para abrir uma conexão com um dispositivo remoto, especifique um dos códigos de função, BRB_L2CA_OPEN_CHANNEL ou BRB_SCO_OPEN_CHANNEL, para indicar que o driver de perfil está tentando abrir um canal de conexão L2CAP ou SCO para o dispositivo remoto. A pilha de drivers Bluetooth usa o membro Status da estrutura BRB para retornar um código de status específico do Bluetooth.

Para cada BRB, o driver de perfil deve alocar e inicializar a estrutura correspondente apropriada com informações sobre a operação Bluetooth a ser executada.

A tabela a seguir descreve as estruturas que correspondem a BRBs específicos que os drivers de perfil podem emitir:

Bloco de solicitação Bluetooth (BRB) Estrutura correspondente
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_REGISTO_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

Para obter mais informações sobre como usar IOCTLs e BRBs Bluetooth, consulte Criando e enviando um BRB.