Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Windows in 5 Sekunden ausschalten, aber wie? (https://www.delphipraxis.net/59958-windows-5-sekunden-ausschalten-aber-wie.html)

Mazel 31. Dez 2005 14:02


Windows in 5 Sekunden ausschalten, aber wie?
 
Hallo,

mein Vater wünscht sich ein kleines Tool mit dem er seinen Rechner schneller herunterfahren kann. Momentan dauert dies mehr als 30 Sekunden. Nun habe ich mein eigenes ShutDown Tool geschrieben welches aber immer noch nicht schnell genug für ihn ist. Ich habe im Internet ein Tool namens Super Fast ShutDown gefunden, dass den Rechner in 5 Sekunden ausschaltet.

Ich frage mich, wie die Entwickler das gemacht haben? Wird da eine Windows Message oder direkt eine Message zum "Powerknopf" gesendet? Oder doch anders?


Gruß
Mazel

faux 31. Dez 2005 14:05

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Hallo!

Das Programm wird unter anderem die Zeit, die ein Programm zum beenden hat (standardmäßig 30sec glaube ich) einfach auf ein Minimum herabsetzen, denke ich mal.

Grüße
Faux

mirage228 31. Dez 2005 14:06

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Hi,

Eventuell wird der Parameter EWX_FORCRE bei ExitWindowsEx() verwendet. Damit werden laufende Anwendung auf eine nicht nette Weise beendet - und das ist schneller ;)

mfG
mirage228

Matze 31. Dez 2005 14:10

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Hier paar Tipps von Meister Google:

Zitat:

- HKEY_LOCAL_MACHINE/System/Controlset/Control
->"Wait to Kill Service Timeout" herabsetzen
- HKEY_CURRENT_USER/Control Panel/Desktop
->"Wait to Kill App Timeout" herabsetzen
- HKEY_CURRENT_USER/Control Panel/Desktop
->"AutoEndTasks" auf 1 ändern

St.Pauli 31. Dez 2005 14:12

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Als erstes das und dann gibt es noch so eine Option, dass die Auslagerungsdatei überschrieben wird beim Herunterfahren. Das kostet auch ganz schön Zeit. Die Option könntest du daher auch ggf. deaktivieren.

Mazel 31. Dez 2005 14:49

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Danke für die Antworten.

EWX_FORCRE bei ExitWindowsEx() hab ich schon probiert, es ist zwar schneller, beendet alle Programme ohne Rücksicht auf Verlust, aber es dauert trotzdem noch lange.

Zitat:

Hier paar Tipps von Meister Google:

Zitat:
- HKEY_LOCAL_MACHINE/System/Controlset/Control
->"Wait to Kill Service Timeout" herabsetzen
- HKEY_CURRENT_USER/Control Panel/Desktop
->"Wait to Kill App Timeout" herabsetzen
- HKEY_CURRENT_USER/Control Panel/Desktop
->"AutoEndTasks" auf 1 ändern
Das erste ist mir bekannt, die anderen 2 nicht. Dann müsste ich beim Beenden die Werte ändern und wenn der PC neu gestartet wieder auf Standard setzten, damit das normale Beenden von Windows aus auch wieder funktioniert.

Gruß
Mazel

DevilsCamp 31. Dez 2005 15:43

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Wenn deinem Vater das herunterfahren zu lange dauert, dann sollte er denn Netzstecker ziehen. Das geht am schnellsten...

:angel2: :spin2:

noch_ein_hannes 31. Dez 2005 16:19

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
... muss Dein Vater denn unbedingt zuschauen wie der Rechner ausgeht? :-)

Ratte 31. Dez 2005 17:16

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Vielleciht geht der Rechner auch in Wirklichkeit in Suspend-to-Disk (und dreht dann irgendwie den Saft ab)? Ich hab' k. A. ob das (schneller) geht.

Ratte

phXql 31. Dez 2005 17:17

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Zitat:

Zitat von Ratte
Vielleciht geht der Rechner auch in Wirklichkeit in Suspend-to-Disk (und dreht dann irgendwie den Saft ab)? Ich hab' k. A. ob das (schneller) geht.

Ratte

Nein, Suspend To Disk ist noch langsamer, weil der gesamte inhalt des RAMs auf die Platte geschrieben wird. Suspend to RAM is das schnellste, aber wenn man dann den PC den saft abdreht, is halt blöd, weil dann die daten verloren sind.

Mazel 31. Dez 2005 17:23

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
@noch_ein_hannes:
Er hat die Angewohnheit solange vor dem Rechner zu sitzen, bis das Lämpchen am Bildschirm rot blinkt.
Erst dann ist er sich sicher, dass der Computer auch aus ist.

Ich habe vorhin versucht den PC schneller zu machen, in dem ich die weiter oben erwähnten Werte in der Registry ändere, aber leider ohne Erfolg.

Luckie 31. Dez 2005 17:25

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Der Recner von meinem vater braucht auch ewig, im Vergleich zu meinem, zum Runterfahren, aber der hat auch mehr Programme in der TNA, als ich zusätzlich Anwendungen installiert. ;)

