Bluetooth 드라이버 스택을 사용하는 방법

Windows가 Bluetooth 드라이버 스택을 로드하고 초기화한 후 드라이버 스택은 이미 페어링된 활성 Bluetooth 디바이스를 검색합니다. 그런 다음 드라이버 스택은 쌍을 이루는 모든 디바이스에 대한 디바이스 식별자(디바이스 ID)를 생성합니다. 다음으로 드라이버 스택은 표준 플러그 앤 플레이(PnP) 메커니즘을 사용하여 각 디바이스에 적절한 프로필 드라이버를 로드합니다. 로드할 프로필 드라이버는 Bluetooth 드라이버 스택에서 생성되고 Bluetooth 디바이스 설치에 설명된 대로 프로필 드라이버 및 디바이스 식별자를 설치하는 INF 파일에 따라 선택됩니다.

프로필 드라이버는 WDM 아키텍처를 기반으로 하는 모든 드라이버에서 사용하는 표준 IRP(I/O 요청 패킷) 기반 메커니즘을 통해 Bluetooth 드라이버 스택과 통신합니다. 프로필 드라이버는 IDP를 할당하고 Bluetooth 드라이버 스택 아래로 Bluetooth 포트 드라이버로 전송하여 디바이스와 통신하고 Bthport.sys.

프로필 드라이버는 Bthport.sys처리할 IRP를 할당하고 초기화합니다. 그런 다음 프로필 드라이버는 IRP_MJ_INTERNAL_DEVICE_CONTROL 또는IRP_MJ_DEVICE_CONTROL IRP를 통해 디바이스에 전달되는 IOCTL 요청을 사용하여 디바이스와 통신합니다. 프로필 드라이버는 IRP의 다음 목록에 있는 I/O 컨트롤 코드 중 하나를 지정합니다.

Bluetooth 드라이버 스택은 IRP_MJ_DEVICE_CONTROL 통해 커널 모드 호출자에 대해 다음 IOCTL을 지원합니다.

IOCTL_BTH_DISCONNECT_DEVICE

IOCTL_BTH_GET_DEVICE_INFO

IOCTL_BTH_GET_LOCAL_INFO

IOCTL_BTH_GET_RADIO_INFO

IOCTL_BTH_SDP_ATTRIBUTE_SEARCH

IOCTL_BTH_SDP_CONNECT

IOCTL_BTH_SDP_DISCONNECT

IOCTL_BTH_SDP_REMOVE_RECORD

IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH

IOCTL_BTH_SDP_SERVICE_SEARCH

IOCTL_BTH_SDP_SUBMIT_RECORD

IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO

Bluetooth 드라이버 스택은 IRP_MJ_INTERNAL_DEVICE_CONTROL 통해 다음 IOCTL 및 BRB 커널 모드 호출자(일반적으로 드라이버 간 통신용)를 지원합니다.

BRB_HCI_GET_LOCAL_BD_ADDR

BRB_L2CA_REGISTER_SERVER

BRB_L2CA_UNREGISTER_SERVER

BRB_L2CA_OPEN_CHANNEL

BRB_L2CA_OPEN_CHANNEL_RESPONSE

BRB_L2CA_CLOSE_CHANNEL

BRB_L2CA_ACL_TRANSFER

BRB_L2CA_UPDATE_CHANNEL

BRB_L2CA_PING

BRB_REGISTER_PSM

BRB_UNREGISTER_PSM

BRB_SCO_REGISTER_SERVER

BRB_SCO_UNREGISTER_SERVER

BRB_SCO_OPEN_CHANNEL

BRB_SCO_OPEN_CHANNEL_RESPONSE

BRB_SCO_CLOSE_CHANNEL

BRB_SCO_TRANSFER

BRB_SCO_GET_CHANNEL_INFO

BRB_SCO_GET_SYSTEM_INFO

BRB_SCO_FLUSH_CHANNEL

BRB_ACL_GET_MODE

BRB_ACL_ENTER_ACTIVE_MODE

BRB_GET_DEVICE_INTERFACE_STRING

IOCTL_INTERNAL_BTH_SUBMIT_BRB

IOCTL_INTERNAL_BTHENUM_GET_DEVINFO

IOCTL_INTERNAL_BTHENUM_GET_ENUMINFO

이전 목록에 설명된 IOCTL을 사용하는 방법에 대한 자세한 내용은 Bluetooth IOCTL을 참조하세요.

프로필 드라이버는 주로 IOCTL_INTERNAL_BTH_SUBMIT_BRB 사용하여 Bluetooth 드라이버 스택에 제공된 기능을 통신하고 상호 작용합니다. 프로필 드라이버는 IOCTL_INTERNAL_BTH_SUBMIT_BRB 사용하여 관리하는 디바이스에 BRB(Bluetooth 요청 블록)라는 가변 길이 데이터 구조를 제공합니다. 프로필 드라이버는 BRB를 사용하여 원격 디바이스에 대한 연결을 열고 닫고 대부분의 입력 및 출력 작업을 수행합니다. IOCTL_INTERNAL_BTH_SUBMIT_BRB 수행할 Bluetooth 작업을 자세히 설명하는 BRB가 포함되어 있습니다. BLUEtooth 드라이버 스택에서 BRB를 빌드하고 보내는 방법에 대한 자세한 내용은 BRB 빌드 및 보내기를 참조하세요.

각 BRB는 BRB의 나머지 부분의 구조를 결정하는 BRB의 형식을 지정하는 BRB_HEADER 구조체로 정의된 표준 헤더로 시작합니다. 형식 멤버는 BRB_TYPE 열거형에 있는 값 중 하나와 같아야 하며 프로필 드라이버가 요청하는 Bluetooth 작업의 유형을 결정합니다. BRB 구조체와 크기는 BRB 유형에 따라 달라집니다. BRB_HEADER 구조체의 Length 멤버는 BRB의 크기(바이트)를 지정합니다. BthAllocateBrb, BthInitializeBrbBthReuseBrb 함수는 TypeLength 멤버를 자동으로 설정합니다.

예를 들어 원격 디바이스에 대한 연결을 열려면 프로필 드라이버가 L2CAP 또는 원격 디바이스에 대한 SCO 연결 채널을 열려고 함을 나타내기 위해 함수 코드 BRB_L2CA_OPEN_CHANNEL 또는 BRB_SCO_OPEN_CHANNEL 중 하나를 지정합니다. Bluetooth 드라이버 스택은 BRB 구조의 상태 멤버를 사용하여 Bluetooth 관련 상태 코드를 반환합니다.

각 BRB에 대해 프로필 드라이버는 수행할 Bluetooth 작업에 대한 정보를 사용하여 적절한 해당 구조를 할당하고 초기화해야 합니다.

다음 표에서는 프로필 드라이버가 발급할 수 있는 특정 BRB에 해당하는 구조체에 대해 설명합니다.

BLUEtooth 요청 블록(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

Bluetooth IOCTL 및 BRB 사용에 대한 자세한 내용은 BRB 빌드 및 보내기를 참조하세요.