查詢藍牙介面
藍牙驅動程式堆疊會公開下列介面,可分析驅動程式可用來與藍牙裝置互動。
介面 | 描述 |
---|---|
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 至藍牙驅動程式堆疊。
下列程式是取得其中一個介面的一般程式。
查詢介面
- 配置並初始化 IRP。
- 配置和初始化 介面的實例。
- 指定要查詢介面的主要和次要函式程序代碼。
- 指定要查詢的介面。
- 將 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 成功傳回,配置檔驅動程式就可以存取並使用介面中包含的函式指標。