Bagikan melalui


Mendaftar dan Mengantrekan Prosedur CustomTimerDpc

Driver dapat mendaftarkan rutinitas CustomTimerDpc dengan memanggil rutinitas berikut, biasanya dari rutinitas AddDevice-nya :

  1. KeInitializeDpc untuk mendaftarkan rutinitasnya

  2. KeInitializeTimer atau KeInitializeTimerEx untuk menyiapkan objek timer

Selanjutnya, driver dapat memanggil KeSetTimer atau KeSetTimerEx untuk menentukan waktu kedaluwarsa dan untuk menambahkan objek timer ke antrean timer sistem. Ketika waktu kedaluwarsa tercapai, sistem menghapus antrean objek timer dan memanggil rutinitas CustomTimerDpc . Gambar berikut mengilustrasikan panggilan ini.

diagram yang mengilustrasikan menggunakan timer dan objek dpc untuk rutinitas customtimerdpc.

Seperti yang ditunjukkan oleh gambar sebelumnya, driver harus menyediakan penyimpanan untuk objek DPC dan objek timer. Sebagian besar driver menyediakan penyimpanan untuk objek ini dalam ekstensi perangkat atau di memori residen yang dialokasikan driver lainnya.

Dalam panggilan ke KeSetTimer, driver meneruskan pointer ke objek Dpc dan Timer , bersama dengan DueTime yang dinyatakan dalam unit 100 nanodetik, seperti yang ditunjukkan pada gambar sebelumnya. Nilai positif untuk DueTime menentukan waktu kedaluwarsa absolut (sejak 1 Januari 1601) di mana rutinitas CustomTimerDpc harus dipanggil. Nilai negatif untuk DueTime menentukan waktu kedaluwarsa relatif.

Karena timer absolut kedaluwarsa pada waktu sistem tertentu, durasi tunggu timer absolut tidak terpengaruh jika waktu sistem berubah sebelum timer kedaluwarsa. Di sisi lain, timer relatif selalu kedaluwarsa setelah jumlah unit waktu yang ditentukan berlalu, terlepas dari perubahan pada waktu sistem absolut.

Untuk memanggil rutinitas CustomTimerDpc berulang kali, gunakan KeSetTimerEx untuk mengatur timer dan menentukan interval berulang dalam parameter Periode . KeSetTimerEx sama seperti KeSetTimer kecuali untuk parameter tambahan ini.

Seperti yang ditunjukkan pada gambar sebelumnya, panggilan ke KeSetTimer atau KeSetTimerEx mengantrekan objek timer untuk interval yang ditentukan sebagai berikut:

  1. Ketika DueTime kedaluwarsa, objek timer dikeluarkan dari antrian dan diatur ke status Tersinyal.

  2. Jika setiap prosesor di komputer saat ini menjalankan kode pada IRQL yang lebih besar dari atau sama dengan DISPATCH_LEVEL, objek DPC yang terkait dengan objek timer dimasukkan ke dalam antrean DPC. Jika tidak, rutinitas CustomTimerDpc dipanggil.

  3. Jika objek DPC sudah berada dalam antrean ketika interval DueTime kedaluwarsa, rutinitas CustomTimerDpc dipanggil segera setelah IRQL pada prosesor apa pun di komputer berada di bawah DISPATCH_LEVEL.

    Nota

    Rutinitas CustomTimerDpc , seperti semua rutinitas DPC, dipanggil di IRQL = DISPATCH_LEVEL. Sementara rutinitas DPC berjalan, semua utas dicegah untuk berjalan di prosesor yang sama. Pengembang driver harus dengan hati-hati merancang rutinitas CustomTimerDpc mereka untuk berjalan sesingkat mungkin.

Interval waktu terkecil yang dapat ditentukan ke KeSetTimer dan KeSetTimerEx adalah sekitar sepuluh milidetik, sehingga driver dapat menggunakan rutinitas CustomTimerDpc saat mengatur waktu interval yang lebih kecil daripada rutinitas IoTimer , yang dijalankan sekali per detik, dapat menangani.

Hanya satu instansiasi objek timer tertentu yang dapat diantrekan kapan saja. Memanggil KeSetTimer atau KeSetTimerEx lagi dengan penunjuk objek Timer yang sama membatalkan objek timer antrean dan mengatur ulang.

Menyiapkan rutinitas CustomTimerDpc persis seperti menyiapkan rutinitas CustomDpc , dengan langkah tambahan untuk menginisialisasi objek timer. Bahkan, prototipe mereka identik, tetapi rutinitas CustomTimerDpc tidak dapat menggunakan dua pointer SystemArgument yang dinyatakan dalam prototipenya.