用未公开函数 NtShutdownSystem 快速重启、关机
在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 进程,而是直接关机,非常快。所以在关机前应该注意保存工作数据。
参考资料
ExitWindowsEx , NtShutdownSystem to shutdown or restart to windows
http://www.codewarrior.cn/ntdoc/winnt/ex/NtShutdownSystem.htm

浙公网安备 33010602011771号