Funzione WdfRequestComplete (wdfrequest.h)
[Si applica a KMDF e UMDF]
Il metodo WdfRequestComplete completa una richiesta di I/O specificata e fornisce uno stato di completamento.
Sintassi
void WdfRequestComplete(
[in] WDFREQUEST Request,
[in] NTSTATUS Status
);
Parametri
[in] Request
Handle per l'oggetto richiesta framework che rappresenta la richiesta di I/O completata.
[in] Status
Valore NTSTATUS che rappresenta lo stato di completamento della richiesta. I valori di stato validi includono, ma non sono limitati a, quanto segue:
STATUS_SUCCESS
Il driver sta completando correttamente la richiesta.
STATUS_CANCELLED
Il driver annulla la richiesta.
STATUS_UNSUCCESSFUL
Il driver ha rilevato un errore durante l'elaborazione della richiesta.
Valore restituito
nessuno
Osservazioni
Un controllo di bug si verifica se il driver fornisce un handle di oggetti non valido.
Dopo che un driver chiama WdfRequestComplete, i driver di livello superiore nello stack di driver possono chiamare WdfRequestGetStatus per ottenere il valore di stato di completamento specificato per il parametro Status . In genere, i driver chiamano WdfRequestGetStatus dall'interno di una funzione di callback di CompletamentoRoutine .
Dopo aver restituito una chiamata a WdfRequestComplete , l'handle della richiesta non è più valido a meno che il driver non abbia chiamato WdfObjectReference per aggiungere uno o più conteggi di riferimento aggiuntivi all'oggetto request. Si noti che dopo che WdfRequestComplete restituisce , il driver non deve tentare di accedere alla struttura WDM IRP associata, anche se ha chiamato WdfObjectReference. Questo requisito estende l'accesso alla struttura WDM IRP associata chiamando i metodi in WDFREQUEST, ad esempio WdfRequestRetrieveOutputBuffer o WdfRequestRetrieveInputBuffer.
Dopo che un driver chiama WdfRequestComplete, il framework chiama la funzione EvtCleanupCallback del driver per la richiesta, se il driver ne ha fornito uno.
Anziché chiamare WdfRequestComplete, il driver può chiamare WdfRequestCompleteWithInformation o WdfRequestCompleteWithPriorityBoost. Per altre informazioni, vedere le osservazioni di WdfRequestCompleteWithInformation .
Quando il driver chiama WdfRequestComplete, il framework fornisce un valore predefinito usato dal sistema per aumentare la priorità di runtime del thread che ha richiesto l'operazione di I/O. Per informazioni sui valori di aumento della priorità predefinita, vedere Specifica di incrementi di priorità durante il completamento delle richieste di I/O. Il driver può chiamare WdfRequestCompleteWithPriorityBoost per eseguire l'override del valore di boost di priorità predefinito.
Per altre informazioni sulla chiamata a WdfRequestComplete, vedere Completamento delle richieste di I/O.
Esempio
L'esempio di codice seguente è una sezione di un gestore delle richieste. Il gestore della richiesta accetta solo richieste di lettura e scrittura e completa ogni richiesta con stato di errore se il tipo di richiesta non è di lettura o scrittura.
VOID
MyEvtIoDefault(
IN WDFQUEUE Queue,
IN WDFREQUEST Request
)
{
WDF_REQUEST_PARAMETERS params;
WDF_DMA_DIRECTION direction;
...
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
//
// Validate and gather parameters.
//
switch (params.Type) {
case WdfRequestTypeRead:
length = params.Parameters.Read.Length;
direction = WdfDmaDirectionReadFromDevice;
break;
case WdfRequestTypeWrite:
length = params.Parameters.Write.Length;
direction = WdfDmaDirectionWriteToDevice;
break;
default:
WdfRequestComplete(
Request,
STATUS_INVALID_DEVICE_REQUEST
);
return;
}
...
}
Requisiti
Vedi anche
WdfRequestCompleteWithInformation