[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]

    --------------------------------------------------------------------------------
    Some programs require Windows to be restarted once it is installed on
    the system for the first time. If your program has a similar need,
    you could use the following function -- WinExit() -- to shut down
    Windows, restart Windows, or log off the current user from Windows.

    function SetPrivilege(
      sPrivilegeName : string;
      bEnabled : boolean )
        : boolean;
    var
      TPPrev,
      TP         : TTokenPrivileges;
      Token      : THandle;
      dwRetLen   : DWord;
    begin
      Result := False;

      OpenProcessToken(
        GetCurrentProcess,
        TOKEN_ADJUST_PRIVILEGES
        or TOKEN_QUERY,
        @Token );

      TP.PrivilegeCount := 1;
      if( LookupPrivilegeValue(
            Nil,
            PChar( sPrivilegeName ),
            TP.Privileges[ 0 ].LUID ) )then
      begin
        if( bEnabled )then
        begin
          TP.Privileges[ 0 ].Attributes  :=
            SE_PRIVILEGE_ENABLED;
        end else
        begin
          TP.Privileges[ 0 ].Attributes  :=
            0;
        end;

        dwRetLen := 0;
        Result := AdjustTokenPrivileges(
                    Token,
                    False,
                    TP,
                    SizeOf( TPPrev ),
                    TPPrev,
                    dwRetLen );
      end;

      CloseHandle( Token );
    end;

    //
    // iFlags:
    //
    //  one of the following must be
    //  specified
    //
    //   EWX_LOGOFF
    //   EWX_REBOOT
    //   EWX_SHUTDOWN
    //
    //  following attributes may be
    //  combined with above flags
    //
    //   EWX_POWEROFF
    //   EWX_FORCE    : terminate processes
    //
    function WinExit( iFlags : integer ) : boolean;
    begin
      Result := True;
      if( SetPrivilege( 'SeShutdownPrivilege', True ) )then
      begin
        if( not ExitWindowsEx( iFlags, 0 ) )then
        begin
          // handle errors...
          Result := False;
        end;
        SetPrivilege( 'SeShutdownPrivilege', False )
      end else
      begin
        // handle errors...
        Result := False;
      end;
    end;

    WinExit() function was desinged to be used with 32 bit Windows programs
    (Win32) and it does not support restarting Windows without rebooting or
    logging off. If you're writing a program that will be run under
    Windows 3.x or Windows 95 and you want to restart windows without
    rebooting the machine (after installing device drivers, for example),
    you can use ExitWindows() Win16 function (don't forget to add WinProcs
    and WinTypes units to your uses section):

    ExitWindows( EW_RESTARTWINDOWS, 0 );

[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]