Последние темы Поиск
Общие форумы
Специализированные форумы
ПроцессорыРазгон и охлаждениеСистемные платыМодули памятиВидеосистемаTV- и FM-тюнеры, видеовход, видеовыходЦифровое видео: захват, монтаж, обработкаМониторы и другие устройства отображенияЦифровое фотоБеспилотные летательные аппаратыЦифровой звукProAudio: Профессиональное звуковое оборудованиеСтереосистемыДомашний кинотеатр: проигрыватели и источники сигналаДомашний кинотеатр: аудиосистемаДомашний кинотеатр: ТV и проекторыМагнитные и SSD накопителиОптические носители информацииСетевые носители информацииПериферияКорпуса, блоки питания, UPSСети, сетевые технологии, подключение к интернетуСистемное администрирование, безопасностьСерверыНоутбуки, нетбуки и ультрабукиПланшеты и электронные книгиМобильные телефоны, смартфоны, кпк, коммуникаторыМобильные гаджетыОператоры и технологии мобильной связиТелефония, телекоммуникации, офисные АТСБытовая техника
Программы
Игры
Авторские форумы
Прочие форумы
Форумы поддержки портала iXBT.com
Архивы конференции
Архив "О Конференции"Архив "Процессоры"Архив "Разгон и охлаждение"Архив "Системные платы"Архив "Модули памяти"Архив "Видеосистема"Архив "Видеозахват"Архив "Мониторы и другие устройства отображения"Архив "Цифровое изображение"Архив "Цифровой звук"Архив "Периферия"Архив "Корпуса, блоки питания, UPS"Архив "Коммуникации: сети и сетевые технологии"Домашний интернет, модемы (архив)Архив "Системное администрирование, безопасность"Архив "Мобильная связь"Программы Microsoft: Windows, Office, Server, Windows LiveАрхив "OС и системное ПО"Архив "Программы: Интернет"Архив "Программирование"Форум прикладных программистовАрхив "Электронные устройства и компоненты"Архив "Околокомпьютерный Флейм & Общий"Архив "Полемика (Злобный Флейм)"Околоавтомобильный ФлеймФорум ремонтниковВопросы компании IntelФотокамеры SamsungФорум о магазине приложений RuStoreФорум по продукции компании Huawei
Справка и сервисы
Другие проекты iXBT.com
Эта тема расположена в архиве и закрыта для обсуждения.
inbox00001: Как выключить комп под Win98se средствами VC++
inbox00001
unregistered
Автор темы
i
inbox00001 unregistered Автор темы
  23 года назад / 27 марта 2002 16:43
Написал такой вот код, когда обнаружил, что
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" для МЕ?

