Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie müssen einen Zeiger auf die USBCAMD_INTERFACE Struktur abrufen, bevor Sie die neuen USBCAMD2-Features verwenden können. Um den Zeiger abzurufen, erstellen und senden Sie eine IRP_MN_QUERY_INTERFACE Anforderung vom SRB_INITIALIZATION_COMPLETE-Handler des Kameraminidrivers in der AdapterReceivePacket-Rückruffunktion . Die USBCAMD2-Minidriver-Bibliothek verarbeitet diese IRP und gibt eine Direktanrufschnittstelle vom Typ USBCAMD_INTERFACE an den Kamera-Minidriver zurück. Die Schnittstelle ist im Wesentlichen eine Tabelle mit Funktionszeigern.
Der folgende Code veranschaulicht, wie Sie die IRP_MN_QUERY_INTERFACE Anforderung vom Kamera-Minidriver erstellen und senden:
KeInitializeEvent(&Event, NotificationEvent, FALSE);
Irp = IoBuildSynchronousFsdRequest(
IRP_MJ_PNP,
pDeviceObject,
NULL,
0,
NULL,
&Event,
&IoStatusBlock);
if (NULL != Irp)
{
Irp->RequestorMode = KernelMode;
IrpStackNext = IoGetNextIrpStackLocation(Irp);
//
// Create an interface query out of the Irp.
//
IrpStackNext->MinorFunction = IRP_MN_QUERY_INTERFACE;
IrpStackNext->Parameters.QueryInterface.InterfaceType = (GUID*)&GUID_USBCAMD_INTERFACE;
IrpStackNext->Parameters.QueryInterface.Size = sizeof(*pUsbcamdInterface);
IrpStackNext->Parameters.QueryInterface.Version = USBCAMD_VERSION_200;
IrpStackNext->Parameters.QueryInterface.Interface = (PINTERFACE)pUsbcamdInterface;
IrpStackNext->Parameters.QueryInterface.InterfaceSpecificData = NULL;
Status = IoCallDriver(pDeviceObject, Irp);
if (STATUS_PENDING == Status)
{
//
// This waits using KernelMode so that the stack, and therefore the
// event on that stack, is not paged out.
//
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
Status = IoStatusBlock.Status;
}
}
else
{
Status = STATUS_INSUFFICIENT_RESOURCES;
}