Fungsi KeSetKernelStackSwapEnable (ntifs.h)

Rutinitas KeSetKernelStackSwapEnable memungkinkan dan menonaktifkan penukaran tumpukan pemanggil ke disk.

Sintaks

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

Parameter

[in] Enable

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

Nilai kembali

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 berada 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 pemanggil menunggu dalam mode kernel atau mode pengguna. Jika WaitMode = UserMode, dan jika durasi tunggu cukup lama, manajer memori mungkin mem-page out bagian tumpukan yang termasuk dalam utas tunggu. Namun, jika tumpukan berisi item data yang harus tetap menjadi memory-resident selama durasi tunggu, utas dapat mencegah tumpukan di-page out dengan memanggil KeSetKernelStackSwapEnable dan menentukan Aktifkan = FALSE.

Utas tidak boleh keluar (dihentikan) saat penukaran 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 disinyalir. Driver memanggil KeWaitForSingleObject dengan WaitReasonuserRequest 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 tumpukan 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 sinyal atau tidak bertanda, atau saat utas menunggu peristiwa. Untuk informasi selengkapnya, lihat Menentukan dan Menggunakan Objek Peristiwa.

Seringkali, penggunaan rutinitas KeSetKernelStackSwap tidak perlu dan dapat dihindari dengan hanya mengalokasikan item data yang dapat halaman 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

Persyaratan Nilai
Klien minimum yang didukung 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