Peringatan C30030

Memanggil fungsi alokasi memori dan meneruskan parameter yang menunjukkan memori yang dapat dieksekusi

Beberapa API memiliki parameter yang mengonfigurasi apakah memori dapat dieksekusi atau tidak. Kesalahan ini menunjukkan bahwa parameter digunakan yang mengakibatkan NonPagedPool yang dapat dieksekusi dialokasikan.

Keterangan

Anda harus menggunakan salah satu opsi yang tersedia untuk meminta memori yang tidak dapat dieksekusi. Daftar semua fungsi dan bendera terlarang yang dicakup oleh kesalahan ini dan penggantian yang direkomendasikan dapat ditemukan di bagian bawah halaman ini.

Nama analisis kose: BANNED_MEM_ALLOCATION_UNSAFE

Untuk cacat yang melibatkan jenis parameter MM_PAGE_PRIORITY dan POOL_TYPE

Gunakan salah satu opsi berikut ini:

  • Tentukan definisi pra-prosesor POOL_NX_OPTIN_AUTO di pengaturan sumber/proyek.
  • Tentukan definisi pra-prosesor POOL_NX_OPTIN dalam pengaturan sumber/proyek dan panggil ExInitializeDriverRuntime(DrvRtPoolNxOptIn) dari fungsi inisialisasi driver (DriverEntry atau DllInitialize).

Catatan Pilihan apakah akan menggunakan POOL_NX_OPTIN_AUTO atau POOL_NX_OPTIN sebagian besar tergantung pada platform mana yang Anda targetkan dan berapa banyak biner yang Anda buat. Kedua opsi ini mengakibatkan kedua jenis ini diubah untuk Anda (baik oleh pengkompilasi atau pada durasi) ke setara NX mereka. Lihat tautan topik untuk informasi selengkapnya.

Catatan Anda mungkin melihat peringatan positif palsu jika salah satu kondisi berikut ini benar:

  • Fungsi inisialisasi driver memanggil fungsi lain yang memanggil ExInitializeDriverRuntime(DrvRtPoolNxOptIn)
  • Anda membuat DRIVER_LIBRARY dan telah menentukan POOL_NX_OPTIN tetapi tidak memiliki fungsi inisialisasi.
  • Ubah jenis alokasi menjadi jenis yang tidak dapat dieksekusi.

Contoh (POOL_NX_OPTIN_AUTO):

Pengaturan berikut dalam file sumber akan memungkinkan peringatan jika parameter yang dapat dieksekusi disediakan dalam panggilan API:

C_DEFINES=$(C_DEFINES)

Pengaturan berikut dalam file sumber menghindari peringatan:

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN_AUTO=1

Contoh (POOL_NX_OPTIN):

Kode berikut dalam file sumber menghasilkan peringatan:

C_DEFINES=$(C_DEFINES)

Kode berikut dalam file sumber menghindari peringatan:

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 (Ubah jenis alokasi):

Untuk jenis MM_PAGE_PRIORITY Anda dapat memperbaikinya dengan menambahkan bendera MdlMappingNoExecute ke jenis prioritas. Ini hanya didukung pada Windows 8 dan yang lebih baru.

Kode berikut menghasilkan peringatan:

pPtr = MmGetSystemAddressForMdlSafe( pMdl, NormalPagePriority);

Kode berikut menghindari peringatan:

pPtr = MmGetSystemAddressForMdlSafe( pMdl, NormalPagePriority | MdlMappingNoExecute);

Contoh (POOL_TYPE)

Untuk jenis POOL_TYPE Anda dapat memperbaiki ini dengan mengubah jenis permintaan ke versi jenis yang tidak dapat dieksekusi. Ini hanya didukung pada Windows 8 dan yang lebih baru.

Kode berikut menghasilkan peringatan:

ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');

Kode berikut menghindari peringatan:

ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');

Kasus khusus lainnya:

Ada perubahan dalam rutinitas ExInitializeNPagedLookasideList yang sekarang memungkinkan Anda menentukan memori kumpulan yang tidak dapat dieksekusi. Misalnya, kode berikut menghasilkan peringatan ini:

ExInitializeNPagedLookasideList(pLookaside,
                NULL,
                NULL,
                0,
                size,
                tag,
                depth);

Kode berikut menghindari peringatan ini:

ExInitializeNPagedLookasideList(pLookaside,
                NULL,
                NULL,
                POOL_NX_ALLOCATION,
                size,
                tag,
                depth);

Untuk cacat yang melibatkan perlindungan halaman:

Beberapa API memungkinkan Anda menentukan perlindungan halaman, ZwMapViewOfSection adalah salah satunya. Dalam kasus ini, gunakan versi jenis perlindungan yang tidak dapat dieksekusi.

