1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Как перезагрузить систему из драйвера?

Тема в разделе "WASM.NT.KERNEL", создана пользователем ntcdm, 12 авг 2009.

  1. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Здравствуйте, уважаемые форумчане!

    Возникла необходимость перезагрузить систему из Kernel Mode. В User Mode для этого есть замечательная функция:
    Код (Text):
    1. ExitWindowsEx(EWX_REBOOT,0);
    Однако в Kernel Mode аналогичной функции нет.

    Подскажите, каким образом можно решить поставленную задачу из Kernel Mode ?
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    ZwShutdownSystem ?
     
  3. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    ZwShutdownSystem не корректно завершает пользовательские приложения, пользовательские данные не сохраняются. Мне нужно именно корректное завершение работы.
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Тогда тут без обращений к серверу подсистемы csrss никак.
     
  5. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Написал следующий кодес:
    Код (Text):
    1. USER_API_MSG userApiMsg;
    2.  
    3. RtlZeroMemory(&userApiMsg, sizeof(USER_API_MSG));
    4.  
    5. userApiMsg.h.u1.s1.DataLength = 28;
    6. userApiMsg.h.u1.s1.DataLength = 56;
    7.  
    8. userApiMsg.h.ClientId.UniqueThread = (HANDLE)2;
    9.  
    10. userApiMsg.ApiNumber = 0x30400;
    11.  
    12. userApiMsg.ReturnValue = 2;
    13.  
    14. userApiMsg.u.ExitWindowsEx.uFlags = 0x1800;
    15.  
    16. userApiMsg.u.ExitWindowsEx.fSuccess = 2;
    17.  
    18. ntStatus = ZwRequestWaitReplyPort(g_hApiPort, (PPORT_MESSAGE)&userApiMsg, (PPORT_MESSAGE)&userApiMsg);
    на работает. ntStatus = STATUS_INVALID_PARAMETER

    Что я делаю не так ?
     
  6. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    ADD: можно глянуть исходники ExitWindowsEx из nt или 2k, там целая цепь колбеков и прочей муры
     
  7. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Как я понял в userApiMsg.h.ClientId.UniqueThread надо укзазать NtCurrentTeb()->ClientId. У моего потока, созданного по PsCreateSystemThread нету TEB. Как быть ?
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Я бы посоветовал создать пользовательский поток в процессе CSR, который и вызовет ExitWindowsEx(). Стабильное решение, хотя и достаточно громоздкое, но оно по крайне мере относительно документированное, по крайне мере, более документированное, чем тот же LPC, который полностью закрыт.
     
  9. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    из ядра нельзя вызывать ZwRequestWaitReplyPort
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    blast
    LpcRequestWaitReplyPort().
     
  11. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Внедриться в винлогон, и из него послать через CsrClientCallServer сообщение серверу подсистемы вин32, с кодом, соотвествующим первой ф-ции из USERSRV_DispatchTable (UserpExitWindowsEx).
     
  12. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    :D Прочитал название темы, вобщем прям из ядра и слать сообщение, подменив PID на PID winlogon'a.
     
  13. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Спасибо за ответы! Может быть есть какие-то наработки, готовый код, по хотя=бы одному из приведенных решений? Буду очень признателен.
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Есть, всё есть, и даже в сети валяется. Уж на тему создания пользовательского потока из ядра даже я не поленился и однажды запостил тут немного кода. И не только я. Но искать мне лично очень и очень лениво сейчас, поэтому предлагаю тебе заняться этим самостоятельно.
     
  15. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    нашел ошибку у себя в коде:
    Код (Text):
    1. userApiMsg.h.u1.s1.DataLength = 28;
    2. userApiMsg.h.u1.s1.TotalLength = 56;
    теперь ntStatus=STATUS_INVALID_HANDLE

    Буду искать решения по созданию юзермодного потока
     
  16. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    посоветуйте хотя-бы в какую сторону копать, ключевые слова )