Compartilhar via


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_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 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_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 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.