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
- Ordnen Sie ein IRP zu. Weitere Informationen zur Verwendung von IRPs finden Sie unter Behandeln von IRPs.
- 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.
- 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.
- 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.
- Ü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 );