| Код | private procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
{...}
function SetPrivilege(PrivilegeName: String; AEnabled: Boolean): Boolean; var TPPrev, TP: TTokenPrivileges; Token: THandle; dwRetLen: DWORD; begin Result := False; if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then try if LookupPrivilegeValue(nil, PChar(PrivilegeName),TP.Privileges[0].LUID) then begin TP.PrivilegeCount := 1; if AEnabled then TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else TP.Privileges[0].Attributes := 0; dwRetLen := 0; Result := AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen); end; finally CloseHandle(Token); end else RaiseLastOSError; end;
procedure TForm1.FormCreate(Sender: TObject); const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; begin if not SetPrivilege(SE_SHUTDOWN_NAME, True) then RaiseLastOSError; end;
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession); begin inherited; Message.Result := 0; AbortSystemShutdown(nil);
// тут делаешь свое резервное копирование
InitiateSystemShutdown(nil, nil, 0, True, False); // вырубаешь винду
end; |
Скажу честно, постил "вслепую" (т.е. код не проверял), поэтому могут быть мелкие очепятки. |