Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The following procedure outlines the general process that a profile driver follows to build and send a Bluetooth request block (BRB). A BRB is a block of data that describes the Bluetooth operation to perform.
To build and send a BRB
- Allocate an IRP. For more information about how to use IRPs, see Handling IRPs.
- Allocate a BRB. To allocate BRBs, call the BthAllocateBrb function that the Bluetooth driver stack exports for use by profile drivers. To obtain a pointer to the BthAllocateBrb function, see Querying for Bluetooth Interfaces.
- Initialize the parameters of the BRB. Each BRB uses a corresponding structure. Set the members of the structure according to the intended use. For a list of BRBs and their corresponding structures see Using the Bluetooth Driver Stack.
- Initialize the parameters of the IRP. Set the MajorFunction member of the IRP to IRP_MJ_INTERNAL_DEVICE_CONTROL. Set the Parameters.DeviceIoControl.IoControlCode member to IOCTL_INTERNAL_BTH_SUBMIT_BRB. Set the Parameters.Others.Argument1 member to point to the BRB.
- Pass the IRP down the driver stack. Call IoCallDriver to send the IRP to the next-lower driver.
The following pseudocode example demonstrates how to set up a L2CAP Ping BRB for the Bluetooth driver stack to process. For readability, the example does not demonstrate error handling.
#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 );