Computer instant herunterfahren

03/02/2012 22:08 kleinernascher4#1
Weiss jemand wie man mit einem (vertretbaren aufwand^^) in c++ einen computer instant herunterfährt (so, als wäre das strom gekappt worden)?

so wie dieses tool hier z.B:[Only registered and activated users can see links. Click Here To Register...]
03/02/2012 22:36 .SkyneT.#2
In der ntdll.dll sollte man mit der "NtShutdownSystem" Funktion etwas anfangen können.
03/02/2012 22:38 Schwalli!#3
zieh doch einfach den Stecker raus wenn du den sofort aus haben wills?
03/02/2012 23:21 MrSm!th#4
Das dürfte nur über einen Treiber per ACPI gehen, habe aber keine genaueren Kenntnisse über die Usermode NT API.
03/03/2012 10:00 kleinernascher4#5
ntdll.dll hab ich jetzt mal mit LoadLibrary aufgerufen...
dann mit GetProcAddress die funktion gefunden...
alles klappt wunderbar, beide geben eine vernünftige zahl zurück...
aber (n00bfrage:D) wie rufe ich die funktion jetzt auf (also die NtShutdownSystem)??
(hab sowas noch NIE gemacht^^)

wenns geht, kann mir jemand büdde ein kleines codebeispiel schreiben damit ich sehe wie ich dat ding jetzt zum laufen bring:)

danke schonmal ^^
03/03/2012 10:11 jacky919#6
[Only registered and activated users can see links. Click Here To Register...] gibt dir den Funktionszeiger zu der gesuchten Funktion zurück. Über den Zeiger kannst du die Funktion aufrufen.

Beispiel: [Only registered and activated users can see links. Click Here To Register...]
03/03/2012 12:25 kleinernascher4#7
aber NtShutdownSystem benötigt doch einen der 3 parameter

ShutdownNoReboot,
ShutdownReboot,
ShutdownPowerOff

ShutdownPowerOff scheint der richtige zu sein(gehe ich jetzt mal fest davon aus :))

Code:
FARPROC Shutdown;
HMODULE hNtdll;
UINT Func;

hNtdll = ::LoadLibrary(L"NTDLL.DLL");
Shutdown = ::GetProcAddress (hNtdll,"NtShutdownSystem");
so und jetzt kommts^^
also wie ich denem link entnehmen konnte, müsste die nächste zeile so aussehen:

Code:
Func = Shutdown(ShutdownPowerOff);
jedoch kommt (wie erwartet^^) eine Fehlermeldung:

error C2065: 'ShutdownPowerOff': nichtdeklarierter Bezeichner

hmmm... is ja eigentlich klar, ShutdownPowerOff is ja nirgends definiert.
also wie soll ich es dann machen? weiss wer noch was dazu?
03/03/2012 12:41 jacky919#8
Code:
typedef enum _SHUTDOWN_ACTION
{
	ShutdownNoReboot,
	ShutdownReboot,
	ShutdownPowerOff
} SHUTDOWN_ACTION, *PSHUTDOWN_ACTION;
Das laden der Funktion würde etwa so funktionieren:
Code:
typedef DWORD (WINAPI* lpNtShutdownSystem)(SHUTDOWN_ACTION);

HINSTANCE hDLL  = LoadLibrary(L"ntdll.dll");

lpNtShutdownSystem NtShutdownSystem = (lpNtShutdownSystem)GetProcAddress(hDLL, "NtShutdownSystem");
Ausführen dann so:
Code:
NtShutdownSystem(ShutdownPowerOff);
03/03/2012 12:49 kleinernascher4#9
sorry, aber ich bin mir der materie nicht so vertraut... was soll ich damit machen:confused:
03/03/2012 12:51 jacky919#10
Hab meinen Beitrag editiert, guck ihn nochmal an.
03/03/2012 14:01 kleinernascher4#11
danke funkt wunderbar, thx^^
03/03/2012 14:30 .SkyneT.#12
Noch ne Vorraussetzung, damit das funktioniert sind system privileges.
(OpenProcessToken / AdjustTokenPrivileges)

Dann mit LoadLibrary die ntdll.dll laden.
GetProcAdress für den Pointer auf "NtShutdownSystem"...

Und letztendlich noch etwas in der Richtung:
Code:
   typedef int (__stdcall * FUNC)(DWORD);

   FUNC shutitdown;
   shutitdown = FUNC(PointerToNtShutdownSystem);

   shutitdown( 2 );
   FreeLibrary(.....); //A handle to the loaded library module (return von LoadLibrary)
Dann sollte das eigentlich funktionieren, habs mal kompiliert.

[Only registered and activated users can see links. Click Here To Register...] ist das Ergenis (schau dir an ob du dir das so vorstellst;) ).

Edit: Ah hab ich schon wieder Seite 2 übersehen :rolleyes:
03/04/2012 17:07 Strean#13
nimm doch einfach system("shutdown - ( parameter weiß ich gerade net )");
03/04/2012 17:12 jacky919#14
Quote:
Originally Posted by Strean View Post
nimm doch einfach system("shutdown - ( parameter weiß ich gerade net )");
Das würde Windows ganz normal herunterfahren. Er möchte aber, dass der PC ausgeht als ob er den Stecker ziehen würde.
03/04/2012 18:19 MrSm!th#15
Interessant :> Wusste gar nicht, dass Windows eine API Funktion zum PowerOff bereitstellt.

Quote:
Originally Posted by Strean View Post
nimm doch einfach system("shutdown - ( parameter weiß ich gerade net )");
Dann nenn mir doch mal den Parameter, der ein sofortiges PowerOff herbeiführt oO
Außerdem ist system() böse.