Ну вот собственно сама функция (код на Delph): Code: function ShutDown(Reboot: Boolean = False): Integer; const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; var hToken: THandle; TP: TTokenPrivileges; flag: DWORD; begin Result := -1; //В случае ошибки выдаст -1 if (Byte(GetVersion) > $04) then //Проверяю версию OS begin // (если последний байт > 4 то ось старше Win98 и нужно выполнить ряд действий) flag := 0; if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit; //Если не получилось получить доступ к процессу - выходим With TP do //Собсно настраиваем и далее устанавливаем привилегию для нашей программы begin PrivilegeCount := 1; With Privileges[0] do begin Attributes := SE_PRIVILEGE_ENABLED; if not LookupPrivilegeValue(nil, PChar(SE_SHUTDOWN_NAME), Luid) then Exit; end; end; AdjustTokenPrivileges(hToken, False, TP, SizeOf(TTokenPrivileges), nil, flag); //Устанавливаем привилегию end; if not Reboot then ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0) //"Мягкое" выключение else ExitWindowsEx(EWX_FORCE or EWX_REBOOT, 0); //Перезагрузка Result := 0; end; Было бы интересно услышать мнения при тестировании на Win98 и Win2000 а заодно и на новых осях. Список источников: http://www.delphisources.ru/pages/faq/base/shutdown_or_reboot_pc.html http://faqs.org.ru/progr/pascal/delphi_faq4.htm
ну сразу могу сказать что на 9x пахать не будет. Даже не запустится прога. Потому что никакой безовасности толком небыло в этих ОС. и следовательно небыло функций AdjustTokenPrivileges. Так что тут тока делать динамический импорт а не статический. А вообще возьми MSDN и каждую функцию проверь там. И увидишь для каких ОС она работает, а для каких нет и какие условия.
один асм операция, и компу стоп - красный свет. "In the x86 computer architecture, HLT (halt) is an assembly language instruction which halts the CPU until the next external interrupt is fired." (C) WikiPedia
2 altblitz умный шоли? А права Ring0 где возьмешь? Еслибы почитал более подробно, то ты бы узнал, что эта функция не пашет в r3 (а винды 32 и 64 битные запускают проги тока в r3) И тогда тебе предстоит мего задача - попасть с ядро. Если для 9x это было просто. то на NT тока сплоиты юзать или дрова. ну или хитрости которые уже прикрыты давно
впринципе да. Под 9x вообще не надо их. просто определяй ос. и если это NT подобная то делай динамический импорт и юзай как есть. Для 9x не делай импорт и там есть вроде чуть другая апишка. насчет w7 тут хз. может уак не позволит