用未公开函数 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.exewinlogon.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

posted @ 2021-12-18 11:59  从一到十  阅读(820)  评论(0)    收藏  举报