Funzione WdfRequestForwardToIoQueue (wdfrequest.h)
[Si applica a KMDF e UMDF]
Il metodo WdfRequestForwardToIoQueue esegue nuovamente una richiesta di I/O a una delle code I/O del driver chiamante.
Sintassi
NTSTATUS WdfRequestForwardToIoQueue(
[in] WDFREQUEST Request,
[in] WDFQUEUE DestinationQueue
);
Parametri
[in] Request
Handle per un oggetto richiesta framework.
[in] DestinationQueue
Handle a un oggetto code del framework.
Valore restituito
WdfRequestForwardToIoQueue restituisce STATUS_SUCCESS se l'operazione ha esito positivo. In caso contrario, questo metodo potrebbe restituire uno dei valori seguenti:
Codice restituito | Descrizione |
---|---|
|
Questo valore viene restituito se si verifica una delle operazioni seguenti:
|
|
La coda di destinazione non accetta nuove richieste. |
Questo metodo potrebbe restituire anche altri valori NTSTATUS.
Un controllo di bug si verifica se il driver fornisce un handle di oggetti non valido.
Commenti
Il driver deve avere la richiesta di I/O e deve avere ottenuto la richiesta da una delle relative code di I/O.
Le code di origine e di destinazione non possono essere uguali. In altre parole, il driver non può chiamare WdfRequestForwardToIoQueue per restituire una richiesta alla coda da cui proviene. Per riassegnare una richiesta alla stessa coda, usare WdfRequestRequeue.
Sia le code di origine che di destinazione devono appartenere allo stesso dispositivo.
La richiesta non deve essere annullabile. Se il driver ha chiamato WdfRequestMarkCancelable o WdfRequestMarkCancelableEx per rendere la richiesta annullabile, deve chiamare WdfRequestUnmarkCancelable prima di chiamare WdfRewardToIoQueue.
Dopo che il driver chiama WdfRequestForwardToIoQueue, il driver non possiede la richiesta riqueued finché il framework non recapita la richiesta dalla nuova coda al driver. Mentre la richiesta si trova nella nuova coda, il framework possiede la richiesta e può annullarla senza notificare il driver.
Prima che WdfRequestForwardToIoQueue restituisca, gli eventi seguenti possono verificarsi:
- Se la coda di destinazione è vuota, il framework può recapitare la richiesta di I/O riqueued a uno dei gestori delle richieste della coda di destinazione.
- Se il metodo di invio della coda di origine è sequenziale o parallelo, il framework può recapitare un'altra richiesta a uno dei gestori delle richieste della coda di origine.
Esempio
L'esempio di codice seguente è una funzione di callback EvtIoDeviceControl dal driver di esempio PCIDRV . Se una richiesta ricevuta contiene un codice di controllo I/O di IOCTL_NDISPROT_INDICATE_STATUS, il driver chiama WdfRequestForwardToIoQueue per spostare la richiesta in una coda di I/O diversa.
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;
}
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Versione KMDF minima | 1.0 |
Versione UMDF minima | 2,0 |
Intestazione | wdfrequest.h (include Wdf.h) |
Libreria | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
Regole di conformità DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |