从内核模式执行用户模式可执行文件

问题描述:

我正在为我们的驱动程序团队构建一个HW模拟器。现在,模拟器分为2个模块: 第一个模块在内核模式下运行在驱动器内部,这是驱动程序和HW-Simulator之间的主界面。 第二模块是一个可执行的用户模式代码,其用于仿真器会生成数据,并将其传送到通过调用DeviceIOControl模拟器(windows下API)从内核模式执行用户模式可执行文件

我需要是这样的:我希望能够执行用户在内核模式下执行模式可执行文件。我需要能够以相对便携的方式做到这一点。目前我只能在Windows上运行,但这种情况很快就会改变。 此外,我需要能够通过它的stdin管道与用户模式代码进行通信,以便重新配置并最终关闭它。

我发现这一点: Executing a user-space function from the kernel space

,但它只是为Linux内核相关的。有更便携的选择吗?或者一个Windows的替代?

我可以通过简单地使用ShellExecute/RunAs API函数在Windows中执行此操作吗?

注意:我们意识到从内核空间调用用户模式代码时涉及的安全风险。但是,因为这只是用作测试环境,并不会达到我们的发布代码,所以我们并不担心。

+2

我怀疑你会发现一个“便携”的内核级别的东西。 – casablanca 2011-05-25 16:06:11

+0

@casablanca:够公平的。那么我如何在Windows中完成此操作? – eladidan 2011-05-25 16:15:06

+0

哦,我自己也不知道答案,那只是一个评论。 :) – casablanca 2011-05-25 17:21:15

在Windows内核中没有干净的方法来做到这一点。用于创建进程的用户模式API CreateProcess使用未记录的API(NtCreateProcess/NtCreateThread)来创建进程。

建议做的事情是建立一个“合作伙伴服务”,一种使用IOCTL与驱动程序通信的用户模式服务。您可以使用inverted call model让您的驱动程序调用您的服务,让它创建一个过程。

真的,没有书面的方式来做到这一点,而不触发从用户模式创建过程。

但有,如果你不希望创建用户模式应用一个无证取巧的办法:

要创建一个有效的Win32进程的驱动程序必须与CSRSS通信(什么是无证)。

您可以排队用户模式APC,在任何现有进程的上下文中为APC代码分配一些虚拟内存。这段代码应该简单地调用CreateProcess和其他任何你想要的。