Utilisation des versions Nt et Zw des routines natives des services système natifs

L’API des services du système d’exploitation natif Windows est implémentée sous la forme d’un ensemble de routines qui s’exécutent en mode noyau. Ces routines ont des noms qui commencent par le préfixe Nt ou Zw. Les pilotes en mode noyau peuvent appeler ces routines directement. Les applications en mode utilisateur peuvent accéder à ces routines à l’aide d’appels système.

À quelques exceptions près, chaque routine de services système natifs a deux versions légèrement différentes qui ont des noms similaires, mais des préfixes différents. Par exemple, les appels à NtCreateFile et ZwCreateFile effectuent des opérations similaires et sont, en fait, servis par la même routine système en mode noyau. Pour les appels système en mode utilisateur, les versions Nt et Zw d’une routine se comportent de la même manière. Pour les appels à partir d’un pilote en mode noyau, les versions Nt et Zw d’une routine diffèrent dans la façon dont elles gèrent les valeurs de paramètres que l’appelant passe à la routine.

Un pilote en mode noyau appelle la version Zw d’une routine de services système natifs pour informer la routine que les paramètres proviennent d’une source approuvée en mode noyau. Dans ce cas, la routine suppose qu’elle peut utiliser les paramètres en toute sécurité sans les valider au préalable. Toutefois, si les paramètres peuvent provenir d’une source en mode utilisateur ou d’une source en mode noyau, le pilote appelle plutôt la version Nt de la routine, qui détermine, en fonction de l’historique du thread appelant, si les paramètres proviennent du mode utilisateur ou du mode noyau. Pour plus d’informations sur la façon dont la routine distingue les paramètres en mode utilisateur des paramètres en mode noyau, consultez PreviousMode.

Lorsqu’une application en mode utilisateur appelle la version Nt ou Zw d’une routine de services système natifs, la routine traite toujours les paramètres qu’elle reçoit comme des valeurs qui proviennent d’une source en mode utilisateur qui n’est pas approuvée. La routine valide soigneusement les valeurs des paramètres avant d’utiliser les paramètres. En particulier, la routine sonde tous les tampons fournis par l’appelant pour vérifier que les mémoires tampons sont situées dans une mémoire valide en mode utilisateur et qu’elles sont correctement alignées.

Les routines des services système natifs font des hypothèses supplémentaires sur les paramètres qu’elles reçoivent. Si une routine reçoit un pointeur vers une mémoire tampon allouée par un pilote en mode noyau, la routine suppose que la mémoire tampon a été allouée dans la mémoire système, et non dans la mémoire en mode utilisateur. Si la routine reçoit un handle qui a été ouvert par une application en mode utilisateur, la routine recherche le handle dans la table de handle en mode utilisateur, et non dans la table handle en mode noyau.

Dans quelques cas, la signification d’une valeur de paramètre diffère plus considérablement entre les appels du mode utilisateur et du mode noyau. Par exemple, la routine ZwNotifyChangeKey (ou son équivalent NtNotifyChangeKey ) a une paire de paramètres d’entrée, ApcRoutine et ApcContext, qui signifient des choses différentes, selon que les paramètres proviennent d’une source en mode utilisateur ou en mode noyau. Pour un appel en mode utilisateur, ApcRoutine pointe vers une routine APC et ApcContext pointe vers une valeur de contexte que le système d’exploitation fournit lorsqu’il appelle la routine APC. Pour un appel en mode noyau, ApcRoutine pointe vers une structure WORK_QUEUE_ITEM et ApcContext spécifie le type d’élément de file d’attente de travail décrit par la structure WORK_QUEUE_ITEM .

Cette section comprend les rubriques suivantes :

PreviousMode

Bibliothèques et en-têtes

Que signifie le préfixe Zw ?

Spécification des droits d’accès

NtXxx Routines