Om du skall ge dig in i detta, så måste du förstå vad jag gjort nedan. Avstå annars.
Kod:
typedef WINADVAPI
BOOL
APIENTRY
(*InitiateSystemShutdownExAFunc)(
IN LPSTR lpMachineName,
IN LPSTR lpMessage,
IN DWORD dwTimeout,
IN BOOL bForceAppsClosed,
IN BOOL bRebootAfterShutdown,
IN DWORD dwReason
);
void __fastcall TForm1::systemShutDown( bool Reboot )
{
static bool gotpriv = false;
if( !gotpriv) {
HANDLE processToken;
if( OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &processToken)) {
TOKEN_PRIVILEGES provValue;
if( LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &provValue.Privileges[0].Luid)) {
provValue.PrivilegeCount = 1;
provValue.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges (processToken, false, &provValue, sizeof(TOKEN_PRIVILEGES), NULL, 0);
gotpriv = true;
}
}
}
HINSTANCE hinst = LoadLibraryEx("Advapi32.dll", NULL, 0);
InitiateSystemShutdownExAFunc func;
if( hinst) {
func = (InitiateSystemShutdownExAFunc)GetProcAddress(hinst, "InitiateSystemShutdownExA");
DWORD err = func("", NULL, 0, true, Reboot, 0x00030001);
}
}
I ovanstående är kärnan i hur man stänger en Windows maskin.
Något nedklippt i vissa delar jag ansåg var ovidkommande för funktionen, bl.a. test på "err".
Och som ni ser väljer jag vid anrop av metoden om det är Reboot eller Shutdown jag vill nå.