Abfragen von Bluetooth-Schnittstellen

Der Bluetooth-Treiberstapel macht die folgenden Schnittstellen verfügbar, die Profiltreiber für die Interaktion mit Bluetooth-Geräten verwenden können.

Schnittstelle BESCHREIBUNG
GUID_BTHDDI_SDP_NODE_INTERFACE Profiltreiberabfragen für die GUID_BTHDDI_SDP_NODE_INTERFACE zum Abrufen von Zeigern auf Funktionen, die es ihnen ermöglichen, SDP-Datensätze (Service Discovery Protocol) zu erstellen.

Diese Schnittstelle entspricht der BTHDDI_SDP_NODE_INTERFACE-Struktur .
GUID_BTHDDI_SDP_PARSE_INTERFACE Profiltreiberabfragen für die GUID_BTHDDI_SDP_PARSE_INTERFACE zum Abrufen von Zeigern auf Funktionen, die es ihnen ermöglichen, SDP-Datensätze zu analysieren.

Diese Schnittstelle entspricht der BTHDDI_SDP_PARSE_INTERFACE-Struktur .
GUID_BTHDDI_PROFILE_DRIVER_INTERFACE Profiltreiber fragen den BTHDDI_PROFILE_DRIVER_INTERFACE ab, um Zeiger auf Funktionen abzurufen, die es ihnen ermöglichen, BRBs zu erstellen, zuzuordnen, wiederzuverwenden und freizugeben.

Diese Schnittstelle entspricht der BTH_PROFILE_DRIVER_INTERFACE-Struktur .

Um eine dieser Schnittstellen zu erhalten, muss ein Profiltreiber zuerst eine IRP_MN_QUERY_INTERFACE IRP erstellen und an den Bluetooth-Treiberstapel senden.

Das folgende Verfahren ist der allgemeine Prozess zum Abrufen einer dieser Schnittstellen.

So fragen Sie eine Schnittstelle ab

  1. Ordnen Sie ein IRP zu, und initialisieren Sie sie.
  2. Ordnen Sie eine instance der Schnittstelle zu, und initialisieren Sie sie.
  3. Geben Sie die Haupt- und Nebenfunktionscodes an, die für die Schnittstelle abfragt werden sollen.
  4. Geben Sie die abzufragende Schnittstelle an.
  5. Übergeben Sie den IRP auf den zu verarbeitenden Treiberstapel.

Im folgenden Pseudocodebeispiel wird veranschaulicht, wie Sie eine IRP_MN_QUERY_INTERFACE IRP einrichten, um den Bluetooth-Treiberstapel für den GUID_BTHDDI_PROFILE_DRIVER_INTERFACE abzufragen. Aus Gründen der Lesbarkeit zeigt das Beispiel keine Fehlerbehandlung.

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

Wenn der IRP erfolgreich zurückgibt, kann der Profiltreiber auf die Funktionszeiger zugreifen und diese verwenden, die in der Schnittstelle enthalten sind.