EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE fungsi panggilan balik (wdfio.h)

[Berlaku untuk KMDF dan UMDF]

Fungsi panggilan balik peristiwa EvtIoCanceledOnQueue driver memberi tahu driver bahwa ia harus menyelesaikan permintaan I/O bahwa kerangka kerja telah dihapus dari antrean I/O.

Sintaks

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtWdfIoQueueIoCanceledOnQueue;

void EvtWdfIoQueueIoCanceledOnQueue(
  [in] WDFQUEUE Queue,
  [in] WDFREQUEST Request
)
{...}

Parameter

[in] Queue

Handel ke objek antrean I/O.

[in] Request

Handel ke objek permintaan.

Nilai kembali

Tidak ada

Keterangan

Driver mendaftarkan fungsi panggilan balik EvtIoCanceledOnQueue saat memanggil metode WdfIoQueueCreate . Untuk informasi selengkapnya tentang memanggil WdfIoQueueCreate, lihat Membuat Antrean I/O.

Jika driver mendaftarkan fungsi panggilan balik EvtIoCanceledOnQueue untuk antrean I/O, kerangka kerja memanggil fungsi panggilan balik dalam situasi berikut:

Setelah kerangka kerja memanggil fungsi panggilan balik EvtIoCanceledOnQueue , driver memiliki objek permintaan dan harus menyelesaikan permintaan dengan kode status yang sesuai, baik di EvtIoCanceledOnQueue atau yang lebih baru. Ketika kerangka kerja memanggil EvtIoCanceledOnQueue, permintaan masih terkait dengan antrean I/O, tetapi driver tidak dapat mengantre ulang permintaan. Kepemilikan permintaan tetap ada pada driver meskipun driver tidak menyelesaikan permintaan di EvtIoCanceledOnQueue. Jika driver menyelesaikan permintaan setelah EvtIoCanceledOnQueue kembali, driver tidak dapat memanggil WdfIoQueueFindRequest dan WdfIoQueueRetrieveFoundRequest untuk memperoleh kembali kepemilikan permintaan karena driver sudah memiliki kepemilikan permintaan.

Biasanya, di EvtIoCanceledOnQueue, driver menyelesaikan permintaan I/O dengan status penyelesaian STATUS_CANCELLED.

Dalam beberapa kasus, driver mungkin sebelumnya telah mengantrekan ulang permintaan I/O ke antrean manual, mungkin menunggu informasi. Misalnya, di salah satu penangan permintaannya, driver mungkin menempatkan permintaan I/O yang terkait dengan transaksi DMA yang tertunda dalam antrean manual. Dalam hal ini, driver mencoba membatalkan transaksi DMA dalam panggilan balik EvtIoCanceledOnQueue - nya. Bergantung pada hasil operasi pembatalan, driver menyelesaikan permintaan dengan status yang sesuai, baik di EvtIoCanceledOnQueue atau yang lebih baru.

Kerangka kerja tidak memanggil fungsi panggilan balik EvtIoCanceledOnQueue driver untuk permintaan I/O yang belum pernah dikirimkan kerangka kerja ke driver.

Kerangka kerja memanggil fungsi panggilan balik EvtIoCanceledOnQueue segera setelah menentukan bahwa permintaan I/O telah dibatalkan, terlepas dari metode pengiriman yang telah ditetapkan driver untuk antrean I/O. Oleh karena itu, kerangka kerja dapat memanggil fungsi panggilan balik EvtIoCanceledOnQueue untuk:

  • Permintaan dalam antrean yang menggunakan pengiriman berurutan, bahkan jika driver saat ini memiliki permintaan lain dari antrean.
  • Permintaan dalam antrean di mana driver telah menetapkan NumberOfPresentedRequests, bahkan jika driver saat ini memiliki jumlah permintaan maksimum.
Untuk informasi selengkapnya tentang fungsi panggilan balik EvtIoCanceledOnQueue , lihat Membatalkan Permintaan I/O.

Fungsi panggilan balik EvtIoCanceledOnQueue dapat dipanggil di IRQL <= DISPATCH_LEVEL, kecuali anggota ExecutionLevel dari perangkat atau struktur WDF_OBJECT_ATTRIBUTES driver diatur ke WdfExecutionLevelPassive.

Jika IRQL PASSIVE_LEVEL, kerangka kerja memanggil fungsi panggilan balik dalam wilayah penting.

Contoh

Untuk menentukan fungsi panggilan balik EvtIoCanceledOnQueue , Anda harus terlebih dahulu memberikan deklarasi fungsi yang mengidentifikasi jenis fungsi panggilan balik yang Anda tentukan. Windows menyediakan sekumpulan tipe fungsi panggilan balik untuk pengandar. Mendeklarasikan fungsi menggunakan jenis fungsi panggilan balik membantu Analisis Kode untuk Driver, Pemverifikasi Driver Statis (SDV), dan alat verifikasi lainnya menemukan kesalahan, dan itu adalah persyaratan untuk menulis driver untuk sistem operasi Windows.

Untuk menentukan fungsi panggilan balik EvtIoCanceledOnQueue , Anda harus terlebih dahulu memberikan deklarasi fungsi yang diperlukan SDV dan alat verifikasi lainnya. Contoh berikut diambil dari sampel Driver Kartu Pintar PCMCIA .

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE PscrEvtIoCanceledOnQueue;

Dalam sampel Driver Kartu Pintar PCMCIA , driver menggunakan antrean manual untuk menyimpan permintaan pemberitahuan kartu pintar yang tertunda. Driver menyediakan fungsi panggilan balik EvtIoCanceledOnQueue di mana driver menghapus bidang pemberitahuan dan menyelesaikan permintaan.

_Use_decl_annotations_
VOID
PscrEvtIoCanceledOnQueue(
    WDFQUEUE  Queue,
    WDFREQUEST  Request
    )

{
    PDEVICE_EXTENSION DeviceExtension;
    PSMARTCARD_EXTENSION smartcardExtension;

    DeviceExtension = GetDeviceExtension(WdfIoQueueGetDevice(Queue));
    smartcardExtension = (PSMARTCARD_EXTENSION) &DeviceExtension->SmartcardExtension;

    //KdPrint(("Cancelled on queue 0x%x\n", WdfRequestWdmGetIrp(Request)));

    InterlockedExchangePointer(
                             &(smartcardExtension->OsData->NotificationIrp),
                             NULL
                             );

    WdfRequestComplete(Request, STATUS_CANCELLED);
}

Jenis fungsi EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE ditentukan dalam file header Wdfio.h. Untuk mengidentifikasi kesalahan secara lebih akurat saat Anda menjalankan alat analisis kode, pastikan untuk menambahkan anotasi Use_decl_annotations ke definisi fungsi Anda. Anotasi Use_decl_annotations memastikan bahwa anotasi yang diterapkan ke jenis fungsi EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE dalam file header digunakan. Untuk informasi selengkapnya tentang persyaratan untuk deklarasi fungsi, lihat Mendeklarasikan Fungsi dengan Menggunakan Jenis Peran Fungsi untuk Driver KMDF. Untuk informasi tentang Use_decl_annotations, lihat Perilaku Fungsi Anotasi.

Persyaratan

Persyaratan Nilai
Target Platform Universal
Versi KMDF minimum 1,0
Versi UMDF minimum 2.0
Header wdfio.h (termasuk Wdf.h)
IRQL <= DISPATCH_LEVEL (lihat bagian Keterangan)

Lihat juga

WdfIoQueueCreate

WdfRequestForwardToIoQueue