Compartilhar via


Compilar e enviar um BRB (bloco de solicitação Bluetooth)

O procedimento a seguir descreve o processo geral que um driver de perfil segue para compilar e enviar um BRB (bloco de solicitação Bluetooth). Um BRB é um bloco de dados que descreve a operação Bluetooth a ser executada.

Para compilar e enviar um BRB

  1. Alocar um IRP. Para obter mais informações sobre como usar IRPs, consulte Manipulando IRPs.
  2. Alocar um BRB. Para alocar BRBs, chame a função BthAllocateBrb que a pilha de driver Bluetooth exporta para uso por drivers de perfil. Para obter um ponteiro para a função BthAllocateBrb , consulte Consultando interfaces Bluetooth.
  3. Inicialize os parâmetros do BRB. Cada BRB usa uma estrutura correspondente. Defina os membros da estrutura de acordo com o uso pretendido. Para obter uma lista de BRBs e suas estruturas correspondentes, consulte Usando a pilha de driver Bluetooth.
  4. Inicialize os parâmetros do IRP. Defina o membro MajorFunction do IRP como IRP_MJ_INTERNAL_DEVICE_CONTROL. Defina o membro Parameters.DeviceIoControl.IoControlCode como IOCTL_INTERNAL_BTH_SUBMIT_BRB. Defina o membro Parameters.Others.Argument1 para apontar para o BRB.
  5. Passe o IRP para baixo na pilha do driver. Chame IoCallDriver para enviar o IRP para o driver inferior seguinte.

O exemplo de pseudocódigo a seguir demonstra como configurar um L2CAP Ping BRB para a pilha de driver Bluetooth a ser processada. Para facilitar a leitura, o exemplo não demonstra o tratamento de erros.

#include <bthddi.h>

// Code for obtaining the BthInterface pointer

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

PBRB_L2CA_PING BrbPing; // Define storage for a L2CAP Ping BRB

// Allocate the Ping BRB
BrbPing = BthInterface->BthAllocateBrb( BRB_L2CA_PING, PROFILE_DRIVER_POOL_TAG );

// Set up the next IRP stack location
PIO_STACK_LOCATION NextIrpStack;
NextIrpStack = IoGetNextIrpStackLocation( Irp );
NextIrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
NextIrpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_BTH_SUBMIT_BRB;
NextIrpStack->Parameters.Others.Argument1 = BrbPing;

// Pass the IRP down the driver stack
NTSTATUS Status;
Status = IoCallDriver( DeviceExtension->NextLowerDriver, Irp );