Написал такой вот код, когда обнаружил, что
ExitWindowsEx (EWX_POWEROFF, 0); под 98-м делает всего лишь LOGOFF
#include "windows.h"
#include <malloc.h>
///////////////////////////////////////////////////////////////////////////////
void Reboot (void)
{
HANDLE hToken;
TOKEN_PRIVILEGES* NewState;
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx (&OSVersionInfo);
if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
OpenProcessToken (GetCurrentProcess (),
TOKEN_ADJUST_PRIVILEGES, &hToken);
NewState = (TOKEN_PRIVILEGES*) malloc (sizeof (TOKEN_PRIVILEGES) +
sizeof (LUID_AND_ATTRIBUTES));
NewState->PrivilegeCount = 1;
LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, &NewState->Privileges[0].Luid);
NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL);
free (NewState); CloseHandle (hToken);
ExitWindowsEx (EWX_POWEROFF, 0);
}
if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
WinExec(
"RUNDLL.EXE user.exe,exitwindows",
SW_MINIMIZE
);
}
}
c ним все работает.
Но вот вопрос. Есть ли все таки решение получше? Возможно "RUNDLL.EXE user.exe,exitwindows", не работает на МЕ... нЕгде проверить.
И будет ли работать под ХР? Какую платформу он определит там? Годится ли "VER_PLATFORM_WIN32_NT" для ХР (для 2000-го годится), а "VER_PLATFORM_WIN32_WINDOWS" для МЕ?
ExitWindowsEx (EWX_POWEROFF, 0); под 98-м делает всего лишь LOGOFF
#include "windows.h"
#include <malloc.h>
///////////////////////////////////////////////////////////////////////////////
void Reboot (void)
{
HANDLE hToken;
TOKEN_PRIVILEGES* NewState;
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx (&OSVersionInfo);
if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
OpenProcessToken (GetCurrentProcess (),
TOKEN_ADJUST_PRIVILEGES, &hToken);
NewState = (TOKEN_PRIVILEGES*) malloc (sizeof (TOKEN_PRIVILEGES) +
sizeof (LUID_AND_ATTRIBUTES));
NewState->PrivilegeCount = 1;
LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, &NewState->Privileges[0].Luid);
NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL);
free (NewState); CloseHandle (hToken);
ExitWindowsEx (EWX_POWEROFF, 0);
}
if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
WinExec(
"RUNDLL.EXE user.exe,exitwindows",
SW_MINIMIZE
);
}
}
c ним все работает.
Но вот вопрос. Есть ли все таки решение получше? Возможно "RUNDLL.EXE user.exe,exitwindows", не работает на МЕ... нЕгде проверить.
И будет ли работать под ХР? Какую платформу он определит там? Годится ли "VER_PLATFORM_WIN32_NT" для ХР (для 2000-го годится), а "VER_PLATFORM_WIN32_WINDOWS" для МЕ?