Erstellen und Senden eines Bluetooth-Anforderungsblocks (BRB)

Das folgende Verfahren beschreibt den allgemeinen Prozess, den ein Profiltreiber zum Erstellen und Senden eines Bluetooth-Anforderungsblocks (BRB) befolgt. Ein BRB ist ein Datenblock, der den auszuführenden Bluetooth-Vorgang beschreibt.

So erstellen und senden Sie einen BRB

  1. Ordnen Sie ein IRP zu. Weitere Informationen zur Verwendung von IRPs finden Sie unter Behandeln von IRPs.
  2. Ordnen Sie einen BRB zu. Rufen Sie zum Zuordnen von BRBs die BthAllocateBrb-Funktion auf, die vom Bluetooth-Treiberstapel zur Verwendung durch Profiltreiber exportiert wird. Informationen zum Abrufen eines Zeigers auf die BthAllocateBrb-Funktion finden Sie unter Abfragen von Bluetooth-Schnittstellen.
  3. Initialisieren Sie die Parameter des BRB. Jeder BRB verwendet eine entsprechende Struktur. Legen Sie die Member der -Struktur entsprechend der beabsichtigten Verwendung fest. Eine Liste der BRBs und ihrer entsprechenden Strukturen finden Sie unter Verwenden des Bluetooth-Treiberstapels.
  4. Initialisieren Sie die Parameter des IRP. Legen Sie das MajorFunction-Element des IRP auf IRP_MJ_INTERNAL_DEVICE_CONTROL fest. Legen Sie das Parameters.DeviceIoControl.IoControlCode-Element auf IOCTL_INTERNAL_BTH_SUBMIT_BRB fest. Legen Sie den Parameter.Others.Argument1-Member so fest, dass er auf den BRB zeigt.
  5. Übergeben Sie den IRP im Treiberstapel. Rufen Sie IoCallDriver auf, um den IRP an den nächstniedrigen Treiber zu senden.

Im folgenden Pseudocodebeispiel wird veranschaulicht, wie ein L2CAP-Ping-BRB für den zu verarbeitenden Bluetooth-Treiberstapel eingerichtet wird. Aus Gründen der Lesbarkeit zeigt das Beispiel keine Fehlerbehandlung.

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