Выполнение исполняемого файла пользовательского режима из режима ядра
Я строю 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 и все остальное, что вы хотите.