藍牙驅動程式堆疊會公開下列介面,設定檔驅動程式可用來與藍牙裝置互動。
| 介面 | 說明 |
|---|---|
| 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 以獲取允許他們建立、分配、重複使用和釋放 BRBs 的函式指標。 此介面對應於 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 傳回成功,配置檔驅動程式就可以存取並使用介面中包含的函式指標。