Fungsi KeSetKernelStackSwapEnable (ntifs.h)

Rutinitas KeSetKernelStackSwapEnable memungkinkan dan menonaktifkan pertukaran tumpukan pemanggil ke disk.

Sintaks

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

Parameter

[in] Enable

Menentukan apakah akan mengaktifkan pertukaran tumpukan yang termasuk dalam utas panggilan. Jika TRUE, pertukaran diaktifkan dan konten tumpukan dapat di-page masuk dan kehabisan memori. Jika FALSE, pertukaran dinonaktifkan dan tumpukannya adalah memory-resident.

Mengembalikan nilai

KeSetKernelStackSwapEnable mengembalikan nilai BOOLEAN yang menunjukkan apakah pertukaran tumpukan diaktifkan pada saat panggilan dimulai. Nilai ini TRUE jika pertukaran tumpukan sebelumnya diaktifkan dan FALSE jika dinonaktifkan.

Keterangan

Driver mode-kernel dapat memanggil rutinitas ini untuk mengontrol apakah tumpukannya dapat dipaginasi atau dikunci dalam memori.

Pertukaran tumpukan hanya dapat terjadi jika utas dalam status tunggu yang disebabkan oleh permintaan dari aplikasi mode pengguna. Pertukaran tumpukan tidak pernah terjadi untuk status tunggu yang dimulai oleh komponen mode kernel, terlepas dari apakah pertukaran tumpukan diaktifkan.

Biasanya tidak perlu menonaktifkan pertukaran tumpukan. Lakukan ini hanya dalam kasus yang jarang terjadi. Untuk contoh yang membahas alternatif untuk menonaktifkan pertukaran tumpukan, lihat bagian Contoh di bawah ini.

Dalam panggilan ke rutinitas tunggu mode kernel, seperti KeWaitForSingleObject, pemanggil menentukan parameter WaitMode untuk menunjukkan apakah penelepon menunggu dalam mode kernel atau mode pengguna. Jika WaitMode = UserMode, dan jika durasi tunggu cukup panjang, manajer memori mungkin memunculkan bagian tumpukan yang termasuk dalam utas tunggu. Namun, jika tumpukan berisi item data yang harus tetap menjadi residen memori selama durasi tunggu, utas dapat mencegah tumpukan di-paged out dengan memanggil KeSetKernelStackSwapEnable dan menentukan Aktifkan = FALSE.

Utas tidak boleh keluar (dihentikan) saat pertukaran tumpukan dinonaktifkan atau pemeriksaan bug sistem akan terjadi.

Contoh

Dalam contoh kode berikut, utas driver mengalokasikan peristiwa pada tumpukannya dan memanggil KeSetKernelStackSwap untuk mengunci tumpukan memori untuk sementara waktu hingga peristiwa disinyalkan. Driver memanggil KeWaitForSingleObject dengan WaitReasondari UserRequest untuk menunjukkan bahwa utasnya dalam keadaan tunggu yang disebabkan oleh permintaan dari aplikasi mode pengguna, dan WaitMode diatur ke KernelMode untuk menunjukkan bahwa penantian terjadi dalam mode kernel. Setelah penantian selesai, utas memanggil KeSetKernelStackSwap lagi, jika perlu, untuk memulihkan status pertukaran tumpukan asli utas.

KEVENT event;
BOOLEAN oldSwapEnable;
NTSTATUS status;

oldSwapEnable = KeSetKernelStackSwapEnable(FALSE);

KeInitializeEvent(&event, SynchronizationEvent, FALSE);

//
// TO DO: Insert code here to pass the event to another thread
// that will set the event to the signaled state.
//
...

status = KeWaitForSingleObject(&event, UserRequest, KernelMode, FALSE, NULL);

if (oldSwapEnable)
{
    KeSetKernelStackSwapEnable(TRUE);
}

Objek peristiwa harus berupa memory-resident sementara dapat diatur ke status disinyalkan atau tidak ditandatangani, atau saat utas menunggu peristiwa. Untuk informasi selengkapnya, lihat Menentukan dan Menggunakan Objek Peristiwa.

Sering kali, penggunaan rutinitas KeSetKernelStackSwap tidak perlu dan dapat dihindari dengan hanya mengalokasikan item data yang dapat dipaginasi pada tumpukan. Dalam contoh sebelumnya, utas driver harus mengunci tumpukan karena objek peristiwa dialokasikan pada tumpukan. Alternatif yang lebih baik mungkin hanya mengalokasikan peristiwa dari kumpulan yang tidak disebarkan.

Persyaratan

   
Klien minimum yang didukung Tersedia dimulai dengan Windows 2000.
Target Platform Universal
Header ntifs.h (termasuk Ntifs.h, Fltkernel.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

Lihat juga

KeInitializeEvent

KeWaitForsingleObject