Гм.. не знаю, что у тебя там не работает, но следующий код отлчно ребутает машину
#include "windows.h"
// Определяем параметры
typedef enum _SHUTDOWN_ACTION
{
ShutdownNoReboot,
ShutdownReboot,
ShutdownPowerOff
} SHUTDOWN_ACTION;
// Прототип функции
typedef DWORD (WINAPI* ntShutdownSystem)(SHUTDOWN_ACTION Action);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE h;
// Получаем адрес процедуры
ntShutdownSystem NtShutdownSystem = (ntShutdownSystem)::GetProcAddress(::GetModuleHandleA("ntdll.dll"), "NtShutdownSystem");
if (!NtShutdownSystem) { return 0; }
// Открываем токен текущего процесса
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES, &h))
{
// Если все в порядке
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount=1;
// Получаем привилегии
if(!LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &(tp.Privileges[0].Luid)))
{ return 0; }
// Изменяем
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Устанавливаем новые привилегии
::AdjustTokenPrivileges(h, false, &tp, sizeof(tp), NULL, NULL);
// Перегружаем
NtShutdownSystem(ShutdownReboot);
// Закрываем хендл
CloseHandle(h);
}
return 0;
}