Consultando interfaces Bluetooth
A pilha de driver Bluetooth expõe as interfaces a seguir que os drivers de perfil podem usar para interagir com dispositivos Bluetooth.
Interface | Descrição |
---|---|
GUID_BTHDDI_SDP_NODE_INTERFACE | A consulta de drivers de perfil para o GUID_BTHDDI_SDP_NODE_INTERFACE obter ponteiros para funções que permitem criar registros do Protocolo de Descoberta de Serviço (SDP). Essa interface corresponde à estrutura BTHDDI_SDP_NODE_INTERFACE . |
GUID_BTHDDI_SDP_PARSE_INTERFACE | A consulta de drivers de perfil para o GUID_BTHDDI_SDP_PARSE_INTERFACE obter ponteiros para funções que permitem analisar registros SDP. Essa interface corresponde à estrutura BTHDDI_SDP_PARSE_INTERFACE . |
GUID_BTHDDI_PROFILE_DRIVER_INTERFACE | Os drivers de perfil consultam o BTHDDI_PROFILE_DRIVER_INTERFACE para obter ponteiros para funções que permitem que eles criem, aloquem, reutilizem e liberem BRBs. Essa interface corresponde à estrutura de BTH_PROFILE_DRIVER_INTERFACE . |
Para obter qualquer uma dessas interfaces, um driver de perfil deve primeiro compilar e enviar um IRP IRP_MN_QUERY_INTERFACE para a pilha de driver bluetooth.
O procedimento a seguir é o processo geral para obter uma dessas interfaces.
Para consultar uma interface
- Alocar e inicializar um IRP.
- Aloque e inicialize uma instância da interface.
- Especifique os códigos de função principal e secundária a serem consultados para a interface.
- Especifique a interface para a qual consultar.
- Passe o IRP para baixo na pilha do driver a ser processada.
O exemplo de pseudocódigo a seguir demonstra como configurar um IRP IRP_MN_QUERY_INTERFACE para consultar a pilha do driver Bluetooth para o GUID_BTHDDI_PROFILE_DRIVER_INTERFACE. Para legibilidade, o exemplo não demonstra o tratamento de erros.
#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 );
Se o IRP retornar com êxito, o driver de perfil poderá acessar e usar os ponteiros de função contidos na interface.