共用方式為


查詢藍牙介面

藍牙驅動程式堆疊會公開下列介面,可分析驅動程式可用來與藍牙裝置互動。

介面 描述
GUID_BTHDDI_SDP_NODE_INTERFACE 配置文件驅動程式會查詢GUID_BTHDDI_SDP_NODE_INTERFACE,以取得函式的指標,以允許它們建立服務探索通訊協定 (SDP) 記錄。

這個介面會對應至 BTHDDI_SDP_NODE_INTERFACE 結構。
GUID_BTHDDI_SDP_PARSE_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 IRP 至藍牙驅動程式堆疊。

下列程式是取得其中一個介面的一般程式。

查詢介面

  1. 配置並初始化 IRP。
  2. 配置和初始化 介面的實例。
  3. 指定要查詢介面的主要和次要函式程序代碼。
  4. 指定要查詢的介面。
  5. 將 IRP 向下傳遞至要處理的驅動程式堆疊。

下列虛擬程式代碼範例示範如何設定IRP_MN_QUERY_INTERFACE IRP,以查詢GUID_BTHDDI_PROFILE_DRIVER_INTERFACE的藍牙驅動程式堆棧。 為了方便閱讀,此範例不會示範錯誤處理。

#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 成功傳回,配置檔驅動程式就可以存取並使用介面中包含的函式指標。