WdfRequestRetrieveOutputBuffer-Funktion (wdfrequest.h)
[Gilt für KMDF und UMDF]
Die WdfRequestRetrieveOutputBuffer Methode ruft den Ausgabepuffer einer E/A-Anforderung ab.
Syntax
NTSTATUS WdfRequestRetrieveOutputBuffer(
[in] WDFREQUEST Request,
[in] size_t MinimumRequiredSize,
[out] PVOID *Buffer,
[out, optional] size_t *Length
);
Parameter
[in] Request
Ein Handle zu einem Framework-Anforderungsobjekt.
[in] MinimumRequiredSize
Die minimale Puffergröße in Bytes, die der Treiber für die Verarbeitung der E/A-Anforderung benötigt.
[out] Buffer
Ein Zeiger auf eine Position, die die Adresse des Puffers empfängt.
[out, optional] Length
Ein Zeiger auf eine Position, die die Größe des Puffers in Byte empfängt. Dieser Parameter ist optional und kann NULL-werden.
Rückgabewert
WdfRequestRetrieveOutputBuffer gibt STATUS_SUCCESS zurück, wenn der Vorgang erfolgreich ist. Andernfalls gibt diese Methode möglicherweise einen der folgenden Werte zurück:
Rückgabecode | Beschreibung |
---|---|
|
Ein Eingabeparameter ist ungültig. |
|
Die Länge des Ausgabepuffers ist null, oder die MinimumRequiredSize Parameter gibt eine Puffergröße an, die größer als die tatsächliche Größe des Puffers ist. |
|
Der Anforderungstyp ist ungültig, oder die Anforderung verwendet weder gepuffert noch direkte E/A-. Weitere Informationen zu unterstützten Methoden für den Zugriff auf Datenpuffer finden Sie im folgenden Abschnitt "Hinweise". |
|
Die Anforderung wurde bereits abgeschlossen. |
|
Es ist nicht genügend Arbeitsspeicher vorhanden. |
Diese Methode kann auch andere NTSTATUS-Wertezurückgeben.
Wenn der Treiber ein ungültiges Objekthandle bereitstellt, tritt eine Fehlerüberprüfung auf.
Bemerkungen
Der Ausgabepuffer einer Anforderung empfängt Informationen, z. B. Daten von einem Datenträger, die der Treiber dem Absender der Anforderung bereitstellt. Ihr Treiber kann WdfRequestRetrieveOutputBuffer- aufrufen, um den Ausgabepuffer für eine Leseanforderung oder eine Geräte-E/A-Steuerelementanforderung abzurufen, aber nicht für eine Schreibanforderung (da Schreibanforderungen keine Ausgabedaten bereitstellen).
Die WdfRequestRetrieveOutputBuffer Methode ruft den Ausgabepuffer für E/A-Anforderungen ab, die die gepufferten E/A--Methode oder die direkte E/A--Methode für den Zugriff auf Datenpuffer verwenden. Wenn der E/A-Steuerungscode der Anforderung IRP_MJ_INTERNAL_DEVICE_CONTROList oder die Anforderung von einem anderen Kernelmodustreiber stammt, unterstützt WdfRequestRetrieveOutputBuffer auch E/A-Anforderungen, die weder gepuffert noch direkte E/A-verwenden.
Wenn WdfRequestRetrieveOutputBuffer STATUS_SUCCESS zurückgibt, empfängt der Treiber die Adresse und optional die Größe des Ausgabepuffers.
Der Treiber kann auf den abgerufenen Puffer zugreifen, bis er die E/A-Anforderung abgeschlossen, die der parameter Request darstellt.
Anstatt WdfRequestRetrieveOutputBufferaufzurufen, kann der Treiber WdfRequestRetrieveOutputMemoryaufrufen, wodurch ein Frameworkspeicherobjekt erstellt wird, das den Puffer darstellt.
Weitere Informationen zu WdfRequestRetrieveOutputBufferfinden Sie unter Zugreifen auf Datenpuffer in Framework-Based Drivers.
Beispiele
Das folgende Codebeispiel ist Teil einer EvtIoDeviceControl Rückruffunktion. In diesem Beispiel wird der Konfigurationsdeskriptor eines USB-Geräts abgerufen und der Deskriptor im Ausgabepuffer der E/A-Anforderung platziert.
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;
}
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Minimale KMDF-Version | 1.0 |
Mindest-UMDF-Version | 2.0 |
Header- | wdfrequest.h (include Wdf.h) |
Library | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL- | <=DISPATCH_LEVEL |
DDI-Complianceregeln | 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)- |