Bluetooth ドライバー スタックの使用方法
WindowsがBluetoothドライバスタックをロードして初期化した後、ドライバスタックは既にペアリングされているアクティブなBluetoothデバイスを検出します。 次に、ドライバスタックは、ペアリングされたすべてのデバイスのデバイス識別子(デバイスID)を生成します。 次に、ドライバスタックは標準のプラグアンドプレイ(PnP)メカニズムを使用して、各デバイスに適したプロファイルドライバをロードします。 ロードされるプロファイルドライバは、Bluetoothドライバスタックによって生成され Bluetoothデバイスのインストールで説明されているように、プロファイルドライバをインストールするINFファイルとデバイス識別子に基づいて選択されます。
プロファイルドライバは、WDM アーキテクチャに基づくすべてのドライバで採用されている標準の I/O Request Packet(IRP)ベースのメカニズムを通じて Bluetooth ドライバスタックと通信します。 プロファイルドライバは、IRP を割り当てて Bluetooth ドライバスタックから Bluetooth ポートドライバ Bthport.sys に送信することで、デバイスと通信します。
プロファイル・ドライバは Bthport.sysによって処理されるIRPを割り当て、初期化します。 IRP_MJ_INTERNAL_DEVICE_CONTROL または IRP_MJ_DEVICE_CONTROL IRPによってデバイスに配信されるIOCTL要求を使用して、プロファイル・ドライバはデバイスと通信します。 プロファイル・ドライバは、IRP で以下のリストの I/O 制御コードのいずれかを指定します。
Bluetoothドライバスタックは IRP_MJ_DEVICE_CONTROLを通じて、カーネルモードコーラーの以下のIOCTLをサポートします:
IOCTL_BTH_SDP_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO
Bluetoothドライバスタックは IRP_MJ_INTERNAL_DEVICE_CONTROLを通じて、以下のIOCTLと BRB カーネルモードコール(一般にドライバ間通信用)をサポートしています:
BRB_L2CA_OPEN_CHANNEL_RESPONSE
BRB_GET_DEVICE_INTERFACE_STRING
IOCTL_INTERNAL_BTHENUM_GET_DEVINFO
IOCTL_INTERNAL_BTHENUM_GET_ENUMINFO
前のリストで説明した IOCTL の使用方法の詳細については Bluetooth IOCTLs を参照してください。
プロファイルドライバは、主に IOCTL_INTERNAL_BTH_SUBMIT_BRB を使用して、Bluetooth ドライバスタックで提供される機能と通信および対話します。 プロファイルドライバは IOCTL_INTERNAL_BTH_SUBMIT_BRB を使用して、Bluetooth Request Block (BRB) と呼ばれる可変長のデータ構造を管理するデバイスに送ります。 プロファイル・ドライバは、BRB を使用してリモート・デバイスとの接続を開閉し、ほとんどの入出力タスクを実行します。 IOCTL_INTERNAL_BTH_SUBMIT_BRB には、実行する Bluetooth 操作をさらに記述した BRB が含まれています。 BluetoothドライバスタックでBRBを構築して送信する方法の詳細については BRBの構築と送信を参照してください。
各BRBは BRB_HEADER 構造体で定義された標準ヘッダーで始まり、BRBのタイプを指定します。 Type メンバは BRB_TYPE 列挙にある値のいずれかと等しくなければならず、プロファイル・ドライバが要求するBluetooth操作のタイプを決定する。 BRBの構造とサイズはBRBのタイプによって異なる。 BRB_HEADER構造体の Length メンバは、BRBのサイズをバイト単位で指定する。 The BthAllocateBrb, BthInitializeBrb, and BthReuseBrb functions automatically set the Type and Length members.
例えば、リモートデバイスへの接続を開くには BRB_L2CA_OPEN_CHANNEL または BRB_SCO_OPEN_CHANNEL のいずれかのファンクションコードを指定し、プロファイルドライバがリモートデバイスへの L2CAP または SCO 接続チャネルを開こうとしていることを示します。 Bluetooth ドライバのスタックは、BRB 構造体の Status メンバを使用して Bluetooth 固有のステータスコードを返す。
各 BRB に対して、プロファイル・ドライバは、実行する Bluetooth 操作に関する情報を持つ適切な対応する構造体を割り当てて初期化する必要があります。
次の表では、プロファイル・ドライバが発行できる特定の BRB に対応する構造体について説明します:
Bluetooth リクエスト・ブロック(BRB) | 対応する構造体 |
---|---|
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 |
Bluetooth IOCTL および BRB の使用の詳細については、「」を参照してください BRB の構築および送信.