WdfRequestForwardToIoQueue-Funktion (wdfrequest.h)
[Gilt für KMDF und UMDF]
Die WdfRequestForwardToIoQueue Methode stellt eine E/A-Anforderung in eine der E/A-Warteschlangen des aufrufenden Treibers um.
Syntax
NTSTATUS WdfRequestForwardToIoQueue(
[in] WDFREQUEST Request,
[in] WDFQUEUE DestinationQueue
);
Parameter
[in] Request
Ein Handle zu einem Framework-Anforderungsobjekt.
[in] DestinationQueue
Ein Handle zu einem Framework-Warteschlangenobjekt.
Rückgabewert
WdfRequestForwardToIoQueue gibt STATUS_SUCCESS zurück, wenn der Vorgang erfolgreich ist. Andernfalls gibt diese Methode möglicherweise einen der folgenden Werte zurück:
Rückgabecode | Beschreibung |
---|---|
|
Dieser Wert wird zurückgegeben, wenn einer der folgenden Aktionen auftritt:
|
|
Die Zielwarteschlange akzeptiert keine neuen Anforderungen. |
Diese Methode kann auch andere NTSTATUS-Wertezurückgeben.
Wenn der Treiber ein ungültiges Objekthandle bereitstellt, tritt eine Fehlerüberprüfung auf.
Bemerkungen
Der Treiber muss eine eigene der E/A-Anforderung und die Anforderung aus einer der E/A-Warteschlangen erhalten haben.
Die Quell- und Zielwarteschlangen können nicht identisch sein. Mit anderen Worten, der Treiber kann WdfRequestForwardToIoQueue aufrufen, um eine Anforderung an die Warteschlange zurückzugeben, von der sie stammt. Verwenden Sie WdfRequestRequeue-, um eine Anforderung erneut an dieselbe Warteschlange zu stellen.
Sowohl die Quell- als auch die Zielwarteschlange müssen zum gleichen Gerät gehören.
Die Anforderung darf nicht abgebrochen werden. Wenn der Treiber WdfRequestMarkCancelable oder WdfRequestMarkCancelableEx aufgerufen hat, um die Anforderung abzubrechen, muss er WdfRequestUnmarkCancelable aufrufen, bevor WdfRequestForwardToIoQueueaufgerufen wird.
Nachdem der Treiber WdfRequestForwardToIoQueueaufgerufen hat, besitzt der Treiber nicht die erneut abgefragte Anforderung, bis das Framework die Anforderung aus der neuen Warteschlange an den Treiber übermittelt. Während sich die Anforderung in der neuen Warteschlange befindet, besitzt das Framework die Anforderung und kann sie abbrechen, ohne den Treiber zu benachrichtigen.
Bevor WdfRequestForwardToIoQueue zurückgibt, können die folgenden Ereignisse auftreten:
- Wenn die Zielwarteschlange leer war, kann das Framework die erneut abgefragte E/A-Anforderung an eine der Anforderungshandler der Zielwarteschlangeliefern.
- Wenn die Dispatching-Methode der Quellwarteschlange sequenziell oder parallel ist, kann das Framework eine weitere Anforderung an einen der Anforderungshandler der Quellwarteschlange übermitteln.
Beispiele
Das folgende Codebeispiel ist ein EvtIoDeviceControl Rückruffunktion aus dem PCIDRV Beispieltreiber. Wenn eine empfangene Anforderung einen E/A-Steuerungscode von IOCTL_NDISPROT_INDICATE_STATUS enthält, ruft der Treiber WdfRequestForwardToIoQueue auf, um die Anforderung in eine andere E/A-Warteschlange zu verschieben.
VOID
PciDrvEvtIoDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
{
NTSTATUS status= STATUS_SUCCESS;
PFDO_DATA fdoData = NULL;
WDFDEVICE hDevice;
WDF_REQUEST_PARAMETERS params;
UNREFERENCED_PARAMETER(OutputBufferLength);
UNREFERENCED_PARAMETER(InputBufferLength);
hDevice = WdfIoQueueGetDevice(Queue);
fdoData = FdoGetData(hDevice);
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
switch (IoControlCode)
{
case IOCTL_NDISPROT_QUERY_OID_VALUE:
NICHandleQueryOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_SET_OID_VALUE:
NICHandleSetOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_INDICATE_STATUS:
status = WdfRequestForwardToIoQueue(
Request,
fdoData->PendingIoctlQueue
);
if(!NT_SUCCESS(status)){
WdfRequestComplete(
Request,
status
);
break;
}
break;
default:
WdfRequestComplete(
Request,
STATUS_INVALID_DEVICE_REQUEST
);
break;
}
return;
}
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Minimale KMDF-Version | 1.0 |
Mindest-UMDF-Version | 2.0 |
Header- | wdfrequest.h (include Wdf.h) |
Library | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL- | <=DISPATCH_LEVEL |
DDI-Complianceregeln | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrq, KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |