|
expert32win
|
 |
« : Октября 01, 2006, 09:18:54 am » |
|
Как в С++ реализовать перезагрузку WinXP в экстренном режиме тоесть без сохранения всех настроек (примерно как через RESET ) ? Дайте пример кода для консольного приложения пожалуйста.
|
|
|
|
prayer
|
 |
« Ответ #1 : Октября 01, 2006, 01:14:29 pm » |
|
Юзай ExitWindowsEx, не забыв в флаги поместить EWX_FORCE. Только зачем такое издевательство над системой?
|
|
|
|
expert32win
|
 |
« Ответ #2 : Октября 01, 2006, 02:35:46 pm » |
|
Огромное спасибо. Все работает.
|
|
|
|
expert32win
|
 |
« Ответ #3 : Октября 01, 2006, 06:18:01 pm » |
|
К сожалению в Win XP этим методом можно добится лишь LogOff В сети по этому поводу пишут такие страшные вещи будто для нормального функционирования ExitWindowsEx в XP следует получить какие то права доступа к некоторым ресурсам системы или что то типа того. Че как и где их получит кто-нить может толком обьяснить ?
|
|
|
|
Samael
|
 |
« Ответ #4 : Октября 01, 2006, 06:44:15 pm » |
|
Если не ошибаюсь, то тебе нужно иметь права SYSTEM. А вообще скинь плиз ссылку на эти места "в сети", где про это пишут -- интересно почитать =)
|
|
|
|
|
|
Samael
|
 |
« Ответ #6 : Октября 01, 2006, 10:03:50 pm » |
|
Гм.. не знаю, что у тебя там не работает, но следующий код отлчно ребутает машину #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; }
|
|
|
|
Samael
|
 |
« Ответ #7 : Октября 01, 2006, 10:05:39 pm » |
|
Кстати, забыл сказать: достало чистить твои темы, эта конкретно не имеет никакого отношения к Вижуалу... Напиши, что ты понял, а то у тебя сложилась традиция создавать новые темы, а не искать перенесенные.
|
|
|
|
expert32win
|
 |
« Ответ #8 : Октября 01, 2006, 10:08:42 pm » |
|
Я понял
|
|
|
|
expert32win
|
 |
« Ответ #9 : Октября 01, 2006, 10:19:27 pm » |
|
Ах да, насчет того что неработает.. Выдает следующую ошибку этого кода: syntax error : identifier '_TCHAR'
|
|
|
|
Samael
|
 |
« Ответ #10 : Октября 01, 2006, 10:22:00 pm » |
|
Рррррррр... Ты сколько на ВС пишешь? Просто скопируй кусками все что до ф-ии main, а потом все что внутри нее и вставь в свой шаблон, создаваемый студией.
|
|
|
|
expert32win
|
 |
« Ответ #11 : Октября 01, 2006, 10:23:21 pm » |
|
 извини, я больше не буду
|
|
|
|