Выполнение исполняемого файла пользовательского режима из режима ядра

Я строю HW-симулятор для нашей команды водителей. Теперь симулятор разделен на 2 модуля: первый модуль запускается внутри драйвера, в режиме ядра, и именно там находится основной интерфейс между драйвером и HW-Simulator. Второй модуль - это исполняемый код пользовательского режима, который генерирует данные для симулятора и переносит их в симулятор посредством вызовов DeviceIOControl (под Windows API)

Мне нужно вот что: я хочу иметь возможность выполнять исполняемый файл пользовательского режима изнутри режима ядра. И я должен быть в состоянии сделать это относительно портативным способом. В настоящее время я работаю только на Windows, но это должно скоро измениться. Более того, мне нужно иметь возможность общаться с кодом режима пользователя через егоstdin труба, для того, чтобы перенастроить его и в конечном итоге закрыть его.

Я нашел это: Выполнение функции пространства пользователя из пространства ядра

но это относится только к ядру Linux. Есть ли более портативная альтернатива? Или альтернатива Windows?

Могу ли я сделать это в Windows, просто используя функции API ShellExecute / RunAs?

Примечание. Нам известно о рисках безопасности, связанных с вызовом кода пользовательского режима из пространства ядра. Но так как это предназначено только для использования в качестве тестовой среды и никогда не достигнет нашего кода выпуска, то нас это не касается.

2 ответа

Решение

Нет чистого способа сделать это в ядре Windows. API пользовательского режима CreateProcess для создания процессов использует недокументированные API ( NtCreateProcess/ NtCreateThread) для создания процесса.

Рекомендуется иметь "партнерскую службу", службу пользовательского режима, которая взаимодействует с вашим драйвером с помощью IOCTL. Вы можете использовать модель перевернутого вызова, чтобы ваш драйвер вызывал вашу службу, чтобы он создал процесс.

Действительно, не существует документированного способа сделать это без запуска процесса в пользовательском режиме.

Но есть один недокументированный хитрый способ, если вы не хотите создавать приложение в пользовательском режиме:

Чтобы создать действительный процесс win32, драйвер должен связаться с CSRSS (что не документировано).

Вы можете поставить в очередь APC пользовательского режима, выделить некоторую виртуальную память для кода APC в контексте любого существующего процесса. Этот код должен просто вызывать CreateProcess и все остальное, что вы хотите.

Другие вопросы по тегам