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() |
|
|
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 |