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 DAU (DümmsterAnzunehmenderUser): “Ey, Mann Ich hab dein Programm angeklickt, der PC ist dann heruntergefahren  und Ich hab wertvolle Daten verloren.“ )

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 "LUID" sind die PrivilegLevel

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, NULL                            ;jetzt Windows herunterfahren!

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.