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_SDP_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH
IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO
Bluetooth 드라이버 스택은 IRP_MJ_INTERNAL_DEVICE_CONTROL 통해 다음 IOCTL 및 BRB 커널 모드 호출자(일반적으로 드라이버 간 통신용)를 지원합니다.
BRB_L2CA_OPEN_CHANNEL_RESPONSE
BRB_GET_DEVICE_INTERFACE_STRING
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, BthInitializeBrb 및 BthReuseBrb 함수는 Type 및 Length 멤버를 자동으로 설정합니다.
예를 들어 원격 디바이스에 대한 연결을 열려면 프로필 드라이버가 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 빌드 및 보내기를 참조하세요.