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 .
Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.
Osservazioni
Il driver può chiamare WdfDeviceEnqueueRequest solo da una funzione di callback EvtIoInCallerCon text.
Il metodo WdfDeviceEnqueueRequest aggiunge la richiesta alla coda di I/O specifica del tipo di richiesta 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 accettare un riferimento alla 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 EvtIoInCallerContext.
Per altre informazioni sul metodo WdfDeviceEnqueueRequest, vedere Managing I/O Queues.
Per le versioni 1.0 e 1.5 di KMDF, WdfDeviceEnqueueRequest deve essere chiamato in PASSIVE_LEVEL. Per le versioni 1.7 e successive, WdfDeviceEnqueueRequest può essere chiamato in IRQL <= DISPATCH_LEVEL.
Esempi
L'esempio di codice seguente è un EvtIoInCallerContext funzione di callback che cerca le richieste che contengono il codice di controllo I/O personalizzato IOCTL_NONPNP_METHOD_NEITHER. Se il codice di controllo di I/O non viene trovato, la funzione di callback restituisce semplicemente la richiesta al framework. Se la funzione di callback trova il codice di controllo I/O, pre-elabora la richiesta e 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;
}
Fabbisogno
Requisito | Valore |
---|---|
piattaforma di destinazione | Universale |
versione minima di KMDF | 1.0 |
intestazione | wdfdevice.h (include Wdf.h) |
libreria | Wdf01000.sys (vedere Controllo delle versioni della libreria framework). |
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) |