Compartir a través de


Consulta de interfaces Bluetooth

La pila de controladores Bluetooth expone las siguientes interfaces que los controladores de perfil pueden usar para interactuar con dispositivos Bluetooth.

Interfaz Descripción
GUID_BTHDDI_SDP_NODE_INTERFACE Consulta de controladores de perfil para el GUID_BTHDDI_SDP_NODE_INTERFACE para obtener punteros a funciones que les permitan crear registros del Protocolo de detección de servicios (SDP).

Esta interfaz corresponde a la estructura BTHDDI_SDP_NODE_INTERFACE .
GUID_BTHDDI_SDP_PARSE_INTERFACE Consulta de controladores de perfil para el GUID_BTHDDI_SDP_PARSE_INTERFACE para obtener punteros a funciones que les permiten analizar registros SDP.

Esta interfaz corresponde a la estructura BTHDDI_SDP_PARSE_INTERFACE .
GUID_BTHDDI_PROFILE_DRIVER_INTERFACE Consulta de controladores de perfil para el BTHDDI_PROFILE_DRIVER_INTERFACE para obtener punteros a funciones que les permitan crear, asignar, reutilizar y liberar BRB.

Esta interfaz corresponde a la estructura BTH_PROFILE_DRIVER_INTERFACE .

Para obtener cualquiera de estas interfaces, un controlador de perfil primero debe compilar y enviar una IRP_MN_QUERY_INTERFACE IRP a la pila del controlador Bluetooth.

El siguiente procedimiento es el proceso general para obtener una de estas interfaces.

Para consultar una interfaz

  1. Asigne e inicialice un IRP.
  2. Asigne e inicialice una instancia de la interfaz .
  3. Especifique los códigos de función principal y secundaria que se van a consultar para la interfaz.
  4. Especifique la interfaz para la que se va a consultar.
  5. Pase el IRP hacia abajo en la pila de controladores que se va a procesar.

En el siguiente ejemplo de pseudocódigo se muestra cómo configurar un IRP de IRP_MN_QUERY_INTERFACE para consultar la pila del controlador Bluetooth para la GUID_BTHDDI_PROFILE_DRIVER_INTERFACE. Para mejorar la legibilidad, el ejemplo no muestra el control de errores.

#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 );

Si el IRP se devuelve correctamente, el controlador de perfil puede acceder a los punteros de función contenidos en la interfaz y usarlos.