C30033

peringatan C30033: Alokasi yang dapat dieksekusi terdeteksi dalam driver yang dikompilasi dengan POOL_NX_OPTIN. Driver ini telah ditentukan untuk dimuat pada durasi oleh driver lain. Harap verifikasi bahwa driver pemuatan memanggil ExInitializeDriverRuntime(DrvRtPoolNxOptIn) di DriverEntry-nya.

BANNED_MEM_ALLOCATION_MAYBE_UNSAFE_DRIVER_LOADED

Telah ditentukan bahwa ini adalah DLL yang dimuat oleh driver lain, dan karenanya tidak memiliki fungsi inisialisasi lengkap. Verifikasi bahwa pengandar pemuatan adalah:

  • Dikompilasi menggunakan POOL_NX_OPTIN=1
  • Memanggil ExInitializeDriverRuntime(DrvRtPoolNxOptIn) dalam fungsi inisialisasinya

Jika driver pemuatan menentukan ini dengan benar, maka peringatan dapat diabaikan.

Contoh

Kode berikut di setiap loader DLL berarti Anda harus membuat perubahan (sesuai contoh aman di bawah)

Dalam file sumber

C_DEFINES=$(C_DEFINES)

Di DriverEntry, sebelum alokasi memori terjadi:

NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status;
…
    // No call to ExInitializeDriverRuntime
    return(status)
}

Kode berikut di setiap pemuat DLL berarti Anda dapat mengabaikan peringatan.

Dalam file sumber, tambahkan

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

Di DriverEntry, sebelum alokasi memori terjadi:

NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status;

    ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
…

Contoh #2

Cara kedua untuk memperbaikinya adalah dengan membuat setiap panggilan secara eksplisit mereferensikan memori yang tidak dapat dieksekusi.

Kode berikut menghasilkan peringatan ini.

ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');

Kode berikut menghindari peringatan ini:

ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');