Verwenden des Bluetooth-Treiberstapels
Nachdem Windows den Bluetooth-Treiberstapel geladen und initialisiert hat, ermittelt der Treiberstapel aktive Bluetooth-Geräte, die bereits gekoppelt wurden. Der Treiberstapel generiert dann Gerätebezeichner (Geräte-IDs) für alle gekoppelten Geräte. Als Nächstes verwendet der Treiberstapel PnP-Mechanismen (Standard Plug & Play), um den entsprechenden Profiltreiber für jedes Gerät zu laden. Der zu ladende Profiltreiber wird basierend auf der INF-Datei ausgewählt, die den Profiltreiber und die Geräte-ID installiert, wie vom Bluetooth-Treiberstapel generiert und unter Installieren eines Bluetooth-Geräts beschrieben.
Profiltreiber kommunizieren mit dem Bluetooth-Treiberstapel über den standardmäßigen I/O Request Packet (IRP)-basierten Mechanismus, der von allen Treibern basierend auf der WDM-Architektur verwendet wird. Ein Profiltreiber kommuniziert mit seinem Gerät, indem IRPs über den Bluetooth-Treiberstapel an den Bluetooth-Porttreiber Bthport.syszugewiesen und gesendet werden.
Ein Profiltreiber ordnet irPs zu und initialisiert sie, die von Bthport.sysverarbeitet werden sollen. Profiltreiber kommunizieren dann mit ihren Geräten mithilfe von IOCTL-Anforderungen, die über eine IRP_MJ_INTERNAL_DEVICE_CONTROL oder IRP_MJ_DEVICE_CONTROL IRP an das Gerät übermittelt werden. Der Profiltreiber gibt einen der E/A-Kontrollcodes in der folgenden Liste im IRP an.
Der Bluetooth-Treiberstapel unterstützt die folgenden IOCTLs für Aufrufer im Kernelmodus über IRP_MJ_DEVICE_CONTROL:
IOCTL_BTH_SDP_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO
Der Bluetooth-Treiberstapel unterstützt die folgenden IOCTLs- und BRBs-Kernelmodusaufrufer (in der Regel für die Kommunikation zwischen Treibern) über 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
Weitere Informationen zur Verwendung der in den vorherigen Listen beschriebenen IOCTLs finden Sie unter Bluetooth-IOCTLs.
Profiltreiber verwenden in erster Linie IOCTL_INTERNAL_BTH_SUBMIT_BRB, um mit den im Bluetooth-Treiberstapel bereitgestellten Funktionen zu kommunizieren und mit ihnen zu interagieren. Ein Profiltreiber verwendet IOCTL_INTERNAL_BTH_SUBMIT_BRB, um eine Datenstruktur mit variabler Länge, die als Bluetooth-Anforderungsblock (BRB) bezeichnet wird, an das von ihm verwaltete Gerät bereitzustellen. Profiltreiber verwenden BRBs, um Verbindungen mit Remotegeräten zu öffnen und zu schließen und die meisten Eingabe- und Ausgabeaufgaben auszuführen. IOCTL_INTERNAL_BTH_SUBMIT_BRB enthält einen BRB, der den auszuführenden Bluetooth-Vorgang genauer beschreibt. Weitere Informationen zum Erstellen und Senden von BRBs im Bluetooth-Treiberstapel finden Sie unter Erstellen und Senden eines BRB.
Jeder BRB beginnt mit einem Standardheader, der durch die BRB_HEADER-Struktur definiert wird, die den BRB-Typ angibt, der die Struktur des restlichen BRB bestimmt. Der Typmember , der einem der Werte in der BRB_TYPE-Enumeration entsprechen muss, bestimmt den Typ des Bluetooth-Vorgangs, den der Profiltreiber anfordert. Die BRB-Struktur und -Größe variieren je nach BRB-Typ. Der Length-Member der BRB_HEADER-Struktur gibt die Größe des BRB in Bytes an. Die Funktionen BthAllocateBrb, BthInitializeBrb und BthReuseBrb legen die Elemente Type und Length automatisch fest.
Wenn Sie beispielsweise eine Verbindung mit einem Remotegerät herstellen möchten, geben Sie entweder einen der Funktionscodes , BRB_L2CA_OPEN_CHANNEL oder BRB_SCO_OPEN_CHANNEL an, um anzugeben, dass der Profiltreiber versucht, einen L2CAP- oder SCO-Verbindungskanal mit dem Remotegerät zu öffnen. Der Bluetooth-Treiberstapel verwendet den Status-Member der BRB-Struktur, um einen Bluetooth-spezifischen status Code zurückzugeben.
Für jeden BRB muss der Profiltreiber die entsprechende Struktur mit Informationen zum auszuführenden Bluetooth-Vorgang zuordnen und initialisieren.
In der folgenden Tabelle werden die Strukturen beschrieben, die bestimmten BRBs entsprechen, die profiltreiber ausgeben können:
Bluetooth-Anforderungsblock (BRB) | Entsprechende Struktur |
---|---|
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 |
Weitere Informationen zur Verwendung von Bluetooth-IOCTLs und BRBs finden Sie unter Erstellen und Senden eines BRB.