PierreB 31. Dez 2005 17:30

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Anstatt das angesprochene "Super Fast Shutdown" Programm zu benutzen kann man auch gleich auf den Powerknopf drücken, Resultat ist das Gleiche.
Zitat:

Mit dem Programm beendet Windows innerhalb von Sekundenbruchteilen die Arbeit. Alles wird aus dem Speicher geworfen – und der Rechner abgeschaltet. Allerdings ohne Rücksicht auf das Thema Sicherheit zu nehmen. Sollten einzelne Daten noch nicht gespeichert sein, kümmert das Super Fast Shutdown nicht weiter. Eventuell noch nicht gespeicherte Eingaben oder Korrekturen gehen also verloren. Wer Super Fast Shutdown benutzt, sollte sich über diesen Nachteil im Klaren sein.
Quelle: http://www.schieb.de/tipps/result.php?id=427880_2

Stanlay Hanks 31. Dez 2005 17:31

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Moin. Schau dir mal AntiSpy XP an. Da gibt es eine Option "Schnelles Herunterfahren aktivieren". Vielleicht reicht das deinem Vater schon aus.

Man liest sich, Stanlay :hi:

c113plpbr 31. Dez 2005 17:38

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Man nehme einen Disassembler ...

Es ruft zum herunterfahren die NT-Native Funktion NtShutdownSystem mit dem Parameter ShutdownNoReboot auf und zum neustarten dasselbe, nur mit dem Parameter ShutdownReboot.

Gute "Headerdateien" für die NT-Native-API findest du hier.

Jedoch bezweifle ich, dass diese Methode gut für einen Computer sein kann ...

ciao, Philipp

Mazel 31. Dez 2005 18:29

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Danke c113plpbr, jedoch habe ich keine Ahnung, wie ich die Komponente verwende bzw. wie ich eine Disassembler baue.

Gruß
Mazel

c113plpbr 31. Dez 2005 18:35

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Zitat:

Zitat von Mazel
Danke c113plpbr, jedoch habe ich keine Ahnung, wie ich die Komponente verwende bzw. wie ich eine Disassembler baue.

Musst du das denn?

Einfach die ntapi runterladen, in den Delphi-suchpfad einbinden, dann per
Delphi-Quellcode:
uses
  JwaNative;
ins projekt einbinden, und dann irgendwo im quelltext
Delphi-Quellcode:
NtShutdownSystem(ShutdownNoReboot);
schreiben ...

-> gaaanz einfach ...

ciao, Philipp

mh166 31. Dez 2005 18:42

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Zitat:

Zitat von phXql
Nein, Suspend To Disk ist noch langsamer, weil der gesamte inhalt des RAMs auf die Platte geschrieben wird. Suspend to RAM is das schnellste, aber wenn man dann den PC den saft abdreht, is halt blöd, weil dann die daten verloren sind.

Also das will ich jetzt einfach mal als Quatsch dahinstellen! Ich habs gerade noch mal gestoppt, um meine These auch mit statistischen Werten zu belegen:

:arrow: normal herunterfahren: 24s
:arrow: Ruhezustand: 11s

Das ganze bei einm Arbeitsspeicher von 512MB und mit nem AMD Sempron 2200+ (1,5GHz). Beide Messungen wurden nach einem Kaltstart gemacht.

Das scheint mir auch ziemlich logisch: 512MB auf die Pladde schreiben braucht halt viel weniger Zeit, als die ganzen Dienste und Anwendungen zu stoppen und normal zu beenden. Denn so muss einfach nur kopiert werden und schon kann der Stecker gezogen werden. Dass der Start dadurch auch beschleunigt wird (45s statt 83s) is dann ja auch nur logisch. Hier muss ja bloß der Schmarn zurückkopiert und die Peripherie aktiviert werden.

mfg, mh166

Mazel 31. Dez 2005 19:53

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
@c113plpbr:

Hab mir nun mal die ntapi geladen, und das alles so gemacht wie du es geschrieben hast. Habs mit einem ButtonClick Ereignis verbunden, jedoch passiert nichts. Muss ich da noch irgend was anderes machen? Ich mühe mich gearde mal durch die jwanative durch, um zu verstehen was da passiert, aber momentan noch ohne erfolg.

Gruß
Mazel

Mazel 31. Dez 2005 21:15

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
So, habs nun denke ich geschafft, laufen tut's aber ob es so richtig ist, weiss ich nicht:

Delphi-Quellcode:
uses
 jwaNative;

{$R *.dfm}

function TForm1.ExWindows(const AFlag: Word): Boolean;
var
 vi: TOSVersionInfo;
 hToken: THandle;
 tp: TTokenPrivileges;
 h: DWord;

begin
 Result:=False;
 vi.dwOSVersionInfoSize:=SizeOf(vi);
 If GetVersionEx(vi) then
  begin
   If vi.dwPlatformId = VER_PLATFORM_WIN32_NT then
    begin
     If OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken) then
      begin
       LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid);
       tp.PrivilegeCount:=1;
       tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
       h:=0;
       AdjustTokenPrivileges(hToken, False, tp, 0, PTokenPrivileges(nil)^, h);
       CloseHandle(hToken);
       
       //Hier nun der besondere Teil
       NtShutdownSystem(SHUTDOWNNOREBOOT);

      end;
    end
   Else Result:=ExitWindowsEx(Aflag, 0);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ExWindows(EWX_SHUTDOWN or EWX_FORCE);
