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


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

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

Сборка и отправка BRB

  1. Выделение IRP. Дополнительные сведения об использовании IRP см. в разделе Обработка irPs.
  2. Выделение BRB. Чтобы выделить BRB, вызовите функцию BthAllocateBrb , экспортируемую стеком драйверов Bluetooth для использования драйверами профилей. Чтобы получить указатель на функцию BthAllocateBrb , см. статью Запрос для интерфейсов Bluetooth.
  3. Инициализируйте параметры BRB. Каждый BRB использует соответствующую структуру. Задайте элементы структуры в соответствии с предполагаемым использованием. Список brb и их соответствующих структур см. в разделе Использование стека драйверов Bluetooth.
  4. Инициализируйте параметры IRP. Задайте для элемента MajorFunction IRP значение 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 );