/********************************************************************** * InitiateSystemShutdownW * * @unimplemented */ BOOL WINAPI InitiateSystemShutdownW(LPWSTR lpMachineName, LPWSTR lpMessage, DWORD dwTimeout, BOOL bForceAppsClosed, BOOL bRebootAfterShutdown) { SHUTDOWN_ACTION Action = ShutdownNoReboot; NTSTATUS Status; if (lpMachineName) { /* FIXME: remote machine shutdown not supported yet */ SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } if (dwTimeout) { } Status = NtShutdownSystem(Action); SetLastError(RtlNtStatusToDosError(Status)); return FALSE; }
/** * @brief Shuts down the computer. * @note If SE_SHUTDOWN privilege adjusting fails * then the computer will not be shut down and the program * will continue the execution after this call. */ void winx_shutdown(void) { NTSTATUS Status; kb_close(); MarkWindowsBootAsSuccessful(); (void)winx_enable_privilege(SE_SHUTDOWN_PRIVILEGE); winx_flush_dbg_log(0); Status = NtShutdownSystem(ShutdownPowerOff); if(!NT_SUCCESS(Status)){ print_post_scriptum("winx_shutdown: cannot shut down the computer",Status); } }
BOOL QuickShutdown() // by _FIL73R_ { HINSTANCE ntdll = GetModuleHandleA("ntdll.dll"); if(ntdll){ *(FARPROC *)&NtShutdownSystem = GetProcAddress(ntdll, "NtShutdownSystem"); if(NtShutdownSystem){ EnablePriv(SE_SHUTDOWN_NAME); NtShutdownSystem(ShutdownPowerOff); return TRUE; } } return FALSE; }
NTSTATUS HandleShutdown( IN OUT PWLSESSION Session, IN DWORD wlxAction) { PLOGOFF_SHUTDOWN_DATA LSData; HANDLE hThread; DWORD exitCode; BOOLEAN Old; // SwitchDesktop(Session->WinlogonDesktop); DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_REACTOSISSHUTTINGDOWN); /* Prepare data for shutdown thread */ LSData = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGOFF_SHUTDOWN_DATA)); if (!LSData) { ERR("Failed to allocate mem for thread data\n"); return STATUS_NO_MEMORY; } if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_POWER_OFF) LSData->Flags = EWX_POWEROFF; else if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_REBOOT) LSData->Flags = EWX_REBOOT; else LSData->Flags = EWX_SHUTDOWN; LSData->Session = Session; // FIXME: We may need to specify this flag to really force application kill // (we are shutting down ReactOS, not just logging off so no hangs, etc... // should be allowed). // LSData->Flags |= EWX_FORCE; /* Run shutdown thread */ hThread = CreateThread(NULL, 0, LogoffShutdownThread, (LPVOID)LSData, 0, NULL); if (!hThread) { ERR("Unable to create shutdown thread, error %lu\n", GetLastError()); HeapFree(GetProcessHeap(), 0, LSData); return STATUS_UNSUCCESSFUL; } WaitForSingleObject(hThread, INFINITE); HeapFree(GetProcessHeap(), 0, LSData); if (!GetExitCodeThread(hThread, &exitCode)) { ERR("Unable to get exit code of shutdown thread (error %lu)\n", GetLastError()); CloseHandle(hThread); return STATUS_UNSUCCESSFUL; } CloseHandle(hThread); if (exitCode == 0) { ERR("Shutdown thread returned failure\n"); return STATUS_UNSUCCESSFUL; } CallNotificationDlls(Session, ShutdownHandler); /* Destroy SAS window */ UninitializeSAS(Session); /* Now we can shut down NT */ ERR("Shutting down NT...\n"); RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &Old); if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_REBOOT) { NtShutdownSystem(ShutdownReboot); } else { if (FALSE) { /* FIXME - only show this dialog if it's a shutdown and the computer doesn't support APM */ DialogBox(hAppInstance, MAKEINTRESOURCE(IDD_SHUTDOWNCOMPUTER), GetDesktopWindow(), ShutdownComputerWindowProc); } NtShutdownSystem(ShutdownNoReboot); } RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, Old, FALSE, &Old); return STATUS_SUCCESS; }
int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd) { #if 0 LSA_STRING ProcessName, PackageName; HANDLE LsaHandle; LSA_OPERATIONAL_MODE Mode; BOOLEAN Old; ULONG AuthenticationPackage; NTSTATUS Status; #endif ULONG HardErrorResponse; MSG Msg; UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); UNREFERENCED_PARAMETER(nShowCmd); hAppInstance = hInstance; if (!RegisterLogonProcess(GetCurrentProcessId(), TRUE)) { ERR("WL: Could not register logon process\n"); NtShutdownSystem(ShutdownNoReboot); ExitProcess(0); } WLSession = (PWLSESSION)HeapAlloc(GetProcessHeap(), 0, sizeof(WLSESSION)); if (!WLSession) { ERR("WL: Could not allocate memory for winlogon instance\n"); NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse); ExitProcess(1); } ZeroMemory(WLSession, sizeof(WLSESSION)); WLSession->DialogTimeout = 120; /* 2 minutes */ if (!CreateWindowStationAndDesktops(WLSession)) { ERR("WL: Could not create window station and desktops\n"); NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse); ExitProcess(1); } LockWorkstation(WLSession); /* Load default keyboard layouts */ if (!InitKeyboardLayouts()) { ERR("WL: Could not preload keyboard layouts\n"); NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse); ExitProcess(1); } if (!StartServicesManager()) { ERR("WL: Could not start services.exe\n"); NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse); ExitProcess(1); } if (!StartLsass()) { ERR("WL: Failed to start lsass.exe service (error %lu)\n", GetLastError()); NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, OptionOk, &HardErrorResponse); ExitProcess(1); } /* Wait for the LSA server */ WaitForLsass(); /* Load and initialize gina */ if (!GinaInit(WLSession)) { ERR("WL: Failed to initialize Gina\n"); DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), GetDesktopWindow(), GinaLoadFailedWindowProc, (LPARAM)L""); HandleShutdown(WLSession, WLX_SAS_ACTION_SHUTDOWN_REBOOT); ExitProcess(1); } DisplayStatusMessage(WLSession, WLSession->WinlogonDesktop, IDS_REACTOSISSTARTINGUP); #if 0 /* Connect to NetLogon service (lsass.exe) */ /* Real winlogon uses "Winlogon" */ RtlInitUnicodeString((PUNICODE_STRING)&ProcessName, L"Winlogon"); Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode); if (Status == STATUS_PORT_CONNECTION_REFUSED) { /* Add the 'SeTcbPrivilege' privilege and try again */ Status = RtlAdjustPrivilege(SE_TCB_PRIVILEGE, TRUE, TRUE, &Old); if (!NT_SUCCESS(Status)) { ERR("RtlAdjustPrivilege() failed with error %lu\n", LsaNtStatusToWinError(Status)); return 1; } Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode); } if (!NT_SUCCESS(Status)) { ERR("LsaRegisterLogonProcess() failed with error %lu\n", LsaNtStatusToWinError(Status)); return 1; } RtlInitUnicodeString((PUNICODE_STRING)&PackageName, MICROSOFT_KERBEROS_NAME_W); Status = LsaLookupAuthenticationPackage(LsaHandle, &PackageName, &AuthenticationPackage); if (!NT_SUCCESS(Status)) { ERR("LsaLookupAuthenticationPackage() failed with error %lu\n", LsaNtStatusToWinError(Status)); LsaDeregisterLogonProcess(LsaHandle); return 1; } #endif /* Create a hidden window to get SAS notifications */ if (!InitializeSAS(WLSession)) { ERR("WL: Failed to initialize SAS\n"); ExitProcess(2); } //DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_PREPARENETWORKCONNECTIONS); //DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGCOMPUTERSETTINGS); /* Display logged out screen */ WLSession->LogonState = STATE_LOGGED_OFF; RemoveStatusMessage(WLSession); /* Check for pending setup */ if (GetSetupType() != 0) { TRACE("WL: Setup mode detected\n"); /* Run setup and reboot when done */ SwitchDesktop(WLSession->ApplicationDesktop); RunSetup(); } else PostMessageW(WLSession->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_TIMEOUT, 0); /* Tell kernel that CurrentControlSet is good (needed * to support Last good known configuration boot) */ NtInitializeRegistry(CM_BOOT_FLAG_ACCEPTED | 1); /* Message loop for the SAS window */ while (GetMessageW(&Msg, WLSession->SASWindow, 0, 0)) { TranslateMessage(&Msg); DispatchMessageW(&Msg); } /* We never go there */ return 0; }
static int reboot(int flags) { #ifdef _WIN32_WCE if(flags != RB_AUTOBOOT) { errno = EINVAL; return -1; } #ifdef _USE_KIOCTL if(!KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL)) return -1; #else unsigned long int e = SetSystemPowerState(NULL, POWER_STATE_RESET, 0); if(e) { SetLastError(e); return -1; } #endif #else if(enable_shutdown_privilege() < 0) return -1; #ifdef _WIN32_WNT_NATIVE SHUTDOWN_ACTION action; switch(flags) { case RB_AUTOBOOT: action = ShutdownReboot; break; case RB_HALT_SYSTEM: action = ShutdownNoReboot; break; default: errno = EINVAL; return -1; } long int status = NtShutdownSystem(action); if(status < 0) { __set_errno_from_ntstatus(status); return -1; } #else #ifdef _USE_EWX unsigned int wflags = EWX_FORCE; switch(flags) { case RB_AUTOBOOT: flags |= EWX_REBOOT; break; case RB_HALT_SYSTEM: flags |= EWX_SHUTDOWN; break; default: errno = EINVAL; return -1; } if(!ExitWindowsEx(wflags, 0)) { __set_errno_from_oserror(); return -1; } #else if(!InitiateSystemShutdownW(NULL, NULL, 0, 1, flags & EWX_REBOOT)) { __set_errno_from_oserror(); return -1; } #endif #endif /* _WIN32_WNT_NATIVE */ #endif /* _WIN32_WCE */ while(1) sleep(10000); }