2017-07-04 54 views
0

我感到震惊的是,在我的应用程序通过DeviceIoControl()Win32 API向我的内核驱动程序(WDM)发送IOCTL请求时,我在用户模式和内核模式之间获得了相同的PID。进程ID在用户模式和内核模式下是相同的

据我所知,驱动程序在内核模式下有自己的PID;应用程序拥有用户模式下的PID,它们是分开的,可以通过IOCTL进行通信。但是今天,我在IOCTL请求中的用户/内核模式之间获得了相同的PID。我在用户模式下通过GetCurrentProcessId()函数获得PID;在内核模式下通过PsGetCurrentProcessId()函数获得PID,显示用户模式应用的结果,这两个PID是相同的。

有谁知道为什么?

回答

1

你看到的是正常的。在Windows中,线程花费部分时间运行用户模式代码,部分时间运行内核模式代码是正常的。在你的情况下,在一个线程执行完调用来执行IOCTL的应用程序之后,Windows内核使用这个相同的线程来执行你的内核模式驱动程序代码来处理这个IOCTL。

希望这会有所帮助。

+0

嗨@thtse,谢谢:) Windows内核如何再次采用同一个线程?应用程序通过系统调用向内核发送IOCTL,内核处理请求然后返回结果,有两个进程,一个处于用户模式,另一个处于内核模式。或Windows以不同的方式做到这一点?有没有任何文件提及它?我对它的机制感兴趣。 – dougpuob

+0

@dougpuob - 运行时每个进程和线程都有一些ID。这与查询的用户或内核模式没有什么不同 - 对于同一个线程或进程,结果当然是相同的。和“有两个进程,一个在用户模式下,另一个在内核模式下” - 这绝对是错误的。进程与模式无关。在某个进程中调用你的驱动程序。它从用户模式转到内核。但这是相同的线程(具有相同的ID),并在相同的过程(所以和进程ID相同) – RbMm

+0

@RbMm,谢谢。在得到你的消息后,我去跟踪ractos项目的'DeviceIoControl()'函数。它和你说的从用户模式到内核一样。请给我一只手来澄清我的观念。据我所知,Windows内核在Ring 0执行,下面的调用堆栈由应用程序(Ring 3的用户模式)通过'DeviceIoControl()'执行,当它改变为Ring 0时,或者这个调用堆栈总是在Ring 3? [**调用栈**](http://i.imgur.com/uBIZPRZ.png) – dougpuob

相关问题