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
- Allouer et initialiser un IRP.
- Allouer et initialiser une instance de l’interface.
- Spécifiez les codes de fonction principal et secondaire à interroger pour l’interface.
- Spécifiez l’interface pour laquelle interroger.
- 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.