Génération et envoi d’un bloc de requête Bluetooth (BRB)
La procédure suivante décrit le processus général suivi par un pilote de profil pour générer et envoyer un bloc de requête Bluetooth (BRB). Un BRB est un bloc de données qui décrit l’opération Bluetooth à effectuer.
Pour générer et envoyer un BRB
- Allouez un IRP. Pour plus d’informations sur l’utilisation des IRP, consultez Gestion des IRP.
- Allouez un BRB. Pour allouer des BBRB, appelez la fonction BthAllocateBrb que la pile de pilotes Bluetooth exporte pour une utilisation par les pilotes de profil. Pour obtenir un pointeur vers la fonction BthAllocateBrb , consultez Interrogation des interfaces Bluetooth.
- Initialisez les paramètres du BRB. Chaque BRB utilise une structure correspondante. Définissez les membres de la structure en fonction de l’utilisation prévue. Pour obtenir la liste des BBR et leurs structures correspondantes, consultez Utilisation de la pile de pilotes Bluetooth.
- Initialisez les paramètres de l’IRP. Définissez le membre MajorFunction de l’IRP sur IRP_MJ_INTERNAL_DEVICE_CONTROL. Définissez le membre Parameters.DeviceIoControl.IoControlCode sur IOCTL_INTERNAL_BTH_SUBMIT_BRB. Définissez le membre Parameters.Others.Argument1 pour qu’il pointe vers le BRB.
- Passez l’IRP vers le bas de la pile des pilotes. Appelez IoCallDriver pour envoyer l’IRP au pilote inférieur suivant.
L’exemple de pseudo-code suivant montre comment configurer un BRB Ping L2CAP pour la pile de pilotes Bluetooth à traiter. Pour des fins de lisibilité, l’exemple ne montre pas la gestion des erreurs.
#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 );