Condividi tramite


Query per interfacce Bluetooth

Lo stack di driver Bluetooth espone le interfacce seguenti che i driver del profilo possono usare per interagire con i dispositivi Bluetooth.

Interfaccia Descrizione
GUID_BTHDDI_SDP_NODE_INTERFACE Query dei driver di profilo per l'GUID_BTHDDI_SDP_NODE_INTERFACE per ottenere puntatori alle funzioni che consentono loro di creare record SDP (Service Discovery Protocol).

Questa interfaccia corrisponde alla struttura BTHDDI_SDP_NODE_INTERFACE .
GUID_BTHDDI_SDP_PARSE_INTERFACE Query dei driver di profilo per l'GUID_BTHDDI_SDP_PARSE_INTERFACE per ottenere puntatori alle funzioni che consentono di analizzare i record SDP.

Questa interfaccia corrisponde alla struttura BTHDDI_SDP_PARSE_INTERFACE .
GUID_BTHDDI_PROFILE_DRIVER_INTERFACE Query sui driver di profilo per l'BTHDDI_PROFILE_DRIVER_INTERFACE per ottenere puntatori alle funzioni che consentono loro di creare, allocare, riutilizzare e liberare i BRB.

Questa interfaccia corrisponde alla struttura BTH_PROFILE_DRIVER_INTERFACE .

Per ottenere una di queste interfacce, un driver del profilo deve prima compilare e inviare un IRP_MN_QUERY_INTERFACE IRP allo stack di driver Bluetooth.

La procedura seguente è il processo generale per ottenere una di queste interfacce.

Per eseguire una query per un'interfaccia

  1. Allocare e inizializzare un'istanza di IRP.
  2. Allocare e inizializzare un'istanza dell'interfaccia.
  3. Specificare i codici di funzione principali e secondari da eseguire in query per l'interfaccia.
  4. Specificare l'interfaccia per cui eseguire una query.
  5. Passare l'IRP verso il basso lo stack di driver da elaborare.

Nell'esempio di pseudocodice seguente viene illustrato come configurare un IRP_MN_QUERY_INTERFACE IRP per eseguire query sullo stack di driver Bluetooth per il GUID_BTHDDI_PROFILE_DRIVER_INTERFACE. Per la leggibilità, l'esempio non dimostra la gestione degli errori.

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

Se l'IRP restituisce correttamente, il driver del profilo può quindi accedere e usare i puntatori di funzione contenuti nell'interfaccia.