Come usare lo stack di driver Bluetooth
Dopo il caricamento e l'inizializzazione dello stack di driver Bluetooth, lo stack di driver individua i dispositivi Bluetooth attivi che sono già stati associati. Lo stack di driver genera quindi identificatori di dispositivo (ID dispositivo) per tutti i dispositivi associati. Successivamente, lo stack di driver usa meccanismi di Plug and Play standard (PnP) per caricare il driver di profilo appropriato per ogni dispositivo. Il driver del profilo da caricare viene selezionato in base al file INF che installa il driver del profilo e l'identificatore del dispositivo, come generato dallo stack di driver Bluetooth e descritto in Installazione di un dispositivo Bluetooth.
I driver di profilo comunicano con lo stack di driver Bluetooth tramite il meccanismo standard I/O Request Packet (IRP) usato da tutti i driver basati sull'architettura WDM. Un driver di profilo comunica con il dispositivo allocando e inviando i provider di integrazione nello stack di driver Bluetooth al driver di porta Bluetooth, Bthport.sys.
Un driver di profilo alloca e inizializza i runtime di integrazione da elaborareBthport.sys. I driver di profilo comunicano quindi con i propri dispositivi usando richieste IOCTL recapitate al dispositivo tramite un IRP_MJ_INTERNAL_DEVICE_CONTROL o IRP_MJ_DEVICE_CONTROL IRP. Il driver del profilo specifica uno dei codici di controllo di I/O nell'elenco seguente in IRP.
Lo stack di driver Bluetooth supporta i seguenti IOCTLs per i chiamanti in modalità kernel tramite IRP_MJ_DEVICE_CONTROL:
IOCTL_BTH_SDP_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO
Lo stack di driver Bluetooth supporta i seguenti caller IOCTLs e BRBs in modalità kernel (in genere per la comunicazione da driver a driver) tramite 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
Per altre informazioni su come usare gli IOCTL descritti negli elenchi precedenti, vedere IOCTLs Bluetooth.
I driver di profilo usano principalmente IOCTL_INTERNAL_BTH_SUBMIT_BRB per comunicare e interagire con le funzionalità fornite nello stack di driver Bluetooth. Un driver di profilo usa IOCTL_INTERNAL_BTH_SUBMIT_BRB per distribuire una struttura di dati a lunghezza variabile denominata BRB (Bluetooth Request Block) al dispositivo gestito. I driver di profilo usano i database brb per aprire e chiudere le connessioni ai dispositivi remoti e per eseguire la maggior parte delle attività di input e output. IOCTL_INTERNAL_BTH_SUBMIT_BRB contiene un BRB che descrive ulteriormente l'operazione Bluetooth da eseguire. Per altre informazioni su come compilare e inviare BRB nello stack di driver Bluetooth, vedere Compilazione e invio di un BRB.
Ogni BRB inizia con un'intestazione standard definita dalla struttura BRB_HEADER che specifica il tipo di BRB, che determina la struttura del resto di BRB. Il membro Type , che deve essere uguale a uno dei valori trovati nell'enumerazione BRB_TYPE , determina il tipo di operazione Bluetooth richiesta dal driver del profilo. La struttura e le dimensioni di BRB variano in base al tipo di BRB. Il membro Length della struttura BRB_HEADER specifica le dimensioni, in byte, della struttura BRB. Le funzioni BthAllocateBrb, BthInitializeBrb e BthReuseBrb impostano automaticamente i membri Type e Length .
Ad esempio, per aprire una connessione a un dispositivo remoto, specificare uno dei codici di funzione , BRB_L2CA_OPEN_CHANNEL o BRB_SCO_OPEN_CHANNEL, per indicare che il driver del profilo sta tentando di aprire un canale di connessione L2CAP o SCO al dispositivo remoto. Lo stack di driver Bluetooth usa il membro Status della struttura BRB per restituire un codice di stato specifico del Bluetooth.
Per ogni BRB, il driver del profilo deve allocare e inizializzare la struttura corrispondente appropriata con informazioni sull'operazione Bluetooth da eseguire.
La tabella seguente descrive le strutture che corrispondono a brb specifici che i driver di profilo possono emettere:
Blocco richieste Bluetooth (BRB) | Struttura corrispondente |
---|---|
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 |
Per altre informazioni sull'uso di IOCTLs e BRB Bluetooth, vedere Compilazione e invio di un BRB.