IOCTL_BTH_HCI_VENDOR_COMMAND IOCTL(bthioctl.h)

IOCTL_BTH_HCI_VENDOR_COMMAND 요청을 통해 Bluetooth 애플리케이션은 공급업체별 명령을 라디오로 보낼 수 있습니다.

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

ASSOCIATedIrp.SystemBuffer 멤버는 BTH_VENDOR_SPECIFIC_COMMAND 구조를 가리킵니다. 구조체에는 제조업체 식별자, LMP(링크 관리 프로토콜) 버전, HCI 명령 헤더 및 이벤트와 명령에 일치하는 선택적 패턴 데이터가 포함된 연결된 공급업체 명령 데이터가 포함됩니다.

입력 버퍼 길이

BTH_VENDOR_SPECIFIC_COMMAND 구조체의 길이입니다.

출력 버퍼

ASSOCIATedIrp.SystemBuffer 멤버는 라디오에서 반환된 이벤트 데이터가 포함된 버퍼를 가리킵니다. 데이터는 BTH_VENDOR_EVENT_INFO 구조체의 EventInfo 멤버에서 사용할 수 있습니다.

typedef struct _BTH_VENDOR_EVENT_INFO {
  BTH_ADDR BthAddress;
  ULONG    EventSize;
  UCHAR    EventInfo[1];
} BTH_VENDOR_EVENT_INFO, *PBTH_VENDOR_EVENT_INFO;

EventSize 멤버는 라디오에서 반환된 공급업체별 이벤트 데이터의 크기를 제공합니다.

출력 버퍼 길이

BTH_VENDOR_EVENT_INFO 구조체의 길이입니다.

상태 블록

요청이 성공하면 STATUS_BLOCK 구조체의 정보 멤버가 명령 응답을 보유하는 버퍼의 크기(바이트)로 설정됩니다.

Status 멤버는 다음 표의 값 중 하나로 설정됩니다.

상태 값 Description
STATUS_SUCCESS IOCTL이 성공적으로 완료되었습니다.
STATUS_BUFFER_TOO_SMALL 전달된 입력 버퍼가 너무 작습니다.
STATUS_INVALID_PARAMETER 전달된 입력 버퍼가 잘못되었습니다.
STATUS_PRIVILEGE_NOT_HELD 호출자에게 필요한 권한이 없습니다.
STATUS_INSUFFICIENT_RESOURCES 요청을 처리하는 데 사용할 수 있는 메모리가 부족했습니다.

설명

IOCTL_BTH_HCI_VENDOR_COMMAND 요청은 공급업체가 Bluetooth 라디오와 관련된 명령을 만들 수 있는 메커니즘을 제공합니다.

에 있는 제조업체 ID 및 LMP(링크 관리 프로토콜) 버전 값 BTH_VENDOR_SPECIFIC_COMMAND 구조는 공급업체별 명령이 잘못된 라디오로 전송되는 것을 방지하는 데 도움이 됩니다. LMP 버전을 사용하면 공급업체에서 일치하는 LMP 버전이 있는 라디오에 공급업체별 명령을 보낼 수 있습니다. LMP 버전이 0이면 해당 공급업체의 모든 라디오가 공급업체별 명령을 받습니다.

공급업체별 명령이 표준 HCI 흐름 제어를 따르지 않고 공급업체별 명령에 대한 응답으로 공급업체별 이벤트가 생성되는 경우 패턴이 필요합니다.

패턴이 필요한 경우 명령에 따라 이벤트에 있는 패턴에 대한 BTH_VENDOR_PATTERN 구조체를 따라야 합니다. 이러한 패턴을 사용하면 Bluetooth 드라이버 스택이 공급업체별 이벤트를 해당 공급업체별 명령과 일치시킬 수 있습니다.

BTH_VENDOR_PATTERN 구조체는 BTH_VENDOR_SPECIFIC_COMMAND 구조체의 데이터 멤버에 지정된 공급업체별 명령 데이터를 따르는 패턴을 지정합니다. 명령을 따르는 모든 패턴의 최대 총 크기는 255보다 크지 않아야 합니다.

경고 IOCTL_BTH_HCI_VENDOR_COMMAND 제출하는 프로세스에는 SE_LOAD_DRIVER_NAME 권한이 있어야 합니다. 시스템 또는 관리자 컨텍스트에서 실행되는 프로세스는 SDK LookupPrivilegeValueAdjustTokenPrivileges 함수를 사용하여 권한을 높일 수 있습니다. 다음 코드 예제에서는 이 권한을 얻는 방법을 보여 줍니다. 이 예제에서는 오류 처리를 보여 주지 않습니다.
 
HANDLE procToken;
LUID luid;
TOKEN_PRIVILEGES tp;

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &procToken);

LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &luid);

Tp.PrivilegeCount = 1;
Tp.privileges[0].Luid = luid;
Tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(procToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD)NULL);

이 명령으로 인해 생성된 이벤트는 출력 버퍼(이벤트 헤더 포함)에 복사됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 버전:microsoft Windows Vista SP2 이상 운영 체제 버전에서 _Available.
머리글 bthioctl.h(Bthioctl.h 포함)
IRQL <= PASSIVE_LEVEL

추가 정보

BTH_COMMAND_HEADER

BTH_VENDOR_PATTERN

BTH_VENDOR_SPECIFIC_COMMAND