Поделиться через


Создание и отправка блока запроса Bluetooth (BRB)

В следующей процедуре описан общий процесс, который выполняет драйвер профиля для сборки и отправки блока запроса Bluetooth (BRB). BRB — это блок данных, описывающий выполнение операции Bluetooth.

Создание и отправка BRB

  1. Выделение IRP. Дополнительные сведения об использовании IRPs см. в разделе Обработка IRPs.
  2. Выделите BRB. Чтобы выделить BRB, вызовите функцию BthAllocateBrb, которую стек драйверов Bluetooth экспортирует для использования драйверами профилей. Чтобы получить указатель на функцию BthAllocateBrb, см. запросы к интерфейсам Bluetooth.
  3. Инициализировать параметры BRB. Каждый BRB использует соответствующую структуру. Задайте элементы структуры в соответствии с предполагаемым использованием. Для получения списка BRB и их соответствующих структур см. раздел в стеке драйверов Bluetooth.
  4. Инициализировать параметры IRP. Установите член IRP MajorFunction на IRP_MJ_INTERNAL_DEVICE_CONTROL. Задайте для элемента Parameters.DeviceIoControl.IoControlCode значение IOCTL_INTERNAL_BTH_SUBMIT_BRB. Задайте элемент Parameters.Others.Argument1, чтобы он указывал на BRB.
  5. Передайте IRP по стеку драйверов. Вызовите IoCallDriver, чтобы отправить IRP следующему драйверу ниже.

В следующем примере псевдокода показано, как настроить L2CAP Ping BRB, чтобы он обрабатывался стеком драйверов Bluetooth. Для удобства чтения пример не демонстрирует обработку ошибок.

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