Автор Тема: Как в С++ реализовать перезагрузку WinXP ?  (Прочитано 1729 раз)

0 Пользователей и 1 Гость просматривают эту тему.

expert32win

  • Гость
Как в С++ реализовать перезагрузку WinXP ?
« : Октября 01, 2006, 09:18:54 am »
Как в С++ реализовать перезагрузку WinXP  в экстренном режиме тоесть без сохранения всех настроек (примерно как через RESET ) ?
Дайте пример кода для консольного приложения пожалуйста.

Оффлайн prayer

  • Коллежский асессор
  • *****
  • Сообщений: 258
  • Репутация: 1
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #1 : Октября 01, 2006, 01:14:29 pm »
Юзай ExitWindowsEx, не забыв в флаги поместить EWX_FORCE.
Только зачем такое издевательство над системой?
Абстракция - выборочное невежество.
-Andrew Koenig, член комитета по стандартизации С++

expert32win

  • Гость
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #2 : Октября 01, 2006, 02:35:46 pm »
Огромное спасибо. Все работает.

expert32win

  • Гость
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #3 : Октября 01, 2006, 06:18:01 pm »
К сожалению в Win XP этим методом можно добится лишь LogOff
В сети по этому поводу пишут такие страшные вещи будто для нормального функционирования ExitWindowsEx в XP следует получить какие то права доступа к некоторым ресурсам системы или что то типа того.
Че как и где их получит кто-нить может толком обьяснить ?

Оффлайн Samael

  • Шпийон Сарумяна
  • Вице-канцлер
  • *****
  • Сообщений: 3543
  • Репутация: 70
  • Пол: Мужской
  • Гик - это не профессия, гик - это призвание...
  • SkypeID: kornev.vladimir
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #4 : Октября 01, 2006, 06:44:15 pm »
Если не ошибаюсь, то тебе нужно иметь права SYSTEM. А вообще скинь плиз ссылку на эти места "в сети", где про это пишут -- интересно почитать =)
Один терапевт - это 1024 гигапевта, или 1048576 мегапевтов.
Все вышесказанное - исключительно IMHO :Samael:
Если Вам кто-то помог, нажмите

expert32win

  • Гость
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #5 : Октября 01, 2006, 08:54:47 pm »
http://www.codenet.ru/progr/vbasic/shutdown.php

Вот ссылка. Там есть пример этого кода для С++ но у меня он не пошел :(

Оффлайн Samael

  • Шпийон Сарумяна
  • Вице-канцлер
  • *****
  • Сообщений: 3543
  • Репутация: 70
  • Пол: Мужской
  • Гик - это не профессия, гик - это призвание...
  • SkypeID: kornev.vladimir
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #6 : Октября 01, 2006, 10:03:50 pm »
Гм.. не знаю, что у тебя там не работает, но следующий код отлчно ребутает машину
Код: (cpp) [Выделить]
#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;
}
Один терапевт - это 1024 гигапевта, или 1048576 мегапевтов.
Все вышесказанное - исключительно IMHO :Samael:
Если Вам кто-то помог, нажмите

Оффлайн Samael

  • Шпийон Сарумяна
  • Вице-канцлер
  • *****
  • Сообщений: 3543
  • Репутация: 70
  • Пол: Мужской
  • Гик - это не профессия, гик - это призвание...
  • SkypeID: kornev.vladimir
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #7 : Октября 01, 2006, 10:05:39 pm »
Кстати, забыл сказать: достало чистить твои темы, эта конкретно не имеет никакого отношения к Вижуалу... Напиши, что ты понял, а то у тебя сложилась традиция создавать новые темы, а не искать перенесенные.
Один терапевт - это 1024 гигапевта, или 1048576 мегапевтов.
Все вышесказанное - исключительно IMHO :Samael:
Если Вам кто-то помог, нажмите

expert32win

  • Гость
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #8 : Октября 01, 2006, 10:08:42 pm »
Я понял :)

expert32win

  • Гость
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #9 : Октября 01, 2006, 10:19:27 pm »
Ах да, насчет того что неработает..
Выдает следующую ошибку этого кода:
syntax error : identifier '_TCHAR'

Оффлайн Samael

  • Шпийон Сарумяна
  • Вице-канцлер
  • *****
  • Сообщений: 3543
  • Репутация: 70
  • Пол: Мужской
  • Гик - это не профессия, гик - это призвание...
  • SkypeID: kornev.vladimir
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #10 : Октября 01, 2006, 10:22:00 pm »
Рррррррр... Ты сколько на ВС пишешь?
Просто скопируй кусками все что до ф-ии main, а потом все что внутри нее и вставь в свой шаблон, создаваемый студией.
Один терапевт - это 1024 гигапевта, или 1048576 мегапевтов.
Все вышесказанное - исключительно IMHO :Samael:
Если Вам кто-то помог, нажмите

expert32win

  • Гость
Re: Как в С++ реализовать перезагрузку WinXP ?
« Ответ #11 : Октября 01, 2006, 10:23:21 pm »
:) извини, я больше не буду