如何使用藍牙驅動程式堆疊
在 Windows 載入並初始化藍牙驅動程式堆疊之後,驅動程式堆疊會探索已配對的作用中藍牙裝置。 驅動程式堆疊接著會為所有配對的裝置產生裝置標識碼, (裝置標識碼) 。 接下來,驅動程式堆疊會使用標準 隨插即用 (PnP) 機制,為每個裝置載入適當的配置檔驅動程式。 根據安裝配置檔驅動程式和裝置標識碼的 INF 檔案,選取要載入的設定檔驅動程式,如藍牙驅動程式堆疊所產生,並如 安裝藍牙裝置中所述。
配置文件驅動程式會透過以WDM架構為基礎的所有驅動程式所採用的標準I/O 要求封包 (IRP) 式機制,與藍牙驅動程式堆棧通訊。 設定檔案驅動程式會藉由將 IRP 設定並傳送至藍牙埠驅動程式堆疊,以與其裝置通訊, Bthport.sys。
配置檔驅動程式會配置和初始化 要由Bthport.sys處理的 IRP。 接著,配置檔驅動程式會使用透過 IRP_MJ_INTERNAL_DEVICE_CONTROL 或 IRP_MJ_DEVICE_CONTROL IRP 傳遞至裝置的 IOCTL 要求來與其裝置通訊。 配置檔案驅動程式會在 IRP 的下列清單中指定其中一個 I/O 控制程式代碼。
藍牙驅動程式堆疊透過 IRP_MJ_DEVICE_CONTROL 支援下列核心模式呼叫端的 IOCTL:
IOCTL_BTH_SDP_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO
藍牙驅動程式堆疊支援下列IOCTLs和 BRB 核心模式呼叫者,通常 (透過IRP_MJ_INTERNAL_DEVICE_CONTROL進行驅動程式對驅動程式通訊 ) :
BRB_L2CA_OPEN_CHANNEL_RESPONSE
BRB_GET_DEVICE_INTERFACE_STRING
IOCTL_INTERNAL_BTHENUM_GET_DEVINFO
IOCTL_INTERNAL_BTHENUM_GET_ENUMINFO
如需如何使用先前清單中所述之 IOCTL 的詳細資訊,請參閱 藍牙 IOCTLs。
配置文件驅動程式主要使用IOCTL_INTERNAL_BTH_SUBMIT_BRB來通訊,並與藍牙驅動程式堆疊中提供的功能互動。 配置文件驅動程式會使用 IOCTL_INTERNAL_BTH_SUBMIT_BRB,將稱為藍牙要求區塊的可變長度數據結構, (BRB) 傳遞給所管理的裝置。 配置文件驅動程式會使用 BRB 來開啟和關閉遠端裝置的連線,以及執行大部分的輸入和輸出工作。 IOCTL_INTERNAL_BTH_SUBMIT_BRB包含一個 BRB,進一步描述要執行的藍牙作業。 若要深入瞭解如何建置及傳送 BRB 到藍牙驅動程式堆疊,請參閱 建置和傳送 BRB。
每個 BRB 都是以 BRB_HEADER 結構定義的標準標頭開頭,該結構會指定 BRB 的類型,以決定 BRB 其餘部分的結構。 Type 成員必須等於BRB_TYPE列舉中找到的其中一個值,可決定配置檔驅動程式要求的藍牙作業類型。 BRB 結構和大小會根據 BRB 的類型而有所不同。 BRB_HEADER 結構的 Length 成員會指定 BRB 的大小,以位元組為單位。 BthAllocateBrb、BthInitializeBrb 和 BthReuseBrb 函式會自動設定 Type 和 Length 成員。
例如,若要開啟遠端裝置的連線,請指定其中一個函式程式碼 ,BRB_L2CA_OPEN_CHANNEL 或 BRB_SCO_OPEN_CHANNEL,表示配置檔驅動程式嘗試開啟遠端裝置的 L2CAP 或 SCO 連線通道。 藍牙驅動程式堆疊會使用 BRB 結構的 Status 成員來傳回藍牙特定狀態代碼。
針對每個 BRB,配置檔驅動程式必須配置並初始化適當的對應結構,以及要執行藍牙作業的相關信息。
下表描述對應至分析驅動程式可發出之特定 BRB 的結構:
藍牙要求區塊 (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 |
如需使用藍牙 IOCTLs 和 BRB 的詳細資訊,請參閱 建置和傳送 BRB。