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
- Ordnen Sie ein IRP zu, und initialisieren Sie sie.
- Ordnen Sie eine instance der Schnittstelle zu, und initialisieren Sie sie.
- Geben Sie die Haupt- und Nebenfunktionscodes an, die für die Schnittstelle abfragt werden sollen.
- Geben Sie die abzufragende Schnittstelle an.
- Ü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.