end;

end.
Gruß
Mazel

c113plpbr 31. Dez 2005 21:54

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Jop, das sollte schon richtig sein, ich wusste bis vorhin nicht, dass man sich zum herunterfahren erst die rechte holen muss ...

... denn das shutdown-tool-dingens tut sowas ähnliches zwar, allerdings in sehr verkürzter form ... mich wunderts, dass das überhaupt funktioniert:

Code:
Sub Main()
'N 00401630 51                   push ecx
'N 00401631 8D442400             lea eax, dword ptr [esp]
'N 00401635 56                   push esi
'N 00401636 50                   push eax
'N 00401637 6A00                 push 0
'N 00401639 6A01                 push 1
'N 0040163B 6A13                 push 13h
'N 0040163D C744241400000000     mov dword ptr [esp+14h], 0
'N 00401645 E8FFFFFCD2           call L0040131C
'N                              * API ref: RtlAdjustPrivilege
'N 0040164A 8B3510104000         mov esi, dword ptr [L00401010]
'N                              * ref: __vbaSetSystemError
'N 00401650 FFD6                 call esi
'N 00401652 6A00                 push 0
'N 00401654 E8FFFFFD0F          call L00401368
'N                              * API ref: NtShutdownSystem
'N 00401659 FFD6                 call esi
'N 0040165B 5E                  pop esi
'N 0040165C 59                   pop ecx
'N 0040165D C3                   ret
End Sub
na egal ... ^^

ciao, Philipp

thomasw 31. Dez 2005 22:09

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
RtlAdjustPrivilege ist lediglich die bequeme (allerdings auch undokumentierte) Art Privillegien zu aktivieren bzw. deaktivieren.

Mazel 31. Dez 2005 22:23

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
@thomasw:

RtlAdjustPrivilege hab ich auch irgendwo gefunden, das war aber in VB, daher hab ich das sein lassen.

@c113plpbr: Danke für den Hinweis mit der ntapi. :thumb:

Danke nochmal an all
SUPER

Gruß
Mazel

phXql 1. Jan 2006 09:23

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Zitat:

Zitat von mh166
Zitat:

Zitat von phXql
Nein, Suspend To Disk ist noch langsamer, weil der gesamte inhalt des RAMs auf die Platte geschrieben wird. Suspend to RAM is das schnellste, aber wenn man dann den PC den saft abdreht, is halt blöd, weil dann die daten verloren sind.

Also das will ich jetzt einfach mal als Quatsch dahinstellen! Ich habs gerade noch mal gestoppt, um meine These auch mit statistischen Werten zu belegen:

:arrow: normal herunterfahren: 24s
:arrow: Ruhezustand: 11s

Das ganze bei einm Arbeitsspeicher von 512MB und mit nem AMD Sempron 2200+ (1,5GHz). Beide Messungen wurden nach einem Kaltstart gemacht.

Das scheint mir auch ziemlich logisch: 512MB auf die Pladde schreiben braucht halt viel weniger Zeit, als die ganzen Dienste und Anwendungen zu stoppen und normal zu beenden. Denn so muss einfach nur kopiert werden und schon kann der Stecker gezogen werden. Dass der Start dadurch auch beschleunigt wird (45s statt 83s) is dann ja auch nur logisch. Hier muss ja bloß der Schmarn zurückkopiert und die Peripherie aktiviert werden.

mfg, mh166

Bei WinXP wundert mich das auch nicht, das brauch ja länger zum runter- als zum hochfahren ;). Bei meinem Win2k und 768 MB RAM dauert das Suspend-to-disk locker doppelt so lange wie das runterfahren. Ich würd mal sagen, das kommt ganz auf das OS und die platte drauf an ;)

himitsu 1. Jan 2006 10:07

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
klar dauert supend-to-disk länger,
denn beim normalen runterfahren wird alles "nur" beendet, wären bei suspend-to-disk einiges runtergefahren und der RAM auf Festplatte gespeichert wird.
Und die Festplatte ist nunmal nicht gerade schnell und es dauert halt etwas, bis z.B. bei mir so ein GB vom RAM auf Disk kopiert wurde.

Aber das liegt nicht nur an der Festplatte ... Windows scheint es ja nicht zu schaffen nur die belegten Speicherbereiche abzuspeichern.

Daniel Schuhmann 14. Jan 2006 11:04

Re: Windows in 5 Sekunden ausschalten, aber wie?
 
Zitat:

Zitat von himitsu
Windows scheint es ja nicht zu schaffen nur die belegten Speicherbereiche abzuspeichern.

Doch, es werden in der Tat nur die belegten Speicherbereiche gespeichert. Kannst Du leicht nachvollziehen, indem Du z.B. in ner Bildbearbeitung den RAM vollknallst. Da dauert SuspendToRam dann auch ewig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz