我正在为我们的驾驶员团队建立一个硬件模拟器。现在,模拟器分为2个模块:
第一个模块在内核模式下运行在驱动程序内部,这是驱动程序和HW-Simulator之间的主要接口。
第二个模块是一个可执行的用户模式代码,它为模拟器生成数据并通过调用DeviceIOControl
(在Windows API下)将其传输到模拟器
我的需求是:我希望能够在内核模式下执行用户模式可执行文件。我需要能够以相对便携的方式做到这一点。目前我只在Windows上运行,但这应该很快就会改变。
此外,我需要能够通过它的stdin
管道与用户模式代码进行通信,以便重新配置它并最终将其关闭。
我发现了这个: Executing a user-space function from the kernel space
但它只与linux内核相关。有更便携的替代方案吗?或Windows替代?
我可以通过简单地使用ShellExecute / RunAs API函数在Windows中执行此操作吗?
注意:我们知道从内核空间调用用户模式代码所涉及的安全风险。但由于这只是用作测试环境而不会达到我们的发布代码,因此我们并不关心。
答案 0 :(得分:5)
在Windows内核中没有一种干净的方法可以做到这一点。用于创建流程的用户模式API CreateProcess使用未记录的API(NtCreateProcess / NtCreateThread)来创建流程。
建议做的事情是拥有一个“合作伙伴服务”,一种使用IOCTL与您的驱动程序通信的用户模式服务。您可以使用inverted call model让您的驱动程序调用您的服务,让它创建一个进程。
答案 1 :(得分:0)
实际上,如果没有从用户模式触发流程创建,就没有记录的方法。
但是,如果您不想创建用户模式应用程序,那么有一种无证的方法:
要创建有效的win32进程,驱动程序必须与CSRSS(未记录的内容)进行通信。
您可以将用户模式APC排入队列,在任何现有进程的上下文中为APC代码分配一些虚拟内存。这段代码应该简单地调用CreateProcess和你想要的任何其他东西。