Bagikan melalui


Keikutsertaan Biner Tunggal: POOL_NX_OPTIN

Untuk membangun biner driver tunggal yang berjalan baik di Windows 8 maupun di versi Windows yang lebih lama, gunakan mekanisme keikutsertaan POOL_NX_OPTIN. Ini adalah bantuan porting untuk vendor perangkat keras pihak ketiga yang menyediakan biner driver tunggal untuk mendukung beberapa versi Windows.

Untuk menggunakan mekanisme keikutsertaan ini, lakukan hal berikut:

  • Tentukan POOL_NX_OPTIN = 1 untuk semua file sumber yang ingin Anda ikut sertakan. Untuk melakukan ini, sertakan definisi prapemroses berikut di halaman properti yang sesuai untuk proyek driver Anda:

    C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

  • Dalam rutinitas DriverEntry (atau setara) Anda, sertakan panggilan fungsi berikut:

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    Panggilan ini harus terjadi sebelum driver melakukan alokasi apa pun yang menggunakan jenis kumpulan NonPagedPool atau melakukan panggilan apa pun ke rutinitas ExInitializeNPagedLookasideList . ExInitializeDriverRuntime adalah fungsi sebaris paksa dan dapat dipanggil pada versi Windows Windows 8 atau yang lebih baru.

Untuk sebagian besar driver, kedua tugas ini cukup untuk mengaktifkan mekanisme keikutsertaan untuk biner driver tunggal.

Detail implementasi

POOL_NX_OPTIN bekerja dengan mengganti NonPagedPool dengan variabel POOL_TYPE global, ExDefaultNonPagedPoolType, yang diinisialisasi baik ke NonPagedPoolNx (untuk versi Windows Windows 8 dan yang lebih baru) atau ke NonPagedPoolExecute (untuk versi Windows sebelumnya). Mekanisme keikutsertaan ini memungkinkan driver mode kernel Anda berjalan baik pada Windows 8, dengan perlindungan kumpulan NX yang ditingkatkan, dan pada versi Windows yang lebih lama, yang tidak mendukung kumpulan NX. Makro yang mengonversi instans nama konstanta NonPagedPool menjadi NonPagedPoolNx juga mengonversi instans NonPagedPoolCacheAligned ke NonPagedPoolNxCacheAligned.

Dukungan untuk pustaka statis (proyek.lib)

Anda dapat menggunakan mekanisme keikutsertaan POOL_NX_OPTIN untuk proyek .lib, tetapi proyek yang ditautkan ke .lib umumnya juga harus menggunakan POOL_NX_OPTIN. Minimal, proyek yang mengimplementasikan rutinitas DriverEntry harus berisi panggilan fungsi berikut:

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);