Funzione WdfRequestRetrieveOutputBuffer (wdfrequest.h)
[Si applica a KMDF e UMDF]
Il metodo WdfRequestRetrieveOutputBuffer recupera un buffer di output della richiesta di I/O.
Sintassi
NTSTATUS WdfRequestRetrieveOutputBuffer(
[in] WDFREQUEST Request,
[in] size_t MinimumRequiredSize,
[out] PVOID *Buffer,
[out, optional] size_t *Length
);
Parametri
[in] Request
Handle per un oggetto richiesta framework.
[in] MinimumRequiredSize
Dimensioni minime del buffer, in byte, che il driver deve elaborare la richiesta di I/O.
[out] Buffer
Puntatore a una posizione che riceve l'indirizzo del buffer.
[out, optional] Length
Puntatore a una posizione che riceve le dimensioni del buffer, in byte. Questo parametro è facoltativo e può essere NULL.
Valore restituito
WdfRequestRetrieveOutputBuffer restituisce STATUS_SUCCESS se l'operazione ha esito positivo. In caso contrario, questo metodo potrebbe restituire uno dei valori seguenti:
Codice restituito | Descrizione |
---|---|
|
Un parametro di input non è valido. |
|
La lunghezza del buffer di output è zero o il parametro MinimumRequiredSize specifica una dimensione del buffer maggiore rispetto alla dimensione effettiva del buffer. |
|
Il tipo di richiesta non è valido o la richiesta usa né buffering né I/O diretto. Per altre informazioni sui metodi supportati per l'accesso ai buffer dei dati, vedere la sezione Osservazioni seguenti. |
|
La richiesta è già stata completata. |
|
Memoria insufficiente. |
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 buffer di output di una richiesta riceve informazioni, ad esempio i dati di un disco, che il driver fornisce all'origine della richiesta. Il driver può chiamare WdfRequestRetrieveOutputBuffer per ottenere il buffer di output per una richiesta di lettura o una richiesta di controllo I/O del dispositivo, ma non per una richiesta di scrittura (perché le richieste di scrittura non forniscono dati di output).
Il metodo WdfRequestRetrieveOutputBuffer recupera il buffer di output per le richieste di I/O che usano il metodo I/O memorizzato nel buffer o il metodo I/O diretto per l'accesso ai buffer dei dati. Se il codice di controllo I/O della richiesta è IRP_MJ_INTERNAL_DEVICE_CONTROL o se la richiesta proviene da un altro driver in modalità kernel, WdfRequestRetrieveOutputBuffer supporta anche le richieste di I/O che usano né buffer né I/O diretto.
Se WdfRequestRetrieveOutputBuffer restituisce STATUS_SUCCESS, il driver riceve l'indirizzo e, facoltativamente, le dimensioni del buffer di output.
Il driver può accedere al buffer recuperato finché non completa la richiesta di I/O rappresentata dal parametro Request .
Anziché chiamare WdfRequestRetrieveOutputBuffer, il driver può chiamare WdfRequestRetrieveOutputMemory, che crea un oggetto memoria del framework che rappresenta il buffer.
Per altre informazioni su WdfRequestRetrieveOutputBuffer, vedere Accesso ai buffer di dati in Framework-Based driver.
Esempio
L'esempio di codice seguente fa parte di una funzione di callback EvtIoDeviceControl . Questo esempio ottiene il descrittore di configurazione di un dispositivo USB e inserisce il descrittore nel buffer di output della richiesta di I/O.
VOID
MyEvtIoDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
{
WDFDEVICE device;
PDEVICE_CONTEXT pDevContext;
size_t bytesReturned = 0;
NTSTATUS status;
device = WdfIoQueueGetDevice(Queue);
//
// GetDeviceContext is a driver-defined function
// to retrieve device object context space.
//
pDevContext = GetDeviceContext(device);
switch(IoControlCode) {
case IOCTL_OSRUSBFX2_GET_CONFIG_DESCRIPTOR: {
PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor = NULL;
USHORT requiredSize;
//
// First, get the size of the USB configuration descriptor.
//
status = WdfUsbTargetDeviceRetrieveConfigDescriptor(
pDevContext->UsbDevice,
NULL,
&requiredSize
);
if (status == STATUS_BUFFER_TOO_SMALL) {
break;
}
//
// Get the buffer. Make sure the buffer is big
// enough to hold the configuration descriptor.
//
status = WdfRequestRetrieveOutputBuffer(
Request,
(size_t)requiredSize,
&configurationDescriptor,
NULL
);
if(!NT_SUCCESS(status)){
break;
}
//
// Now get the config descriptor.
//
status = WdfUsbTargetDeviceRetrieveConfigDescriptor(
pDevContext->UsbDevice,
configurationDescriptor,
&requiredSize
);
if (!NT_SUCCESS(status)) {
break;
}
bytesReturned = requiredSize;
}
break;
...
(Other case statements removed.)
...
default:
status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
//
// Complete the request.
//
WdfRequestCompleteWithInformation(
Request,
status,
bytesReturned
);
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 | BufAfterReqCompletedIntIoctl(kmdf), BufAfterReqCompletedIntIoctlA(kmdf), BufAfterReqCompletedIoctl(kmdf), BufAfterReqCompletedIoctlA(kmdf),, BufAfterReqCompletedRead(kmdf), BufAfterReqCompletedReadA(kmdf), BufAfterReqCompletedWrite(kmdf), DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal( kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit( kmdf), OutputBufferAPI(kmdf) |