IWDFIoQueue::RetrieveNextRequest method (wudfddi.h)

[Peringatan: UMDF 2 adalah versi terbaru UMDF dan pengganti UMDF 1. Semua driver UMDF baru harus ditulis menggunakan UMDF 2. Tidak ada fitur baru yang ditambahkan ke UMDF 1 dan ada dukungan terbatas untuk UMDF 1 pada versi Windows 10 yang lebih baru. Driver Universal Windows harus menggunakan UMDF 2. Untuk informasi selengkapnya, lihat Mulai menggunakan UMDF.]

Metode RetrieveNextRequest mengambil permintaan I/O berikutnya dari antrean I/O.

Sintaks

HRESULT RetrieveNextRequest(
  [out] IWDFIoRequest **ppRequest
);

Parameter

[out] ppRequest

Penunjuk ke buffer yang menerima penunjuk ke antarmuka IWDFIoRequest untuk objek permintaan berikutnya, atau menerima NULL jika antrean kosong atau jika permintaan berikutnya tidak ditemukan.

Nilai kembali

RetrieveNextRequest mengembalikan salah satu nilai berikut:

Menampilkan kode Deskripsi
S_OK
Permintaan I/O berikutnya berhasil diambil dari antrean I/O.
HRESULT_FROM_NT (STATUS_WDF_PAUSED)
Antrean tidak mengirimkan permintaan. Situasi ini terjadi jika perangkat mengalami transisi status daya dan semua antrean dihentikan dari permintaan pengiriman atau jika driver secara eksplisit disebut IWDFIoQueue::Stop untuk menghentikan pengiriman permintaan. Situasi ini juga dapat terjadi jika driver mencoba menghapus permintaan dari antrean manual yang dikelola daya dan yang dimatikan atau jika antrean dijeda.
HRESULT_FROM_WIN32 (ERROR_NO_MORE_ITEMS)
Tidak ada permintaan dalam antrean.
HRESULT_FROM_NT (STATUS_INVALID_DEVICE_STATE)
Panggilan dilakukan untuk mengambil permintaan dari antrean paralel.
 

RetrieveNextRequest mungkin juga mengembalikan nilai HRESULT lainnya.

Keterangan

Jika driver mengonfigurasi antrean I/O untuk pengiriman manual permintaan I/O, driver dapat memanggil metode RetrieveNextRequest untuk mendapatkan permintaan berikutnya dari antrean. Untuk informasi selengkapnya tentang mengirimkan permintaan I/O secara manual, lihat Mengonfigurasi Mode Pengiriman untuk Antrean I/O.

Jika driver mengonfigurasi antrean I/O untuk pengiriman permintaan I/O berurutan, driver masih dapat memanggil metode RetrieveNextRequest untuk mendapatkan permintaan berikutnya dari antrean tanpa menerima kesalahan. Meskipun kerangka kerja mengizinkan driver untuk memanggil RetrieveNextRequest untuk mengambil permintaan dari antrean berurutan, driver hanya boleh memanggil RetrieveNextRequest sebelum driver menyelesaikan permintaan saat ini. Jika tidak, jika pembalap mencoba memanggil RetrieveNextRequest setelah pembalap menyelesaikan permintaan saat ini, kondisi balapan mungkin terjadi. Kondisi balapan ini terjadi antara pengiriman otomatis kerangka kerja permintaan berikutnya dari antrean berurutan dan panggilan driver ke RetrieveNextRequest untuk mengambil permintaan berikutnya.

Contoh

Contoh kode berikut, yang berasal dari driver sampel umdf_fx2 , melakukan polling antrean untuk permintaan selama permintaan dapat diambil. Kode pertama-tama memverifikasi apakah permintaan dikaitkan dengan objek file tertentu.

VOID
CMyDevice::ServiceSwitchChangeQueue(
    __in SWITCH_STATE NewState,
    __in HRESULT CompletionStatus,
    __in_opt IWDFFile *SpecificFile
    )
{
    IWDFIoRequest *fxRequest;
    HRESULT enumHr = S_OK;
    do {
        HRESULT hr;
        //
        // Get the next request.
        //
        if (NULL != SpecificFile) {
        enumHr = m_SwitchChangeQueue->RetrieveNextRequestByFileObject(
                                        SpecificFile,
                                        &fxRequest
                                        );
        }
        else {
            enumHr = m_SwitchChangeQueue->RetrieveNextRequest(&fxRequest);
        }
        //
        // If a request was retrieved, complete it.
        //
        if (S_OK == enumHr) {
            if (S_OK == CompletionStatus) {
                IWDFMemory *fxMemory;
                //
                // Copy the result to the request buffer.
                //
                fxRequest->GetOutputMemory(&fxMemory);
                hr = fxMemory->CopyFromBuffer(0, 
                                              &NewState, 
                                              sizeof(SWITCH_STATE));
                                              fxMemory->Release();
            }
            else {
                 hr = CompletionStatus;
            }
            //
            // Complete the request with the copy or 
            // completion status.
            //
            if (S_OK == hr) {
                fxRequest->CompleteWithInformation(hr, 
                                                   sizeof(SWITCH_STATE));
            }
            else {
                fxRequest->Complete(hr);
            }
            fxRequest->Release();
        }
    }
    while (S_OK == enumHr);
}

Persyaratan

Persyaratan Nilai
Akhir dukungan Tidak tersedia di UMDF 2.0 dan yang lebih baru.
Target Platform Desktop
Versi UMDF minimum 1,5
Header wudfddi.h (termasuk Wudfddi.h)
DLL WUDFx.dll

Lihat juga

IWDFIoQueue

IWDFIoQueue::Stop

IWDFIoRequest