2017-07-04 5 views
0

J'ai été choqué d'avoir le même PID entre le mode utilisateur et le mode noyau dans une requête IOCTL depuis mon application vers mon pilote noyau (WDM) via DeviceIoControl() Win32 API. Pour autant que je sache, les pilotes ont leur propre PID en mode noyau; les applications possèdent leur PID en mode utilisateur, elles ont été séparées, peuvent être communiquées via IOCTL. Mais aujourd'hui, j'ai le même PID entre le mode utilisateur/noyau dans une requête IOCTL. J'ai obtenu PID via la fonction GetCurrentProcessId() en mode utilisateur; et obtenu PID via la fonction PsGetCurrentProcessId() en mode noyau, montrant le résultat en mode utilisateur, ces deux PID sont les mêmes.Les ID de processus sont les mêmes en mode utilisateur et en mode noyau

Est-ce que quelqu'un sait pourquoi?

Répondre

1

Ce que vous avez vu est normal. Sous Windows, il est normal qu'un thread passe une partie de son temps à exécuter des codes de mode utilisateur et qu'il passe en partie du temps à exécuter des codes de mode noyau. Dans votre cas, après qu'un thread ait exécuté votre application qui a fait un appel pour exécuter IOCTL, le noyau Windows a utilisé ce même thread pour exécuter vos codes de pilote en mode noyau afin de gérer cet IOCTL.

Espérons que cela aide.

+0

Bonjour @thtse, merci :) comment le noyau Windows reprend-il le même fil? L'application envoie un IOCTL au noyau par appel système, le noyau gère la requête puis renvoie le résultat, il y a deux processus, un en mode utilisateur, un autre en mode noyau. Ou Windows le fait de manière différente? Y a-t-il un document qui en parle? Je suis intéressé par le mécanisme de celui-ci. – dougpuob

+0

@dougpuob - tous les processus et threads en cours d'exécution ont un identifiant. pas différent de l'utilisateur ou du mode noyau cette requête - le résultat sera bien sûr le même pour le même fil ou processus. et "il y a deux processus, un en mode utilisateur, un autre en mode noyau" - ce faux absolu. processus non liés au mode du tout. thread dans certains processus appelez votre pilote. ça passe du mode utilisateur au noyau. mais c'est le même thread (avec le même identifiant) et dans le même processus (donc et le processus id le même) – RbMm

+0

@RbMm, merci. Après avoir reçu votre message, je suis allé suivre la fonction 'DeviceIoControl()' du projet ractos. C'est la même chose que votre dit qu'il passe du mode utilisateur au noyau. S'il vous plaît, donnez-moi un coup de main pour clarifier ma conception. Pour autant que je sache, le noyau Windows est exécuté sur Ring 0, la pile d'appels suivante depuis l'application (mode utilisateur sur Ring 3) par DeviceIoControl() ', quand il passe à Ring 0, ou cette pile d'appels est toujours exécutée dans Ring 3? [** La pile appelante **] (http://i.imgur.com/uBIZPRZ.png) – dougpuob