Menggunakan Versi Nt dan Zw dari Rutinitas Layanan Sistem Asli

Api layanan sistem operasi asli Windows diimplementasikan sebagai serangkaian rutinitas yang berjalan dalam mode kernel. Rutinitas ini memiliki nama yang dimulai dengan awalan Nt atau Zw. Driver kernel-mode dapat memanggil rutinitas ini secara langsung. Aplikasi mode pengguna dapat mengakses rutinitas ini dengan menggunakan panggilan sistem.

Dengan beberapa pengecualian, setiap rutinitas layanan sistem asli memiliki dua versi yang sedikit berbeda yang memiliki nama yang sama tetapi awalan yang berbeda. Misalnya, panggilan ke NtCreateFile dan ZwCreateFile melakukan operasi serupa dan, pada kenyataannya, dilayani oleh rutinitas sistem mode kernel yang sama. Untuk panggilan sistem dari mode pengguna, versi Nt dan Zw dari rutinitas berperilaku identik. Untuk panggilan dari driver mode kernel, versi Nt dan Zw dari rutinitas berbeda dalam cara mereka menangani nilai parameter yang diteruskan penelepon ke rutinitas.

Driver mode kernel memanggil versi Zw dari rutinitas layanan sistem asli untuk menginformasikan rutinitas bahwa parameter berasal dari sumber mode kernel tepercaya. Dalam hal ini, rutinitas mengasumsikan bahwa ia dapat dengan aman menggunakan parameter tanpa terlebih dahulu memvalidasinya. Namun, jika parameter mungkin berasal dari sumber mode pengguna atau sumber mode kernel, driver malah memanggil versi Nt dari rutinitas, yang menentukan, berdasarkan riwayat utas panggilan, apakah parameter berasal dari mode pengguna atau mode kernel. Untuk informasi selengkapnya tentang bagaimana rutinitas membedakan parameter mode pengguna dari parameter mode kernel, lihat PreviousMode.

Ketika aplikasi mode pengguna memanggil versi Nt atau Zw dari rutinitas layanan sistem asli, rutinitas selalu memperlakukan parameter yang diterimanya sebagai nilai yang berasal dari sumber mode pengguna yang tidak tepercaya. Rutinitas ini benar-benar memvalidasi nilai parameter sebelum menggunakan parameter. Secara khusus, rutinitas menyelidiki buffer yang disediakan penelepon untuk memverifikasi bahwa buffer terletak dalam memori mode pengguna yang valid dan disejajarkan dengan benar.

Rutinitas layanan sistem asli membuat asumsi tambahan tentang parameter yang mereka terima. Jika rutinitas menerima pointer ke buffer yang dialokasikan oleh driver kernel-mode, rutinitas mengasumsikan bahwa buffer dialokasikan dalam memori sistem, bukan dalam memori mode pengguna. Jika rutinitas menerima pegangan yang dibuka oleh aplikasi mode pengguna, rutinitas mencari pegangan di tabel pegangan mode pengguna, bukan di tabel pegangan mode kernel.

Dalam beberapa kasus, arti nilai parameter berbeda lebih signifikan antara panggilan dari mode pengguna dan dari mode kernel. Misalnya, rutinitas ZwNotifyChangeKey (atau mitra NtNotifyChangeKey-nya ) memiliki sepasang parameter input, ApcRoutine dan ApcContext, yang berarti hal yang berbeda, tergantung pada apakah parameter berasal dari mode pengguna atau sumber mode kernel. Untuk panggilan dari mode pengguna, ApcRoutine menunjuk ke rutinitas APC dan ApcContext menunjuk ke nilai konteks yang disediakan sistem operasi saat memanggil rutinitas APC. Untuk panggilan dari mode kernel, ApcRoutine menunjuk ke struktur WORK_QUEUE_ITEM , dan ApcContext menentukan jenis item antrean kerja yang dijelaskan oleh struktur WORK_QUEUE_ITEM .

Bagian ini mencakup topik-topik berikut:

SebelumnyaMode

Pustaka dan Header

Apa Arti Awalan Zw?

Menentukan Hak Akses

Rutinitas NtXxx