Bagikan melalui


Fungsi WdfRequestRetrieveOutputBuffer (wdfrequest.h)

[Berlaku untuk KMDF dan UMDF]

Metode WdfRequestRetrieveOutputBuffer mengambil buffer output permintaan I/O.

Sintaks

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

Parameter

[in] Request

Handel ke objek permintaan kerangka kerja.

[in] MinimumRequiredSize

Ukuran buffer minimum, dalam byte, yang dibutuhkan driver untuk memproses permintaan I/O.

[out] Buffer

Penunjuk ke lokasi yang menerima alamat buffer.

[out, optional] Length

Penunjuk ke lokasi yang menerima ukuran buffer, dalam byte. Parameter ini bersifat opsional dan dapat berupa NULL.

Nilai kembali

WdfRequestRetrieveOutputBuffer mengembalikan STATUS_SUCCESS jika operasi berhasil. Jika tidak, metode ini mungkin mengembalikan salah satu nilai berikut:

Menampilkan kode Deskripsi
STATUS_INVALID_PARAMETER
Parameter input tidak valid.
STATUS_BUFFER_TOO_SMALL
Panjang buffer output adalah nol, atau parameter MinimumRequiredSize menentukan ukuran buffer yang lebih besar dari ukuran aktual buffer.
STATUS_INVALID_DEVICE_REQUEST
Jenis permintaan tidak valid atau permintaan tidak menggunakan buffer atau I/O langsung. Untuk informasi selengkapnya tentang metode yang didukung untuk mengakses buffer data, lihat bagian Keterangan berikut ini.
STATUS_INTERNAL_ERROR
Permintaan telah selesai.
STATUS_INSUFFICIENT_RESOURCES
Memori tidak cukup.
 

Metode ini mungkin juga mengembalikan nilai NTSTATUS lainnya.

Pemeriksaan bug terjadi jika driver menyediakan handel objek yang tidak valid.

Keterangan

Buffer output permintaan menerima informasi, seperti data dari disk, yang disediakan driver kepada penolong permintaan. Driver Anda dapat memanggil WdfRequestRetrieveOutputBuffer untuk mendapatkan buffer output untuk permintaan baca atau permintaan kontrol I/O perangkat, tetapi tidak untuk permintaan tulis (karena permintaan tulis tidak menyediakan data output).

Metode WdfRequestRetrieveOutputBuffer mengambil buffer output untuk permintaan I/O yang menggunakan metode I/O yang di-buffer atau metode I/O langsung untuk mengakses buffer data. Jika kode kontrol I/O permintaan IRP_MJ_INTERNAL_DEVICE_CONTROL, atau jika permintaan berasal dari driver mode kernel lain, WdfRequestRetrieveOutputBuffer juga mendukung permintaan I/O yang tidak menggunakan buffer atau I/O langsung.

Jika WdfRequestRetrieveOutputBuffer mengembalikan STATUS_SUCCESS, driver menerima alamat dan, secara opsional, ukuran buffer output.

Driver dapat mengakses buffer yang diambil sampai menyelesaikan permintaan I/O yang diwakili parameter Permintaan .

Alih-alih memanggil WdfRequestRetrieveOutputBuffer, driver dapat memanggil WdfRequestRetrieveOutputMemory, yang membuat objek memori kerangka kerja yang mewakili buffer.

Untuk informasi selengkapnya tentang WdfRequestRetrieveOutputBuffer, lihat Mengakses Buffer Data di driver Framework-Based.

Contoh

Contoh kode berikut adalah bagian dari fungsi panggilan balik EvtIoDeviceControl . Contoh ini mendapatkan deskriptor konfigurasi perangkat USB dan menempatkan deskriptor di buffer output permintaan 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;
}

Persyaratan

Persyaratan Nilai
Target Platform Universal
Versi KMDF minimum 1,0
Versi UMDF minimum 2.0
Header wdfrequest.h (termasuk Wdf.h)
Pustaka Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Aturan kepatuhan 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)

Lihat juga

WdfRequestRetrieveInputBuffer

WdfRequestRetrieveOutputMemory