Como usar a pilha de driver Bluetooth
Depois que o Windows carrega e inicializa a pilha de driver Bluetooth, a pilha de driver descobre dispositivos Bluetooth ativos que já foram emparelhados. Em seguida, a pilha de driver gera identificadores de dispositivo (IDs de dispositivo) para todos os dispositivos emparelhados. Em seguida, a pilha de driver usa mecanismos padrão de 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 driver Bluetooth e descrito em Instalando um dispositivo Bluetooth.
Os drivers de perfil se comunicam com a pilha de driver Bluetooth por meio do mecanismo padrão baseado em IRP (Pacote de Solicitação de E/S) empregado por todos os drivers com base na arquitetura do WDM. Um driver de perfil se comunica com seu dispositivo alocando e enviando IRPs para baixo na pilha de driver Bluetooth para o driver de porta Bluetooth ,Bthport.sys.
Um driver de perfil aloca e inicializa IRPs a serem processados pelo Bthport.sys. Em seguida, os drivers de perfil se comunicam com seus dispositivos usando solicitações IOCTL que são entregues ao dispositivo por meio de uma IRP_MJ_INTERNAL_DEVICE_CONTROL ou IRP_MJ_DEVICE_CONTROL IRP. O driver de perfil especifica um dos códigos de controle de E/S na lista a seguir no IRP.
A pilha de driver Bluetooth dá suporte às seguintes IOCTLs para chamadores no modo kernel por meio de IRP_MJ_DEVICE_CONTROL:
IOCTL_BTH_SDP_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO
A pilha de driver Bluetooth dá suporte aos seguintes chamadores do modo kernel IOCTLs e BRBs (geralmente para comunicação de driver para driver) por meio de 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
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 BRB (Bloco de Solicitação Bluetooth) 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 ainda mais a operação Bluetooth a ser executada. Para saber mais sobre como criar e enviar BRBs para baixo na pilha de driver Bluetooth, consulte Compilando 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 driver 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:
BRB (Bloco de Solicitação Bluetooth) | 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_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 |
Para obter mais informações sobre como usar IOCTLs e BRBs Bluetooth, consulte Compilando e enviando um BRB.