VuDZ
Member
388/725 ответов
23 года на iXBT, с сентября 2001
Чаще пишет в "Программирование" (31%)
Россия, Москва
Инфо
V
VuDZ Member
23 года назад / 27 марта 2002 17:05
inbox00001
1. тэг [cоde][/code] интересно, зачем это придумали
2. определение версии:
01DWORD dwVersion = GetVersion();
02     
03    // Get the Windows version.
04     
05    DWORD dwWindowsMajorVersion =  (DWORD)(LOBYTE(LOWORD(dwVersion)));
06    DWORD dwWindowsMinorVersion =  (DWORD)(HIBYTE(LOWORD(dwVersion)));
07     
08    // Get the build number.
09    DWORD dwBuild;
10    if (dwVersion < 0x80000000)              // Windows NT/2000, Whistler
11    {
12        dwBuild = (DWORD)(HIWORD(dwVersion));
13        if (dwWindowsMajorVersion == 5){
14            if (!dwWindowsMinorVersion)
15                s << "Windows 2000 " << dwBuild << endl;
16            else
17                if (dwWindowsMinorVersion == 1)
18                    s << "Windows XP " << dwBuild << endl;
19                else
20                    s << "WinNT v" << dwWindowsMajorVersion << "." << dwWindowsMinorVersion <<
21                        "bld " << dwBuild << endl;
22        }
23        else if (dwWindowsMajorVersion == 4)
24            s << "Windows NT 4." << dwWindowsMinorVersion << "bld" << dwBuild;
25    }
26    else if (dwWindowsMajorVersion < 4){      // Win32s
27        dwBuild = (DWORD)(HIWORD(dwVersion) & ~0x8000);
28        s << "Win32s " << dwBuild << endl;
29    }
30    else                                     // Windows 95/98/Me
31        s << "Windows 9x/ME";
для разновидноствей win9x - поищи по форуму, недаво было...
3. WinNT shutodown:
01BOOL fResult;               // system shutdown flag
02 
03HANDLE hToken;              // handle to process token
04TOKEN_PRIVILEGES tkp;       // pointer to token structure
05 
06if (!OpenProcessToken(GetCurrentProcess(),
07        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
08    printf("OpenProcessToken failed\n"); return -1;}
09 
10LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
11 
12tkp.PrivilegeCount = 1;  // one privilege to set   
13tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
14 
15AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
16 
17if (GetLastError() != ERROR_SUCCESS) {
18    printf("AdjustToken Privileges enable failed\n"); return -1;}
19 
20SetProcessShutdownParameters (0x3ff, SHUTDOWN_NORETRY);
21fResult = ExitWindowsEx(EWX_REBOOT, EWX_FORCEIFHUNG);   
22 
23if (!fResult) {
24    printf("Initiate System Shutdown failed\n");
25                return -1;
26}
27 
28return 0;
inbox00001
unregistered
Автор темы
i
inbox00001 unregistered Автор темы
23 года назад / 27 марта 2002 17:20
VuDZ

1ExitWindowsEx(EWX_REBOOT, EWX_FORCEIFHUNG);

это что такое? Это ВЫКЛЮЧИТ компьютер? "EWX_FORCEIFHUNG" чему равен?
VuDZ
Member
389/726 ответов
23 года на iXBT, с сентября 2001
Чаще пишет в "Программирование" (31%)
Россия, Москва
Инфо
V
VuDZ Member
23 года назад / 27 марта 2002 17:33
сорри, просто это из другой оперы.... Сложно догадаться что ли?
EWX_FORCEIFHUNG - Windows 2000 or later: Forces processes to terminate if they do not respond to the WM_QUERYENDSESSION or WM_ENDSESSION message. This flag is ignored if EWX_FORCE is used.

#define EWX_FORCEIFHUNG 0x00000010
inbox00001
unregistered
Автор темы
i
inbox00001 unregistered Автор темы
23 года назад / 28 марта 2002 14:05
извиняюсь за задержку, инет упавши был

01#include "windows.h"
02#include <malloc.h>
03///////////////////////////////////////////////////////////////////////////////
04  
05void PowerOFF (void)
06{
07    HANDLE hToken;
08    TOKEN_PRIVILEGES* NewState;
09    OSVERSIONINFO OSVersionInfo;
10    OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
11    GetVersionEx (&OSVersionInfo);
12    if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
13        {
14            OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &hToken);
15            NewState = (TOKEN_PRIVILEGES*) malloc (sizeof (TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES));
16            NewState->PrivilegeCount = 1;
17            LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, &NewState->Privileges[0].Luid);
18            NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
19            AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL);
20            free (NewState); CloseHandle (hToken);
21            ExitWindowsEx (EWX_POWEROFF, 0);
22             
23        }
24    if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
25        {
26            WinExec(
27                "RUNDLL.EXE user.exe,exitwindows",
28                SW_MINIMIZE
29                );
30        }
31}

Я повторил код снова, теперь он более читабелен.

VuDZ
я читал Организация мгновенного PowerOFF под Win2k (XP) там вы писали нечто подобное, но вот выводы в той статье не совпадают с моими "исследованиями", поэтому я и создал эту ветку. Я хочу "расставить все точки над и".

Повторяю: 1) Мне не удалось выключить комп с 98-м спомощью "ExitWindowsEx ()"!!!
2) Так же с ExitWindowsEx () не удалось выключить в NT. (всего лишь производит перезагрузку).

Так же, помоему, совсем не важно знать точную версию Windows (98, 98se, 2000, me, xp, nt...), а достаточно знать платформу (NT или не NT). Именно так я пытался это сделать. Но здесь возникла проблема, т.к. "ExitWindowsEx ()" не сработала под 98SE (а наверно и под 95, 98 тоже) пришлось использовать "RUNDLL.EXE user.exe,exitwindows", что я считаю не лучшим решением. Не знаю как "RUNDLL.EXE user.exe,exitwindows" поведет себя под МЕ. (Люди добрые, кто МЕ юзает попробуйте "RUNDLL.EXE user.exe,exitwindows" в коммандной строке, дайте знать о результате).

Код который я привел 100% работает на 2000-м, 98SE, ХР (сам попробовал). Еще бы решить проблему с NT и можно больше не возвращаться к этой теме.

