[Win32] - Shutdown, Restart, LogOff, Standby per API

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

d-bug

Betreff: [Win32] - Shutdown, Restart, LogOff, Standby per API

BeitragSo, Dez 16, 2007 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

aus meinem kleinen OSX-Shutdowndialog-Klon - ChaosShut stelle ich euch mal folgende kleine lib zur Verfügung.
Die Funktionen sind auf jeden Fall für XPproofed, wurden aber auf Vista noch nicht getestet.


ACHTUNG
Ihr solltet auf JEDEN Fall während des Programmierens mit diesen Funktionen den Debug-Modus anschalten, sonst
fahrt ihr euch dauernd den Rechner runter...


Code: [AUSKLAPPEN]
'Shutdownlib


?win32
   Import "-lkernel32"
   Import "-ladvapi32"
?

'-- INITIALISIERUNG --
Extern "Win32"
   Function OpenProcessToken (ProcessHandle:Int, DesiredAccess:Int, TokenHandle:Byte Ptr)
   Function LookupPrivilegeValue (lpSystemName$z, lpName$z, lpLuid:Byte Ptr) = "LookupPrivilegeValueA@12"
   Function AdjustTokenPrivileges (TokenHandle:Int, DisableAllPrivileges:Int, NewState:Byte Ptr,BufferLength:Int, PreviousState:Byte Ptr, ReturnLength:Byte Ptr)
   Function GetVersion ()
   Function GetCurrentProcess ()
   Function SetSystemPowerState (fSuspend:Int, fForce:Int)
   Function ExitWindowsEx (uFlags:Int,dwReserved:Int=0)
   Function GetLastError ()
End Extern


Private
   Function EnableShutdownPrivileges:Int ()
         ?win32
            Const TOKEN_ADJUST_PRIVILEGES:Int = $20
            Const TOKEN_QUERY:Int = $8
            Const SE_PRIVILEGE_ENABLED:Int = $2
            Local tokenPrivilege:Int[4]
            If LookupPrivilegeValue(Null, "SeShutdownPrivilege", Byte Ptr(tokenPrivilege)+4)
               Local hProc:Int = GetCurrentProcess() ' -1
               Local hToken:Int
               If OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, Varptr(hToken))
                  tokenPrivilege[0] = 1
                  tokenPrivilege[3] = SE_PRIVILEGE_ENABLED
                  If AdjustTokenPrivileges(hToken, False, Byte Ptr(tokenPrivilege), Null, Null, Null)
                     Return True
                  EndIf
               EndIf
            EndIf
         ?
      End Function
Public


'Rechner in Hibernation versetzen
Function ForceHibernation ()
      ?debug
         WriteStdout("Hibernate") ; End
      ?win32
         If EnableShutdownPrivileges()
            SetSystemPowerState(True, False)
         EndIf
      ?
   End Function


'Rechner in StandBy versetzen
Function ForceStandby ()
      ?debug
         WriteStdout("Standby") ; End
      ?win32
         If EnableShutdownPrivileges()
            SetSystemPowerState(False, False)
         EndIf
      ?
   End Function


'Benutzer ausloggen
Function ForceLogOff ()
      ?debug
         WriteStdout("LogOff") ; End
      ?win32
         If EnableShutdownPrivileges()
            ExitWindowsEx $0 | $4 * False
         EndIf
      ?
   End Function


'Rechner herunterfahren
Function ForceShutdown ()
      ?debug
         WriteStdout("Shutdown") ; End
      ?win32
         If EnableShutdownPrivileges()
            ExitWindowsEx $8 | $4 * False
         EndIf
      ?
   End Function


'Rechner neu starten
Function ForceRestart ()
      ?debug
         WriteStdout("Restart") ; End
      ?win32
         If EnableShutdownPrivileges()
            ExitWindowsEx $2 | $4 * False
         EndIf
      ?
   End Function

Blitzcoder

Newsposter

BeitragSo, Dez 16, 2007 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
d-bug, wäre es nich schöner, den shutdown-Befehl zu nehmen? Der geht auf jeden Fall auf jedem Windows=>2000.

Herunterfahren: shutdown -s -t 00
Neustart: shutdown -r -t 00
Logoff: shutdown -l -t 00


Wenn man noch -f angibt, werden alle Anwendugen ohne Test und Warnung gekillt.

MfG
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

d-bug

BeitragSo, Dez 16, 2007 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Halte ich für Geschmacksache und ich lernte viel daraus... Wink

Zur Erkärung:

Es gibt in OSX-Klon Kreisen ein Programm namens iShut, dass sich in Shutdown.exe umbenennen lässt und somit die
gleiche Funktion wie das Original erfüllt. Sollte einer meiner ChaosShut-"Kunden" dieses installiert haben, würde er
dann zwangsläufig erst meinen Dialog und dann den von iShut sehen.

Außerdem hatte ich eigentlich mal geplant gehabt den original Shutdown-Dialog von Windows duch ChaosShut ersetzen
zu lassen, änderte aber rasch meinen Plan, weil ich den benötigten Functionhook nicht hin bekam. Dann hätte ich sowieso
auf ExitWindowsEx hooken müssen...

hat sich aber jetzt alles für mich erledigt! Siehe Sig.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group