Выполнение исполняемого файла пользовательского режима из режима ядра - PullRequest
7 голосов
/ 25 мая 2011

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

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

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

0 голосов
/ 09 ноября 2015

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...