Здравствуйте, уважаемые форумчане! Возникла необходимость перезагрузить систему из Kernel Mode. В User Mode для этого есть замечательная функция: Код (Text): ExitWindowsEx(EWX_REBOOT,0); Однако в Kernel Mode аналогичной функции нет. Подскажите, каким образом можно решить поставленную задачу из Kernel Mode ?
ZwShutdownSystem не корректно завершает пользовательские приложения, пользовательские данные не сохраняются. Мне нужно именно корректное завершение работы.
Написал следующий кодес: Код (Text): USER_API_MSG userApiMsg; RtlZeroMemory(&userApiMsg, sizeof(USER_API_MSG)); userApiMsg.h.u1.s1.DataLength = 28; userApiMsg.h.u1.s1.DataLength = 56; userApiMsg.h.ClientId.UniqueThread = (HANDLE)2; userApiMsg.ApiNumber = 0x30400; userApiMsg.ReturnValue = 2; userApiMsg.u.ExitWindowsEx.uFlags = 0x1800; userApiMsg.u.ExitWindowsEx.fSuccess = 2; ntStatus = ZwRequestWaitReplyPort(g_hApiPort, (PPORT_MESSAGE)&userApiMsg, (PPORT_MESSAGE)&userApiMsg); на работает. ntStatus = STATUS_INVALID_PARAMETER Что я делаю не так ?
Как я понял в userApiMsg.h.ClientId.UniqueThread надо укзазать NtCurrentTeb()->ClientId. У моего потока, созданного по PsCreateSystemThread нету TEB. Как быть ?
Я бы посоветовал создать пользовательский поток в процессе CSR, который и вызовет ExitWindowsEx(). Стабильное решение, хотя и достаточно громоздкое, но оно по крайне мере относительно документированное, по крайне мере, более документированное, чем тот же LPC, который полностью закрыт.
Внедриться в винлогон, и из него послать через CsrClientCallServer сообщение серверу подсистемы вин32, с кодом, соотвествующим первой ф-ции из USERSRV_DispatchTable (UserpExitWindowsEx).
Спасибо за ответы! Может быть есть какие-то наработки, готовый код, по хотя=бы одному из приведенных решений? Буду очень признателен.
Есть, всё есть, и даже в сети валяется. Уж на тему создания пользовательского потока из ядра даже я не поленился и однажды запостил тут немного кода. И не только я. Но искать мне лично очень и очень лениво сейчас, поэтому предлагаю тебе заняться этим самостоятельно.
нашел ошибку у себя в коде: Код (Text): userApiMsg.h.u1.s1.DataLength = 28; userApiMsg.h.u1.s1.TotalLength = 56; теперь ntStatus=STATUS_INVALID_HANDLE Буду искать решения по созданию юзермодного потока