2011-05-25 26 views
7

Estoy construyendo un simulador HW para nuestro equipo de pilotos. Ahora, el simulador se divide en 2 módulos: El primer módulo se ejecuta dentro del controlador, en modo kernel y ahí es donde está la interfaz principal entre el controlador y el HW-Simulator. segundo módulo es un código ejecutable en modo de usuario que genera datos para el simulador y lo transporta al simulador a través de llamadas a DeviceIOControl (bajo API de Windows)Ejecutando un ejecutable en modo usuario desde el modo kernel

Mi necesidad es la siguiente: Quiero ser capaz de ejecutar usuario- modo ejecutable desde el kernel-mode. Y necesito poder hacer esto de una manera relativamente portátil. Actualmente solo me estoy ejecutando en Windows, pero eso debería cambiar pronto. Además, necesito poder comunicarme con el código de modo de usuario a través de su tubería stdin, para reconfigurarlo y finalmente cerrarlo.

encontré esto: Executing a user-space function from the kernel space

pero es sólo relevante para el linux-kernel. ¿Hay una alternativa más portátil? O una alternativa de Windows?

¿Puedo hacer esto en Windows simplemente usando las funciones ShellExecute/RunAs API?

Nota: Somos conscientes de los riesgos de seguridad implicados al invocar el código de modo de usuario desde el kernel-space. Pero como esto solo debe usarse como entorno de prueba y no alcanzará nunca nuestro código de publicación, entonces no estamos preocupados.

+2

Dudo que encuentre una forma "portátil" de hacer cosas a nivel de kernel. – casablanca

+0

@casablanca: suficiente. ¿Cómo puedo lograr esto en Windows, entonces? – eladidan

+0

Oh, yo tampoco sé la respuesta, ese fue solo un comentario. :) – casablanca

Respuesta

5

No hay una manera clara de hacerlo en el kernel de Windows. La API de modo de usuario CreateProcess para crear procesos utiliza API no documentadas (NtCreateProcess/NtCreateThread) para crear un proceso.

Lo que se recomienda hacer es tener un "servicio asociado", un servicio en modo de usuario que se comunica con su controlador mediante IOCTL. Puede usar el inverted call model para que su controlador llame a su servicio para que cree un proceso.

0

Realmente, no hay una forma documentada de hacerlo sin activar la creación de procesos desde el modo de usuario.

Pero hay un camino complicado indocumentado Si no desea crear la aplicación en modo de usuario:

para crear un proceso Win32 válida, el conductor debe comunicarse con CSRSS (lo que es indocumentado).

Puede poner en cola un APC de modo de usuario, asignar algo de memoria virtual para el código APC en el contexto de cualquier proceso existente. Este código debería simplemente llamar CreateProcess y cualquier otra cosa que desee.

Cuestiones relacionadas