次の方法で共有


Bluetooth インターフェイスの照会

Bluetooth ドライバー スタックは、プロファイル ドライバーが Bluetooth デバイスとの対話に使用できる次のインターフェイスを公開します。

Interface 説明
GUID_BTHDDI_SDP_NODE_INTERFACE プロファイル ドライバーは、GUID_BTHDDI_SDP_NODE_INTERFACE をクエリして、サービス検出プロトコル (SDP) レコードの作成を可能にする関数へのポインターを取得します。

このインターフェイスは BTHDDI_SDP_NODE_INTERFACE 構造。
GUID_BTHDDI_SDP_PAR Standard Edition_INTERFACE プロファイル ドライバーは、GUID_BTHDDI_SDP_PARSE_INTERFACE をクエリして、SDP レコードを解析できる関数へのポインターを取得します。

このインターフェイスは BTHDDI_SDP_PARSE_INTERFACE 構造。
GUID_BTHDDI_PROFILE_DRIVER_INTERFACE プロファイル ドライバーは、BTHDDI_PROFILE_DRIVER_INTERFACE をクエリして、BRB の作成、割り当て、再利用、解放を可能にする関数へのポインターを取得します。

このインターフェイスは BTH_PROFILE_DRIVER_INTERFACE 構造。

これらのインターフェイスのいずれかを取得するには、プロファイル ドライバーが最初にビルドして送信する必要があります IRP_MN_QUERY_INTERFACE BluetoothドライバースタックへのIRP。

次の手順は、これらのインターフェイスのいずれかを取得する一般的なプロセスです。

インターフェイスのクエリを実行するには

  1. IRP を割り当てて初期化します。
  2. インターフェイスのインスタンスを割り当てて初期化します。
  3. インターフェイスに対してクエリを実行するメジャー関数コードとマイナー関数コードを指定します。
  4. クエリの対象となるインターフェイスを指定します。
  5. 処理するドライバー スタックに IRP を渡します。

次の擬似コードの例は、GUID_BTHDDI_PROFILE_DRIVER_INTERFACEの Bluetooth ドライバー スタックを照会するIRP_MN_QUERY_INTERFACE IRP を設定する方法を示しています。 読みやすくするために、この例ではエラー処理を示していません。

#include <bthddi.h>

...

// Define a custom pool tag to identify your profile driver's dynamic memory allocations. You should change this tag to easily identify your driver's allocations from other drivers.
#define PROFILE_DRIVER_POOL_TAG '_htB'

PIRP Irp;
Irp = IoAllocateIrp( DeviceExtension->ParentDeviceObject->StackSize, FALSE );

PBTH_PROFILE_DRIVER_INTERFACE BthInterface; // Define storage for an instance of the BTH_PROFILE_DRIVER_INTERFACE structure
BthInterface = ExAllocatePoolWithTag( NonPagedPool, sizeof( BTH_PROFILE_DRIVER_INTERFACE ), PROFILE_DRIVER_POOL_TAG );

// Zero the memory associated with the structure
RtlZeroMemory( BthInterface, sizeof( BTH_PROFILE_DRIVER_INTERFACE ) );

// Set up the next IRP stack location
PIO_STACK_LOCATION NextIrpStack;
NextIrpStack = IoGetNextIrpStackLocation( Irp );
NextIrpStack->MajorFunction = IRP_MJ_PNP;
NextIrpStack->MinorFunction = IRP_MN_QUERY_INTERFACE;
NextIrpStack->Parameters.QueryInterface.InterfaceType = (LPGUID) &GUID_BTHDDI_PROFILE_DRIVER_INTERFACE;
NextIrpStack->Parameters.QueryInterface.Size = sizeof( BTH_PROFILE_DRIVER_INTERFACE );
NextIrpStack->Parameters.QueryInterface.Version = BTHDDI_PROFILE_DRIVER_INTERFACE_VERSION_FOR_QI;
NextIrpStack->Parameters.QueryInterface.Interface = (PINTERFACE) BthInterface;
NextIrpStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;

// Pass the IRP down the driver stack
NTSTATUS Status;
Status = IoCallDriver( DeviceExtension->NextLowerDriver, Irp );

IRP が正常に返された場合、プロファイル ドライバーはアクセスし、インターフェイスに含まれている関数ポインターを使用できます。