Fungsi RtlCreateHeap (ntifs.h)

Rutinitas RtlCreateHeap membuat objek heap yang dapat digunakan oleh proses panggilan. Rutinitas ini mencadangkan ruang di ruang alamat virtual proses dan mengalokasikan penyimpanan fisik untuk bagian awal yang ditentukan dari blok ini.

Sintaks

NTSYSAPI PVOID RtlCreateHeap(
  [in]           ULONG                Flags,
  [in, optional] PVOID                HeapBase,
  [in, optional] SIZE_T               ReserveSize,
  [in, optional] SIZE_T               CommitSize,
  [in, optional] PVOID                Lock,
  [in, optional] PRTL_HEAP_PARAMETERS Parameters
);

Parameter

[in] Flags

Bendera yang menentukan atribut opsional dari heap. Opsi ini memengaruhi akses berikutnya ke tumpukan baru melalui panggilan ke fungsi heap (RtlAllocateHeap dan RtlFreeHeap).

Penelepon harus mengatur parameter ini ke nol jika tidak ada atribut opsional yang diminta.

Parameter ini bisa menjadi satu atau beberapa nilai berikut.

Nilai Makna
HEAP_GENERATE_EXCEPTIONS Menentukan bahwa sistem akan menunjukkan kegagalan timbunan dengan menaikkan pengecualian, seperti STATUS_NO_MEMORY, alih-alih mengembalikan NULL.
HEAP_GROWABLE Menentukan bahwa timbunan dapat tumbuh. Harus ditentukan jika HeapBase adalah NULL.
HEAP_NO_SERIALIZE Menentukan bahwa pengecualian timbal balik tidak akan digunakan ketika fungsi heap mengalokasikan dan membebaskan memori dari timbunan ini. Defaultnya, ketika HEAP_NO_SERIALIZE tidak ditentukan, adalah menserialisasikan akses ke heap. Serialisasi akses timbunan memungkinkan dua atau lebih utas untuk secara bersamaan mengalokasikan dan membebaskan memori dari tumpukan yang sama.

[in, optional] HeapBase

Menentukan salah satu dari dua tindakan:

Jika HeapBase adalah nilai non-NULL, HeapBase menentukan alamat dasar untuk blok memori yang dialokasikan pemanggil yang akan digunakan untuk heap.

Jika HeapBase ADALAH NULL, RtlCreateHeap mengalokasikan memori sistem untuk timbunan dari ruang alamat virtual proses.

[in, optional] ReserveSize

Jika ReserveSize adalah nilai bukan nol, itu menentukan jumlah awal memori, dalam byte, untuk mencadangkan heap. RtlCreateHeap membulatkanReserveSize hingga batas halaman berikutnya, lalu memesan blok ukuran tersebut untuk tumpukan.

Parameter ini bersifat opsional dan bisa nol. Tabel berikut ini meringkas interaksi parameter ReserveSize dan CommitSize .

Nilai Hasil
ReserveSize zero, CommitSize zero 64 halaman awalnya dicadangkan untuk tumpukan. Satu halaman awalnya diterapkan.
ReserveSize zero, CommitSize nonzero RtlCreateHeap mengatur ReserveSize agar sama dengan CommitSize, lalu membulatkan ReserveSize ke kelipatan terdekat (PAGE_SIZE * 16).
ReserveSize nonzero, CommitSize zero Satu halaman awalnya diterapkan untuk timbunan.
ReserveSize nonzero, CommitSize nonzero Jika CommitSize lebih besar dari ReserveSize, RtlCreateHeap mengurangi CommitSize to ReserveSize.

[in, optional] CommitSize

Jika CommitSize adalah nilai bukan nol, itu menentukan jumlah awal memori, dalam byte, untuk menerapkan heap. RtlCreateHeap membulatkanCommitSize hingga batas halaman berikutnya, lalu menerapkan blok ukuran tersebut dalam ruang alamat virtual proses untuk heap.

Parameter ini bersifat opsional dan bisa nol.

[in, optional] Lock

Penunjuk ke struktur ERESOURCE buram yang akan digunakan sebagai kunci sumber daya. Parameter ini bersifat opsional dan dapat berupa NULL. Ketika disediakan oleh pemanggil, struktur harus dialokasikan dari kumpulan yang tidak disebarkan dan diinisialisasi dengan memanggil ExInitializeResourceLite atau ExReinitializeResourceLite. Jika bendera HEAP_NO_SERIALIZE diatur, parameter ini harus NULL.

[in, optional] Parameters

Penunjuk ke struktur RTL_HEAP_PARAMETERS yang berisi parameter yang akan diterapkan saat membuat tumpukan. Parameter ini bersifat opsional dan dapat berupa NULL.

Nilai kembali

RtlCreateHeap mengembalikan handel yang akan digunakan dalam mengakses heap yang dibuat.

Keterangan

