Bagikan melalui


KDEFERRED_ROUTINE fungsi panggilan balik (wdm.h)

Rutinitas panggilan balik melakukan tindakan, setelah InterruptService kembali, dari DPC utas,

Rutinitas CustomDpc menyelesaikan layanan operasi I/O, setelah rutinitas InterruptService kembali.

Rutinitas CustomThreadedDpc melakukan tindakan DPC utas. Sistem menjalankan rutinitas ini ketika DPC utas berjalan.

Rutinitas CustomTimerDpc dijalankan setelah interval waktu objek timer kedaluwarsa.

Sintaks

KDEFERRED_ROUTINE KdeferredRoutine;

void KdeferredRoutine(
  [in]           _KDPC *Dpc,
  [in, optional] PVOID DeferredContext,
  [in, optional] PVOID SystemArgument1,
  [in, optional] PVOID SystemArgument2
)
{...}

Parameter

[in] Dpc

Penunjuk yang disediakan penelepon ke struktur KDPC , yang mewakili objek DPC yang terkait dengan rutinitas panggilan balik ini.

[in, optional] DeferredContext

Untuk CustomDpc, penunjuk yang disediakan penelepon ke informasi konteks yang ditentukan driver yang ditentukan dalam panggilan sebelumnya ke KeInitializeDpc.

Untuk CustomThreadedDpc, menentukan informasi konteks yang ditentukan driver. Ketika menginisialisasi objek DPC, driver menyediakan nilai ini sebagai parameter DeferredContext ke KeInitializeThreadedDpc.

Penunjuk yang disediakan penelepon ke struktur KDPC , yang mewakili objek DPC yang terkait dengan rutinitas CustomTimerDpc ini.

[in, optional] SystemArgument1

Penunjuk yang disediakan penelepon ke informasi yang disediakan driver yang ditentukan dalam panggilan sebelumnya ke KeInsertQueueDpc. Ketika menambahkan DPC ke antrean DPC, driver menyediakan nilai ini sebagai parameter SystemArgument1 ke KeInsertQueueDpc.

Untuk CustomTimerDpc, nilai ini tidak digunakan.

[in, optional] SystemArgument2

Menentukan informasi konteks yang ditentukan driver. Ketika menambahkan DPC ke antrean DPC, driver menyediakan nilai ini sebagai parameter SystemArgument2 ke KeInsertQueueDpc.

Untuk CustomTimerDpc, nilai ini tidak digunakan.

Mengembalikan nilai

Tidak ada

Keterangan

Untuk membuat objek DPC dan mendaftarkan rutinitas CustomDpc untuk objek tersebut, driver harus memanggil KeInitializeDpc. (Jika Anda hanya memerlukan satu rutinitas DPC, Anda dapat menggunakan rutinitas DpcForIsr dan objek DPC yang dialokasikan sistem.)

Untuk mengantrekan rutinitas CustomDpc untuk eksekusi, rutinitas InterruptService driver harus memanggil KeInsertQueueDpc.

Satu atau beberapa rutinitas CustomDpc dapat digunakan alih-alih, atau bersama dengan, rutinitas DpcForIsr . Driver yang mempertahankan beberapa antrean IRP internal biasanya memasok rutinitas CustomDpc untuk setiap antrean. Setiap rutinitas CustomDpc biasanya bertanggung jawab atas setidaknya tugas-tugas berikut:

  • Menyelesaikan operasi I/O yang dijelaskan oleh IRP saat ini.

  • Menghapus antrean IRP berikutnya dari salah satu antrean IRP driver. (Driver yang menggunakan antrean IRP yang disediakan sistem bersama dengan panggilan rutin StartIoIoStartNextPacket.)

  • Mengatur blok status I/O di IRP saat ini dan memanggil IoCompleteRequest untuk permintaan yang telah selesai.

Rutinitas CustomDpc mungkin juga mencoba kembali operasi yang gagal atau menyiapkan transfer berikutnya untuk permintaan I/O besar yang telah dipecah menjadi bagian yang lebih kecil.

Untuk informasi selengkapnya tentang rutinitas CustomDpc , lihat Objek DPC dan DPC.

Driver mendaftarkan CustomThreadedDpc untuk objek DPC dengan memanggil KeInitializeThreadedDpc. Untuk benar-benar menambahkan DPC ke antrean DPC sehingga rutinitas CustomThreadedDpc akan dijalankan, panggil KeInsertQueueDpc.

Untuk informasi selengkapnya tentang menggunakan rutinitas CustomThreadedDpc , lihat Pengantar DPC Utas.

Rutinitas CustomThreadedDpc dapat berjalan pada IRQL = DISPATCH_LEVEL, atau dapat berjalan di IRQL = PASSIVE_LEVEL dalam utas real-time.

Untuk membuat objek DPC dan mendaftarkan rutinitas CustomTimerDpc untuk objek tersebut, driver harus memanggil KeInitializeDpc.

Untuk mengantrekan rutinitas CustomTimerDpc untuk eksekusi, rutinitas driver harus memanggil KeSetTimer atau KeSetTimerEx, menyediakan penunjuk objek DPC yang dikembalikan oleh KeInitializeDpc. Sistem memanggil rutinitas CustomTimerDpc saat interval timer kedaluwarsa.

Untuk informasi selengkapnya tentang rutinitas CustomTimerDpc , lihat Objek Timer dan DPC.

Contoh

Untuk menentukan rutinitas panggilan balik, Anda harus terlebih dahulu memberikan deklarasi fungsi yang mengidentifikasi jenis rutinitas panggilan balik yang Anda tentukan. Windows menyediakan sekumpulan tipe fungsi panggilan balik untuk driver. 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.

Misalnya, untuk menentukan rutinitas panggilan balik CustomDpc yang diberi nama MyCustomDpc, gunakan jenis KDEFERRED_ROUTINE seperti yang ditunjukkan dalam contoh kode ini:

KDEFERRED_ROUTINE MyCustomDpc;

Kemudian, terapkan rutinitas panggilan balik Anda sebagai berikut:

_Use_decl_annotations_
VOID
  MyCustomDpc(
    struct _KDPC  *Dpc,
    PVOID  DeferredContext,
    PVOID  SystemArgument1,
    PVOID  SystemArgument2
    )
  {
      // Function body
  }

Persyaratan

Persyaratan Nilai
Target Platform Desktop
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h)
IRQL Dipanggil di DISPATCH_LEVEL.

Lihat juga

KeInsertQueueDpc

KeSetTimer

KeSetTimerEx