Perubahan:

  • PAGE_EXECUTE ke salah satu alternatif atau PAGE_NOACCESS di bawah ini
  • PAGE_EXECUTE_READ ke PAGE_READONLY
  • PAGE_EXECUTE_READWRITE ke PAGE_READWRITE
  • PAGE_EXECUTE_WRITECOPY ke PAGE_WRITECOPY

Kode berikut menghasilkan peringatan:

Status = ZwMapViewOfSection(   handle,
                NtCurrentProcess(),
                Address,
                0,
                0,
                &SectionOffset,
                Size,
                ViewUnmap,
                MEM_LARGE_PAGES,
                PAGE_EXECUTE_READWRITE
                ); 

Kode berikut menghindari peringatan ini:

Status = ZwMapViewOfSection(   handle,
                NtCurrentProcess(),
                Address,
                0,
                0,
                &SectionOffset,
                Size,
                ViewUnmap,
                MEM_LARGE_PAGES,
                PAGE_READWRITE
                ); 

Untuk cacat yang melibatkan jenis cache:

Beberapa API mengalokasikan memori dengan izin yang dapat dieksekusi tergantung pada jenis cache. Dua API tersebut adalah MmAllocateContiguousMemorySpecifyCache dan MmAllocateContiguousMemorySpecifyCacheNode. Jika jenis cache MmCached digunakan (lihat MEMORY_CACHING_TYPE), maka memori yang dapat dieksekusi akan dialokasikan. Untuk memperbaikinya, pilih jenis penembolokan lain, atau jika memori cache diperlukan, maka gunakan API MmAllocateContiguousNodeMemory.

Perubahan:

  • MmCached ke MmNonCached atau MmWriteCombined jika memori cache tidak diperlukan
  • API ke MmAllocateContiguousNodeMemory jika memori yang di-cache diperlukan

Kode berikut menghasilkan peringatan:

MmAllocateContiguousMemorySpecifyCache(       numberOfBytes,
                                              lowestAddress,
                                              highestAddress,
                                              NULL,
                                              MmCached,
                                              ); 

Kode berikut menghindari peringatan ini jika memori yang di-cache tidak diperlukan:

MmAllocateContiguousMemorySpecifyCache(       numberOfBytes,
                                              lowestAddress,
                                              highestAddress,
                                              NULL,
                                              MmNonCached,
                                              ); 

Kode berikut menghasilkan peringatan:

MmAllocateContiguousMemorySpecifyCacheNode(   numberOfBytes,
                                              lowestAddress,
                                              highestAddress,
                                              NULL,
                                              MmCached,
                                              MM_ANY_NODE_OK
                                              ); 

Kode berikut menghindari peringatan ini jika memori yang di-cache diperlukan:

MmAllocateContiguousNodeMemory(       numberOfBytes,
                                      lowestAddress,
                                      highestAddress,
                                      NULL,
                                      PAGE_READWRITE,
                                      MM_ANY_NODE_OK
                                      ); 

Kode berikut menggunakan API alternatif saat memori cache tidak diperlukan:

MmAllocateContiguousNodeMemory(       numberOfBytes,
                                      lowestAddress,
                                      highestAddress,
                                      NULL,
                                      PAGE_READWRITE | PAGE_NOCACHE,
                                      MM_ANY_NODE_OK
                                      ); 

Fungsi terlarang

API yang Dilarang Penggantian Alasan / Catatan
ExInitializeNPagedLookasideList()
  • Silakan OR/atur parameter bendera dengan/ke POOL_NX_ALLOCATION
  • Atau dengan menggunakan metode di POOL_NX_OPTIN_AUTO / POOL_NX_OPTINatas
MmAllocateContiguousMemorySpecifyCache() MmAllocateContiguousNodeMemory() Lihat di atas untuk informasi selengkapnya

Bendera Terlarang

Bendera Terlarang Penggantian Alasan/Catatan
MM_PAGE_PRIORITY

Lihat di atas untuk informasi selengkapnya
POOL_NX_OPTIN_AUTO Ini mendukung pembuatan beberapa biner untuk versi Windows yang berbeda
POOL_NX_OPTIN(+ ExInitializeDriverRuntime(DrvRtPoolNxOptIn)) Ini mendukung satu biner yang berjalan pada versi Windows yang berbeda
PagePriority / MdlMappingNoExecute Ini akan bekerja pada Windows 8 dan nanti
PAGE_EXECUTE PAGE_NOACCESS Lihat di atas untuk informasi selengkapnya
PAGE_EXECUTE_READ PAGE_READONLY
PAGE_EXECUTE_READWRITE PAGE_READWRITE
PAGE_EXECUTE_WRITECOPY PAGE_WRITECOPY

POOL_TYPE