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
- Allocare e inizializzare un'istanza di IRP.
- Allocare e inizializzare un'istanza dell'interfaccia.
- Specificare i codici di funzione principali e secondari da eseguire in query per l'interfaccia.
- Specificare l'interfaccia per cui eseguire una query.
- 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.