다음을 통해 공유


Bluetooth 인터페이스 쿼리

Bluetooth 드라이버 스택은 프로필 드라이버가 Bluetooth 디바이스와 상호 작용하는 데 사용할 수 있는 다음 인터페이스를 노출합니다.

인터페이스 Description
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 쿼리하여 BRB를 만들고, 할당하고, 재사용하고, 사용 가능한 함수에 대한 포인터를 가져옵니다.

이 인터페이스는 BTH_PROFILE_DRIVER_INTERFACE 구조체에 해당합니다.

이러한 인터페이스를 가져오려면 먼저 프로필 드라이버를 빌드하고 IRP_MN_QUERY_INTERFACE IRP를 Bluetooth 드라이버 스택으로 보내야 합니다.

다음 절차는 이러한 인터페이스 중 하나를 가져오는 일반적인 프로세스입니다.

인터페이스를 쿼리하려면

  1. IRP를 할당하고 초기화합니다.
  2. 인터페이스의 instance 할당하고 초기화합니다.
  3. 인터페이스를 쿼리할 주 함수 및 부 함수 코드를 지정합니다.
  4. 쿼리할 인터페이스를 지정합니다.
  5. 처리할 드라이버 스택 아래로 IRP를 전달합니다.

다음 의사 코드 예제에서는 IRP_MN_QUERY_INTERFACE IRP를 설정하여 GUID_BTHDDI_PROFILE_DRIVER_INTERFACE Bluetooth 드라이버 스택을 쿼리하는 방법을 보여 줍니다. 가독성을 위해 예제에서는 오류 처리를 보여 주지 않습니다.

#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가 성공적으로 반환되면 프로필 드라이버는 인터페이스에 포함된 함수 포인터에 액세스하여 사용할 수 있습니다.