用未公開函式 NtShutdownSystem 快速重啟、關機
阿新 • • 發佈:2021-12-18
在WinPE環境下,無法使用 ExitWindowsEx 函式來關機,需要使用未公開的API NtShutdownSystem
注意,要先啟用 SE_SHUTDOWN_NAME 特權
typedef long NTSTATUS; typedef enum _SHUTDOWN_ACTION { ShutdownNoReboot, ShutdownReboot, ShutdownPowerOff } SHUTDOWN_ACTION, * PSHUTDOWN_ACTION; typedef NTSTATUS(NTAPI* NTSHUTDOWNSYSTEM)(SHUTDOWN_ACTION); void reboot() { HMODULE hModule = GetModuleHandleW(L"ntdll.dll"); if (hModule) { auto proc = (NTSHUTDOWNSYSTEM)GetProcAddress(hModule, "NtShutdownSystem"); if (proc) { proc(ShutdownReboot); } } }
這個函式不像 ExitWindowsEx 那樣要通知 csrss.exe 和 winlogon.exe 程序,而是直接關機,非常快。所以在關機前應該注意儲存工作資料。
參考
玩玩360——ExitWindowsEx大法
ExitWindowsEx , NtShutdownSystem to shutdown or restart to windows
http://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FHardware%2FNtShutdownSystem.html
http://www.codewarrior.cn/ntdoc/winnt/ex/NtShutdownSystem.htm