KeSetKernelStackSwapEnable, fonction (ntifs. h)

La routine KeSetKernelStackSwapEnable active et désactive l’échange de la pile de l’appelant sur le disque.

Syntaxe

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

Paramètres

[in] Enable

Spécifie s’il faut activer l’échange de la pile qui appartient au thread appelant. Si la valeur est true, l’échange est activé et le contenu de la pile peut être paginé dans et hors de la mémoire. Si la valeur est false, l’échange est désactivé et la pile est résidente en mémoire.

Valeur de retour

KeSetKernelStackSwapEnable retourne une valeur booléenne qui indique si l’échange de pile a été activé au moment où l’appel a été initié. Cette valeur est true si l’échange de pile a été activé précédemment et a la valeur false s’il a été désactivé.

Notes

Un pilote en mode noyau peut appeler cette routine pour contrôler si sa pile est paginable ou verrouillée en mémoire.

L’échange de pile peut se produire uniquement si le thread est dans un état d’attente qui a été provoqué par une demande émanant d’une application en mode utilisateur. L’échange de pile ne se produit jamais pour les États d’attente initiés par les composants en mode noyau, que l’échange de pile soit activé ou non.

Il n’est généralement pas nécessaire de désactiver l’échange de pile. Procédez ainsi uniquement dans de rares cas. Pour obtenir un exemple qui présente des alternatives à la désactivation de l’échange de pile, consultez la section exemple ci-dessous.

Dans un appel à une routine d’attente en mode noyau, telle que KeWaitForSingleObject, l’appelant spécifie un paramètre WaitMode pour indiquer si l’appelant attend en mode noyau ou en mode utilisateur. Si WaitMode = à la fois, et si la durée d’attente est suffisamment longue, le gestionnaire de mémoire peut paginer des sections de la pile qui appartient au thread en attente. Toutefois, si la pile contient des éléments de données qui doivent rester résidents en mémoire pendant la durée de l’attente, le thread peut empêcher la pile d’être paginée en appelant KeSetKernelStackSwapEnable et en spécifiant Enable = false.

Un thread ne doit pas quitter (terminer) alors que l’échange de pile est désactivé ou qu’une vérification de bogue système se produit.

Exemple

Dans l’exemple de code suivant, un thread de pilote alloue un événement sur sa pile et appelle KeSetKernelStackSwap pour verrouiller temporairement la pile en mémoire jusqu’à ce que l’événement soit signalé. Le pilote appelle KeWaitForSingleObject avec un WaitReason de UserRequest pour indiquer que son thread est en état d’attente en raison d’une demande émanant d’une application en mode utilisateur, et WaitMode défini sur kernelmode. pour indiquer que l’attente se produit en mode noyau. Une fois l’attente terminée, le thread appelle à nouveau KeSetKernelStackSwap , si nécessaire, pour restaurer l’état d’échange de pile d’origine du thread.

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);
}

Un objet d’événement doit être résident en mémoire alors qu’il peut être défini sur un état signalé ou non signalé, ou bien qu’un thread attende l’événement. Pour plus d’informations, consultez définition et utilisation d’un objet d’événement.

Souvent, l’utilisation de la routine KeSetKernelStackSwap est inutile et peut être évitée en allouant uniquement des éléments de données paginables sur la pile. Dans l’exemple précédent, le thread de pilote doit verrouiller la pile, car l’objet d’événement est alloué sur la pile. Une meilleure alternative peut consister à allouer simplement l’événement à partir d’une réserve non paginée.

Spécifications

   
Client minimal pris en charge disponible à partir de Windows 2000.
Plateforme cible Universal
En-tête ntifs. h (inclure Ntifs. h, Fltkernel. h)
Bibliothèque NtosKrnl. lib
DLL NtosKrnl.exe
NIVEAU <= APC_LEVEL

Voir aussi

KeInitializeEvent

KeWaitForSingleObject