1. 程式人生 > 其它 >用未公開函式 NtShutdownSystem 快速重啟、關機

用未公開函式 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