Ко всем: Если ВЫ считаете себя сведующим в этом вопросе, ответте, но по существу, а воду лить мы все умеем. Если отвечаете укажите источник и пробовали ли сами.

C Уважением Ламер

Добавление от 28-03-2002 16:16:

Кто-то может пояснить принципиальную разницу между:

"rundll32.exe shell32.dll,SHExitWindowsEx n

где n - одно из следующих значений:

0 - LOGOFF. Завершает все запущенные процессы и производит вывод текущего
пользователя из системы
1 - SHUTDOWN. Завершает работу системы с возможностью выключения питания.
Все находящиеся в памяти данные сбрасываются на диск. Все запущенные
процессы останавливаются.
2 - REBOOT. Перезагружает компьютер.
4 - FORCE. Быстрое завершение работы текущего пользователя. При
использовании данного ключа, Windows не информирует запущенные приложения о
завершении работы, что ведет к потере данных. Поэтому, данный ключ нужно
использовать осторожно.
8 - POWEROFF. Завершение работы Windows и выключение питания. Для
использования этого ключа Ваша система должна поддерживать возможность
автоматического выключения питания."

и

"C:\WINDOWS\RUNDLL.EXE user.exe,ExitWindows"

что в моем случае предпочтительнее?

Добавление от 28-03-2002 17:14:

Спросил раньше чем сам попробовал...
Ну кому интересно, "rundll32.exe shell32.dll,SHExitWindowsEx n" работает так-же как
"ExitWindowsEx ()", т.е. комп не выключает.


Добавление от 29-03-2002 00:15:

...всё, проверил на МЕ, "RUNDLL.EXE user.exe,ExitWindows" работает. Можно утверждать, что приведенный мною код работает на Windows 9x; 2000 & XP и не работает на NT.

...раз "гуру" молчат, более красивого решения проблемы выключения компьютера под 9х - нет.

Остался открытым вопрос выключения компьютера на NT, но он не совпадает с нашей темой.

Прошу совета у господина модератора QZ. Стоит ли открывать новую ветку о NT, или есть ли возможность переименовать эту? Если на вторую часть ответ отрицательный, прошу, на ваше усмотрение, закрыть тему.

С Уважением Ламер. inbox00001@mail.ru

P.S. Вот и покричал "в одни ворота", но может кому-то на пользу будет...
Artxas
unregistered
A
Artxas unregistered
23 года назад / 29 марта 2002 07:36
OSVERSIONINFO osver;
osver.dwOSVersionInfoSize = sizeof( osver ) ;
GetVersionEx (&osver);



OnReboot()
{
// NT platform
if( osver.dwPlatformId == VER_PLATFORM_WIN32_NT )
{
HANDLE hToken; // handle to process token
TOKEN_PRIVILEGES tkp; // pointer to token structure

BOOL fResult; // system shutdown flag

// Get the current process token handle so we can get shutdown
// privilege.

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
AfxMessageBox("OpenProcessToken failed.");

// Get the LUID for shutdown privilege.

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get shutdown privilege for this process.

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);

// Cannot test the return value of AdjustTokenPrivileges.

if (GetLastError() != ERROR_SUCCESS)
AfxMessageBox("AdjustTokenPrivileges enable failed.");

// Display the shutdown dialog box and start the time-out countdown.

fResult = InitiateSystemShutdown(
NULL, // shut down local computer
"System shutdown !!!", // message to user
0, // time-out period
FALSE, // ask user to close apps
TRUE); // reboot after shutdown

if (!fResult)
{
AfxMessageBox("InitiateSystemShutdown failed.");
}
// Disable shutdown privilege.
tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
{
AfxMessageBox("AdjustTokenPrivileges disable failed.");
}

}

// Windows98 - Me platform

else if( osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
ExitWindowsEx(EWX_REBOOT,0);
}


OnShutDown()
{
// NT platform
if( osver.dwPlatformId == VER_PLATFORM_WIN32_NT )
{
HANDLE hToken; // handle to process token
TOKEN_PRIVILEGES tkp; // pointer to token structure

BOOL fResult; // system shutdown flag

// Get the current process token handle so we can get shutdown
// privilege.

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
AfxMessageBox("OpenProcessToken failed.");

// Get the LUID for shutdown privilege.

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get shutdown privilege for this process.

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);

// Cannot test the return value of AdjustTokenPrivileges.

if (GetLastError() != ERROR_SUCCESS)
AfxMessageBox("AdjustTokenPrivileges enable failed.");

// Display the shutdown dialog box and start the time-out countdown.

fResult = InitiateSystemShutdown(
NULL, // shut down local computer
"System shutdown !!!", // message to user
0, // time-out period
FALSE, // ask user to close apps
FALSE); // reboot after shutdown

if (!fResult)
{
AfxMessageBox("InitiateSystemShutdown failed.");
}

// Disable shutdown privilege.

tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
{
AfxMessageBox("AdjustTokenPrivileges disable failed.");
}

}

// Win98
else if( osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
ExitWindowsEx(EWX_SHUTDOWN, 0);

}

Etot kod u menia realno rabotaet w nieskolkich proektach, proverial i w 95, 98, Me, NT, XP
Kid_Deceiver
Member
1889/1923 ответов
25 лет на iXBT, с декабря 1999
Чаще пишет в "Программирование" (94%)
Инфо
K
Kid_Deceiver Member
23 года назад / 29 марта 2002 09:04
inbox00001
Мне не удалось выключить комп с 98-м спомощью "ExitWindowsEx ()"!!!
Windows 95/98: Because of the design of the shell, calling ExitWindowsEx with EWX_FORCE fails to completely log off the user (the system terminates the applications and displays the Enter Windows Password dialog box, however, the user's desktop remains.) To log off the user forcibly, terminate the Explorer process before calling ExitWindowsEx with EWX_LOGOFF and EWX_FORCE.
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Эта тема расположена в архиве и закрыта для обсуждения.
Последние обсуждения в Конференции
04:58Автоматические кофемашины и аксессуары к ним. Выбор, обсуждение, эксплуатация. Бытовая техника
04:54Актуальный интернет браузер для Windows XP Интернет
04:50Посоветуйте дистрибутив Linux Unix
04:50Будет ли война России с Украиной? Политика
04:42Расскажите кстати анекдот (только ржачный, не про Вовочку и не про Штирлица) Юмор
04:38Атомные электростанции Наука
04:37Апрель. Хрустики повыползали на дороги. Осторожно! Мотоциклы. Мототема. Авто
04:26Corsair MP600 pro уходит здоровье Накопители
04:16Вечер Boney M. в концертной студии "Останкино" Флуд
04:14А почему никто не учит ИИ кодингу по типу AlphaZero ? ИИ
04:07 Пути решения процента инфляции через ставку рефинансирования Центробанка. Банки
04:065G в России Моб. операторы
04:04Какой язык программирования выбрать в РФ? Java, PHP, Python, C#, Rust, C++, JavaScript Рынок труда
04:04Рули для ПК -- выбор, отзывы, вопросы эксплуатации Игры
04:01Сравнение качества мультиплатформенных игр PlayStation 5 vs Xbox Series X|S (было PS4 vs X1) Консоли
03:56Кто-то хочет в СССР? История
03:55Импульсные Зажигающие Устройства для ламп ВД Эл. устройства
03:514K UHD плеер OPPO UDP-203 / UDP-205 ДК плееры
03:45Пиво Кулинария
03:45Хочу купить часы. Что посоветуете? Общий
02:17Вышло важное обновление для Samsung Galaxy S21, Galaxy S21 Plus и Galaxy S21 Ultra
02:03Самый дешевый Hyundai Verna (Solaris) в базовой версии: первые «живые» изображения
23:33вчераДождь внутри планеты: ученые открыли новый механизм формирования атмосфер
23:05вчераLi Auto L9, Tank 700 и Hyundai Staria — это теперь роскошные автомобили. Опубликован свежий перечень моделей авто, попадающих под налог на роскошь
22:51вчераАмериканцы раскрыли китайский космический секрет: спутник США заснял китайскую орбитальную станцию «Тяньгун» — и сразу с двумя пристыкованными космическими кораблями
21:59вчераРоссияне 29 марта увидели частное затмение Солнца — фото
18:50вчераTencent вложила $1,25 млрд в создание отдельного подразделения Ubisoft
18:25вчераВ России начали принимать заказы на Nissan Sylphy 2025 — от 2,1 млн рублей. Раньше такие машины выпускали в России
18:21вчера30-летняя теория формирования органики дала сбой: бензол не появился в эксперименте, имитирующем космические условия
18:13вчераКитайские инженеры создали мягкого робота WHERE-Bot, который обходит препятствия без датчиков и передвигается в сложной среде за счёт выворачивающейся структуры