Windows Beenden :
Von Heinz - Volker Viehof
Auf die Problemstellung habe ich auf einigen Programmiererseiten meist nur unvollständige
Lösungen gefunden. Viele waren darüber am Diskutieren warum „ExitWindowsEx“ bei ihnen nicht funktioniert ,aber die haben alle vergessen ihrem Programm den nötigen PrivilegLevel zu vergeben, ohne die Windows einer Anwendung nicht gestattet das System herunterzufahren. Hier ist nur das AssemblyListing, wer das Ausprobieren will, muss sich eben den kostenlosen MASM32 herunterladen und das selbst Kompilieren.
(Mir war’s auch zu heikel hier ne fertige .exe zu Präsentieren,
denn sonst schreibt mir nachher irgendein Wasserdichter DA
Hier ist eine möglichkeit Windows aus einer Anwendung heraus herunterzufahren, zu beenden und falls möglich den PC auszuschalten:
;
!! Achtung !! fährt das System herunter und
;
schaltet (wenn möglich) PC ab ,
;
ungeachtet offener Dateien , Outlook etc.
;_____________________________________________________________________
.586
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
kick_off PROTO :DWORD
ExitWindowsEx PROTO
:DWORD,:DWORD
AdjustTokenPrivileg PROTO
:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
OpenProcessToken PROTO
:DWORD,:DWORD,:DWORD
LookupPrivilegeValue PROTO
:DWORD,:DWORD,:DWORD
GetCurrentProcess PROTO
.data?
dwCP dd ?
.data
signatur db "<C> 2004 Heinz - Volker
Viehof",0
sushi db "SeShutdownPrivilege",0
.code
start:
invoke
kick_off ,EWX_POWEROFF ;Programme schliessen & Beenden
invoke
kick_off ,EWX_POWEROFF or EWX_FORCE ;auf jeden Fall Beenden!
kick_off proc opt:DWORD
LOCAL tPriv:TOKEN_PRIVILEGES ;struktur TOKEN_PR.
LOCAL hTk: HANDLE ;handle
von token
invoke GetCurrentProcess ;holt ProcessID
mov
dwCP,eax ;und in "dwCP" damit !
lea
eax,hTk ;position für handle in eax
invoke
OpenProcessToken ,dwCP ,28h ,eax ;holt token des Prozesses
lea
eax,tPriv.Privileges[0].Luid ;in "L
invoke LookupPrivilegeValue ,0 ,addr sushi ,eax
;shutdownprivileg dem process geben
mov tPriv.PrivilegeCount,1 ;privileg
counter
mov tPriv.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED ;und attribute
lea
eax,tPriv ;ort der
privileg struktur
invoke
AdjustTokenPrivileges, hTk, 0, eax, 0,0,0 ;privileglevel neu setzen
invoke
ExitWindowsEx, opt, N
ret ;ret ? wozu ?
kick_off endp
END
start
Im ersten durchlauf versucht das Programm alle offen Dateien
zu schließen wenn das dann nicht vollständig funktioniert hat (dafür brauchst
du keine extra Fehlerabfrage, wenn ExitWindowsEx beim ersten durchlauf versagt
hat, wird ja das „ret“ erreicht und der zweite durchlauf gestartet, mit der Option
EWX_FORCE wird Windows „gezwungen“ das System herunterzufahren.
Getestet unter Windows2000Pro auf’m IBM ThinkPad 570.
Ist als einzelnes Programm vielleicht nicht so sinnvoll (ausser
man ist zu faul Windows normal zu beenden), ist auch nicht als Ersatz für die
reguläre Methode gedacht. Achtung : Datenverluste sind nicht auszuschliessen
!!!
Möglicher Einsatz wären Sicherheitslösungen z.B.: nach
falscher Passworteingabe oder wenn das BIOS bedenkliche Betriebszustände (zu
hohe oder zu niedrige Spannungen ,Temperatur, o.ä.) meldet.