RtlCreateHeap membuat objek heap privat tempat proses panggilan dapat mengalokasikan blok memori dengan memanggil RtlAllocateHeap. Ukuran penerapan awal menentukan jumlah halaman yang awalnya dialokasikan untuk tumpukan. Ukuran cadangan awal menentukan jumlah halaman yang awalnya dicadangkan untuk tumpukan. Halaman yang dicadangkan tetapi tidak dikomit membuat blok di ruang alamat virtual proses tempat tumpukan dapat diperluas.

Jika permintaan alokasi yang dibuat oleh RtlAllocateHeap melebihi ukuran penerapan awal heap, sistem menerapkan halaman tambahan penyimpanan fisik untuk tumpukan, hingga ukuran maksimum tumpukan. Jika timbunan tidak dapat diantisipasi, ukuran maksimumnya terbatas pada ukuran cadangan awalnya.

Jika timbunan dapat tumbuh, ukurannya hanya dibatasi oleh memori yang tersedia. Jika permintaan oleh RtlAllocateHeap melebihi ukuran halaman yang diterapkan saat ini, sistem memanggil ZwAllocateVirtualMemory untuk mendapatkan memori yang diperlukan, dengan asumsi bahwa penyimpanan fisik tersedia.

Selain itu, jika tumpukan tidak dapat diubah, keterbatasan absolut muncul: ukuran maksimum blok memori dalam tumpukan adalah 0x7F000 byte. Ambang memori virtual dari tumpukan sama dengan ukuran blok tumpukan maksimum atau nilai anggota VirtualMemoryThreshold dari struktur Parameter , mana yang kurang. Timbunan juga mungkin perlu menyesuaikan ukuran permintaan untuk tujuan metadata dan penyelarasan sehingga permintaan untuk mengalokasikan blok dalam 4096 Byte (1 Halaman) dari VirtualMemoryThreshold mungkin gagal bahkan jika ukuran maksimum timbunan cukup besar untuk memuat blok. (Untuk informasi selengkapnya tentang VirtualMemoryThreshold, lihat anggota parameter Parameter ke RtlCreateHeap.)

Jika tumpukan dapat tumbuh, permintaan untuk mengalokasikan blok yang lebih besar dari ambang memori virtual heap tidak gagal secara otomatis; sistem memanggil ZwAllocateVirtualMemory untuk mendapatkan memori yang diperlukan untuk blok besar tersebut.

Memori objek heap privat hanya dapat diakses oleh proses yang membuatnya.

Sistem menggunakan memori dari tumpukan privat untuk menyimpan struktur dukungan tumpukan, sehingga tidak semua ukuran tumpukan yang ditentukan tersedia untuk proses. Misalnya, jika RtlAllocateHeap meminta 64 kilobyte (K) dari tumpukan dengan ukuran maksimum 64K, permintaan mungkin gagal karena overhead sistem.

Jika HEAP_NO_SERIALIZE tidak ditentukan (default sederhana), heap akan menserialisasikan akses dalam proses panggilan. Serialisasi memastikan pengecualian timbal balik ketika dua utas atau lebih mencoba mengalokasikan atau membebaskan blok secara bersamaan dari timbunan yang sama. Ada biaya performa kecil untuk serialisasi, tetapi harus digunakan setiap kali beberapa utas mengalokasikan dan membebaskan memori dari tumpukan yang sama.

Pengaturan HEAP_NO_SERIALIZE menghilangkan pengecualian timbal balik pada tumpukan. Tanpa serialisasi, dua utas atau lebih yang menggunakan handel tumpukan yang sama mungkin mencoba mengalokasikan atau membebaskan memori secara bersamaan, kemungkinan menyebabkan kerusakan dalam tumpukan. Oleh karena itu, HEAP_NO_SERIALIZE hanya dapat digunakan dengan aman dalam situasi berikut:

  • Proses ini hanya memiliki satu utas.

  • Proses ini memiliki beberapa utas, tetapi hanya satu utas yang memanggil fungsi heap untuk timbunan tertentu.

  • Proses ini memiliki beberapa utas, dan aplikasi menyediakan mekanismenya sendiri untuk pengecualian bersama ke timbunan tertentu.

Catatan

Untuk melindungi dari pelanggaran akses, gunakan penanganan pengecualian terstruktur untuk melindungi kode apa pun yang menulis atau membaca dari timbunan. Untuk informasi selengkapnya tentang penanganan pengecualian terstruktur dengan akses memori, lihat Menangani Pengecualian**.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows XP
Target Platform Universal
Header ntifs.h (termasuk Ntifs.h)
Pustaka Ntoskrnl.lib
DLL NtosKrnl.exe (mode kernel); Ntdll.dll (mode pengguna)
IRQL < DISPATCH_LEVEL

Lihat juga

RtlAllocateHeap

RtlDestroyHeap

RtlFreeHeap