Partager via


Interrogation des interfaces Bluetooth

La pile de pilotes Bluetooth expose les interfaces suivantes que les pilotes de profil peuvent utiliser pour interagir avec les appareils Bluetooth.

Interface Description
GUID_BTHDDI_SDP_NODE_INTERFACE Les pilotes de profil interrogent le GUID_BTHDDI_SDP_NODE_INTERFACE pour obtenir des pointeurs vers des fonctions qui leur permettent de créer des enregistrements SDP (Service Discovery Protocol).

Cette interface correspond à la structure BTHDDI_SDP_NODE_INTERFACE .
GUID_BTHDDI_SDP_PARSE_INTERFACE Les pilotes de profil interrogent le GUID_BTHDDI_SDP_PARSE_INTERFACE pour obtenir des pointeurs vers des fonctions qui leur permettent d’analyser les enregistrements SDP.

Cette interface correspond à la structure BTHDDI_SDP_PARSE_INTERFACE .
GUID_BTHDDI_PROFILE_DRIVER_INTERFACE Les pilotes de profil interrogent les BTHDDI_PROFILE_DRIVER_INTERFACE afin d’obtenir des pointeurs vers des fonctions qui leur permettent de créer, d’allouer, de réutiliser et de libérer des BRB.

Cette interface correspond à la structure BTH_PROFILE_DRIVER_INTERFACE .

Pour obtenir l’une de ces interfaces, un pilote de profil doit d’abord générer et envoyer un IRP IRP_MN_QUERY_INTERFACE à la pile de pilotes Bluetooth.

La procédure suivante est le processus général permettant d’obtenir l’une de ces interfaces.

Pour interroger une interface

  1. Allouer et initialiser un IRP.
  2. Allouer et initialiser une instance de l’interface.
  3. Spécifiez les codes de fonction principal et secondaire à interroger pour l’interface.
  4. Spécifiez l’interface pour laquelle interroger.
  5. Passez l’IRP vers le bas de la pile des pilotes à traiter.

L’exemple de pseudocode suivant montre comment configurer un IRP IRP_MN_QUERY_INTERFACE pour interroger la pile de pilotes Bluetooth pour le GUID_BTHDDI_PROFILE_DRIVER_INTERFACE. Pour plus de lisibilité, l’exemple ne montre pas la gestion des erreurs.

#include <bthddi.h>

...

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

PBTH_PROFILE_DRIVER_INTERFACE BthInterface; // Define storage for an instance of the BTH_PROFILE_DRIVER_INTERFACE structure
BthInterface = ExAllocatePoolWithTag( NonPagedPool, sizeof( BTH_PROFILE_DRIVER_INTERFACE ), PROFILE_DRIVER_POOL_TAG );

// Zero the memory associated with the structure
RtlZeroMemory( BthInterface, sizeof( BTH_PROFILE_DRIVER_INTERFACE ) );

// Set up the next IRP stack location
PIO_STACK_LOCATION NextIrpStack;
NextIrpStack = IoGetNextIrpStackLocation( Irp );
NextIrpStack->MajorFunction = IRP_MJ_PNP;
NextIrpStack->MinorFunction = IRP_MN_QUERY_INTERFACE;
NextIrpStack->Parameters.QueryInterface.InterfaceType = (LPGUID) &GUID_BTHDDI_PROFILE_DRIVER_INTERFACE;
NextIrpStack->Parameters.QueryInterface.Size = sizeof( BTH_PROFILE_DRIVER_INTERFACE );
NextIrpStack->Parameters.QueryInterface.Version = BTHDDI_PROFILE_DRIVER_INTERFACE_VERSION_FOR_QI;
NextIrpStack->Parameters.QueryInterface.Interface = (PINTERFACE) BthInterface;
NextIrpStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;

// Pass the IRP down the driver stack
NTSTATUS Status;
Status = IoCallDriver( DeviceExtension->NextLowerDriver, Irp );

Si l’IRP retourne correctement, le pilote de profil peut accéder et utiliser les pointeurs de fonction contenus dans l’interface.