Bagikan melalui


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 mode kernel dapat memanggil rutinitas ini secara langsung. Aplikasi mode pengguna dapat mengakses rutinitas ini dengan menggunakan panggilan sistem.

Dengan beberapa pengecualian, setiap layanan sistem asli rutin 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 bersifat identik. Untuk panggilan dari driver mode kernel, versi Nt dan Zw dari rutinitas berbeda dalam cara mereka menangani nilai parameter yang diteruskan pemanggil 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 menggunakan parameter dengan aman tanpa terlebih dahulu memvalidasinya. Namun, jika parameter mungkin berasal dari sumber mode pengguna atau sumber mode kernel, driver sebaliknya memanggil versi Nt dari rutinitas, yang menentukan, berdasarkan riwayat utas panggilan, apakah parameter berasal dari mode pengguna atau mode kernel. Untuk informasi selengkapnya tentang cara rutin 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 memvalidasi nilai parameter secara menyeluruh sebelum menggunakan parameter. Secara khusus, rutin memeriksa buffer yang disediakan penelepon untuk memverifikasi bahwa buffer terletak di memori mode pengguna yang valid dan selaras dengan benar.

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

Dalam beberapa instans, arti nilai parameter berbeda lebih signifikan antara panggilan dari mode pengguna dan dari mode kernel. Misalnya, rutinitas ZwNotifyChangeKey (atau rekan 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:

PreviousMode

Pustaka dan Header

Apa Arti Awalan Zw?

Menentukan Hak Akses

Rutinitas NtXxx