WdfRequestRetrieveInputBuffer-Funktion (wdfrequest.h)

[Gilt für KMDF und UMDF]

Die WdfRequestRetrieveInputBuffer-Methode ruft den Eingabepuffer einer E/A-Anforderung ab.

Syntax

NTSTATUS WdfRequestRetrieveInputBuffer(
  [in]            WDFREQUEST Request,
                  size_t     MinimumRequiredLength,
  [out]           PVOID      *Buffer,
  [out, optional] size_t     *Length
);

Parameter

[in] Request

Ein Handle für ein Frameworkanforderungsobjekt.

MinimumRequiredLength

Die minimale Puffergröße in Bytes, die der Treiber zum Verarbeiten der E/A-Anforderung benötigt.

[out] Buffer

Ein Zeiger auf einen Speicherort, der die Adresse des Puffers empfängt.

[out, optional] Length

Ein Zeiger auf einen Speicherort, der die Größe des Puffers in Bytes empfängt. Dieser Parameter ist optional und kann NULL sein.

Rückgabewert

WdfRequestRetrieveInputBuffer 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
STATUS_INVALID_PARAMETER
Ein Eingabeparameter ist ungültig.
STATUS_BUFFER_TOO_SMALL
Die Länge des Eingabepuffers ist null, oder der Parameter MinimumRequiredSize gibt eine Puffergröße an, die größer als die tatsächliche Größe des Puffers ist.
STATUS_INVALID_DEVICE_REQUEST
Der Anforderungstyp ist ungültig, oder die Anforderung verwendet weder gepufferte noch direkte E/A-Vorgänge. Weitere Informationen zu unterstützten Methoden für den Zugriff auf Datenpuffer finden Sie im folgenden Abschnitt hinweise.
STATUS_INTERNAL_ERROR
Die Anforderung wurde bereits abgeschlossen.
STATUS_INSUFFICIENT_RESOURCES
Es ist nicht genügend Arbeitsspeicher vorhanden.
 

Diese Methode gibt möglicherweise auch andere NTSTATUS-Werte zurück.

Eine Fehlerüberprüfung tritt auf, wenn der Treiber ein ungültiges Objekthandle bereitstellt.

Hinweise

Der Eingabepuffer einer Anforderung enthält Informationen, z. B. Daten, die auf einen Datenträger geschrieben werden sollen, die vom Absender der Anforderung bereitgestellt wurden. Ihr Treiber kann WdfRequestRetrieveInputBuffer aufrufen, um den Eingabepuffer für eine Schreibanforderung oder eine Geräte-E/A-Steuerungsanforderung abzurufen, aber nicht für eine Leseanforderung (da Leseanforderungen keine Eingabedaten bereitstellen).

Die WdfRequestRetrieveInputBuffer-Methode ruft den Eingabepuffer für E/A-Anforderungen ab, die die gepufferte 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_CONTROL ist oder die Anforderung von einem anderen Kernelmodustreiber stammt, unterstützt WdfRequestRetrieveInputBuffer auch E/A-Anforderungen, die weder gepufferte noch direkte E/A verwenden.

Wenn WdfRequestRetrieveInputBuffer STATUS_SUCCESS zurückgibt, erhält der Treiber die Adresse und optional die Größe des Eingabepuffers.

Der Treiber kann auf den abgerufenen Puffer zugreifen, bis er die E/A-Anforderung abgeschlossen hat, die der Request-Parameter darstellt.

Anstatt WdfRequestRetrieveInputBuffer aufzurufen, kann der Treiber WdfRequestRetrieveInputMemory aufrufen, wodurch ein Frameworkspeicherobjekt erstellt wird, das den Puffer darstellt.

Weitere Informationen zu WdfRequestRetrieveInputBuffer finden Sie unter Zugreifen auf Datenpuffer in Framework-Based Treibern.

Beispiele

Das folgende Codebeispiel ist Teil der Rückruffunktion EvtIoDeviceControl des Seriellen Beispieltreibers. Wenn der E/A-Steuerungscode IOCTL_SERIAL_SET_TIMEOUT ist, ruft der Treiber neue Timeoutwerte aus dem Eingabepuffer der E/A-Anforderung ab.

VOID
SerialEvtIoDeviceControl(
    IN WDFQUEUE     Queue,
    IN WDFREQUEST   Request,
    IN size_t       OutputBufferLength,
    IN size_t       InputBufferLength,
    IN ULONG        IoControlCode
    )
{
    PVOID  buffer;
    size_t  bufSize;

    switch (IoControlCode) {
...

        case IOCTL_SERIAL_SET_TIMEOUTS: {

            PSERIAL_TIMEOUTS NewTimeouts;

            Status = WdfRequestRetrieveInputBuffer(
                                                   Request,
                                                   sizeof(SERIAL_TIMEOUTS),
                                                   &buffer,
                                                   &bufSize
                                                   );
            if (!NT_SUCCESS(Status)) {
                break;
            }

            NewTimeouts =(PSERIAL_TIMEOUTS)buffer;
    }
...
}

Anforderungen

Anforderung Wert
Zielplattform Universell
KMDF-Mindestversion 1.0
UMDF-Mindestversion 2.0
Kopfzeile wdfrequest.h (include Wdf.h)
Bibliothek Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI-Complianceregeln BufAfterReqCompletedIntIoctl(kmdf), BufAfterReqCompletedIntIoctlA(kmdf), BufAfterReqCompletedIoctl(kmdf), BufAfterReqCompletedIoctlA(kmdf), BufAfterReqCompletedRead(kmdf), BufAfterReqCompletedWrite(kmdf), BufAfterReqCompletedWriteA(kmdf), DriverCreate(kmdf), InputBufferAPI(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Weitere Informationen

WdfRequestRetrieveInputMemory

WdfRequestRetrieveOutputBuffer

WdfUsbTargetDeviceRetrieveConfigDescriptor