Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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.
Avec quelques exceptions, chaque routine des 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 façon identique. 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ètre 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 de mode noyau approuvée. Dans ce cas, la routine suppose qu’elle peut utiliser les paramètres en toute sécurité sans les valider d’abord. 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 provenant 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 toutes les mémoires tampons fournies par l’appelant pour vérifier que les mémoires tampons sont situées en mémoire valide en mode utilisateur et sont alignées correctement.
Les routines des services système natifs font d’autres hypothèses sur les paramètres qu’ils 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 est allouée en mémoire système, et non en mémoire utilisateur. Si la routine reçoit un handle 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 de 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, ce qui signifie différentes choses, 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 articles suivants :