Mengirim Permintaan I/O Secara Sinkron

Tabel berikut mencantumkan metode objek target I/O yang dapat dipanggil driver Anda untuk mengirim permintaan I/O secara sinkron ke target I/O. Untuk informasi terperinci tentang cara menggunakan metode ini, lihat halaman referensi metode.

Metode Tujuan

WdfIoTargetSendReadSynchronously

Mengirim permintaan baca

WdfIoTargetSendWriteSynchronously

Mengirim permintaan tulis

WdfIoTargetSendIoctlSynchronously

Mengirim permintaan kontrol perangkat

WdfIoTargetSendInternalIoctlSynchronously

Mengirim permintaan kontrol perangkat internal

WdfIoTargetSendInternalIoctlOthersSynchronously

Mengirim permintaan kontrol perangkat internal non-standar

Anda juga dapat mengirim permintaan secara sinkron dengan memanggil WdfRequestSend, tetapi Anda harus memformat permintaan terlebih dahulu dengan mengikuti aturan yang dijelaskan dalam Mengirim Permintaan I/O Secara Asinkron.

Mengirim permintaan I/O ke target I/O secara sinkron lebih mudah diprogram daripada mengirim permintaan I/O secara asinkron. Namun, Anda harus menggunakan panduan berikut untuk membantu Anda memutuskan apakah I/O sinkron sesuai untuk driver Anda:

  • Anda dapat menggunakan I/O sinkron jika driver Anda tidak mengirim banyak permintaan I/O dan jika performa sistem atau perangkat tidak berkurang karena driver Anda menunggu setiap permintaan I/O selesai.

  • Jika driver Anda harus menangani banyak permintaan I/O dalam waktu singkat, Anda mungkin tidak dapat mengizinkan driver Anda menunggu setiap permintaan selesai sebelum mengirim permintaan berikutnya. Jika tidak, driver Anda mungkin kehilangan data atau mengurangi performa perangkatnya (dan, mungkin, seluruh sistem). Dalam kasus seperti itu, I/O asinkron mungkin menjadi pilihan yang lebih baik.

  • I/O sinkron berguna untuk menangani operasi yang harus dimulai dan diselesaikan tanpa aktivitas bersamaan tambahan. Operasi tersebut mungkin termasuk mengatur ulang pipa USB atau membaca daftar perangkat.

  • Sering kali, driver Anda harus menentukan nilai waktu habis ketika memanggil metode objek yang mengirim permintaan I/O secara sinkron. Jika driver Anda tidak menentukan nilai waktu habis, dan jika perangkat atau driver tingkat bawah gagal merespons, driver Anda dapat mengulur waktu. Akibatnya, pengguna dapat mengalami aplikasi yang tidak responsif. Selain itu, driver lain mungkin tidak dapat memperoleh sumber daya sistem, seperti item kerja, jika driver Anda tidak merilisnya.

  • Jika driver di atas dan di bawah milik Anda dalam tumpukan memerlukan operasi untuk dilanjutkan secara sinkron, driver Anda harus menggunakan I/O sinkron. Oleh karena itu, Anda harus mempelajari tentang persyaratan driver lain yang mungkin ada di tumpukan driver.

Contoh berikut menunjukkan cara mengirim permintaan kontrol I/O sinkron (IOCTL):

NTSTATUS                status;
    WDF_MEMORY_DESCRIPTOR   inputDesc, outputDesc;
    PWDF_MEMORY_DESCRIPTOR  pInputDesc = NULL, pOutputDesc = NULL;
    ULONG_PTR               bytesReturned;

    UNREFERENCED_PARAMETER(FileObject);

    if (InputBuffer) {
        WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&inputDesc,
                                    InputBuffer,
                                    InputBufferLength);
        pInputDesc = &inputDesc;
    }

    if (OutputBuffer) {
        WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&outputDesc,
                                    OutputBuffer,
                                    OutputBufferLength);
        pOutputDesc = &outputDesc;
    }

    status = WdfIoTargetSendIoctlSynchronously(
                        IoTarget,
                        WDF_NO_HANDLE, // Request
                        IoctlControlCode,
                        pInputDesc,
                        pOutputDesc,
                        NULL, // PWDF_REQUEST_SEND_OPTIONS
                        &bytesReturned);
    if (!NT_SUCCESS(status)) {
         DEBUGP(MP_ERROR,
        ("WdfIoTargetSendIoctlSynchronously failed 0x%x\n",
          status));
    }

    *BytesReadOrWritten = (ULONG)bytesReturned;