Funzione WdfDeviceEnqueueRequest (wdfdevice.h)
[Si applica solo a KMDF]
Il metodo WdfDeviceEnqueueRequest recapita una richiesta di I/O specificata al framework, in modo che il framework possa successivamente aggiungere la richiesta a una delle code di I/O create dal driver per il dispositivo specificato.
Sintassi
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
Parametri
[in] Device
Handle per un oggetto dispositivo framework.
[in] Request
Handle per un oggetto richiesta framework.
Valore restituito
Se l'operazione ha esito positivo, il metodo restituisce STATUS_SUCCESS. I valori restituiti aggiuntivi includono:
Codice restituito | Descrizione |
---|---|
|
La quantità di memoria disponibile è bassa. |
|
Il driver non ha creato code di I/O per il dispositivo e il driver non è un driver di filtro. |
|
La coda di I/O del dispositivo non accetta richieste. |
Il metodo potrebbe restituire altri valori NTSTATUS.
Un controllo di bug si verifica se il driver fornisce un handle di oggetti non valido.
Commenti
Il driver può chiamare WdfDeviceEnqueueRequest solo da una funzione di callback EvtIoInCallerContext .
Il metodo WdfDeviceEnqueueRequest aggiunge la richiesta alla coda di I/O specifica del driver per il dispositivo, se il driver ne ha creato uno. In caso contrario, il metodo aggiunge la richiesta alla coda predefinita del dispositivo, se il driver ne ha creato uno.
Se il driver non ha creato code di I/O per il dispositivo, WdfDeviceEnqueueRequest esegue le operazioni seguenti:
- Se il driver è un driver di filtro, WdfDeviceEnqueueRequest invia la richiesta alla destinazione I/O del driver.
- Se il driver non è un driver di filtro, WdfDeviceEnqueueRequest restituisce STATUS_INVALID_DEVICE_REQUEST.
Di conseguenza, se il driver deve usare la richiesta o il relativo contesto dopo aver chiamato WdfDeviceEnqueueRequest, deve prendere un riferimento nella richiesta prima di chiamare WdfDeviceEnqueueRequest.
A tale scopo, il driver può chiamare WdfObjectReference prima e quindi WdfObjectDereference dopo la chiamata a WdfDeviceEnqueueRequest. Il driver deve dereferenziare la richiesta prima di uscire da EvtIoInCallerContext.
Per altre informazioni sul metodo WdfDeviceEnqueueRequest , vedere Gestione delle code di I/O.
Per le versioni 1.0 e 1.5 di KMDF, è necessario chiamare WdfDeviceEnqueueRequest in PASSIVE_LEVEL. Per le versioni 1.7 e successive, WdfDeviceEnqueueRequest può essere chiamato in IRQL <= DISPATCH_LEVEL.
Esempio
L'esempio di codice seguente è una funzione di callback EvtIoInCallerContext che cerca le richieste che contengono il codice di controllo I/O personalizzato, IOCTL_NONPNP_METHOD_NEITHER. Se il codice di controllo I/O non viene trovato, la funzione di callback restituisce solo la richiesta al framework. Se la funzione di callback trova il codice di controllo I/O, pre-elabora la richiesta e quindi la restituisce al framework. Se viene rilevato un errore, la funzione di callback completa la richiesta.
VOID
MyEvtDeviceIoInCallerContext(
IN WDFDEVICE Device,
IN WDFREQUEST Request
)
{
NTSTATUS status = STATUS_SUCCESS;
WDF_REQUEST_PARAMETERS params;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
if(!(params.Type == WdfRequestTypeDeviceControl &&
params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
}
//
// Found a match for the control code. Preprocess the request, and then
// return the request to the framework.
//
//...(Preprocess the request here.)
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
End:
WdfRequestComplete(
Request,
status
);
return;
}
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Versione KMDF minima | 1.0 |
Intestazione | wdfdevice.h (includere Wdf.h) |
Libreria | Wdf01000.sys (vedere Framework Library Versioning). |
IRQL | <= DISPATCH_LEVEL (vedere la sezione osservazioni) |
Regole di conformità DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |