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 드라이버 스택으로 보내야 합니다.
다음 절차는 이러한 인터페이스 중 하나를 가져오는 일반적인 프로세스입니다.
인터페이스를 쿼리하려면
- IRP를 할당하고 초기화합니다.
- 인터페이스의 instance 할당하고 초기화합니다.
- 인터페이스를 쿼리할 주 함수 및 부 함수 코드를 지정합니다.
- 쿼리할 인터페이스를 지정합니다.
- 처리할 드라이버 스택 아래로 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가 성공적으로 반환되면 프로필 드라이버는 인터페이스에 포함된 함수 포인터에 액세스하여 사용할 수 있습니다.