Автор
|
Тема: Как можно сделать ShuteDown?
|
server_mouse |
опубликован 04-08-2001 12:50 MSK
Сабж. Слышал что можно прям из командной строки набрать чего-то вроде rundll.exe{....} Коли так, я бы сделал ShellExecute(). Да, при обычном выключении система закрывает по очереди все окна (WM_QUITE наверное), и соотв. делает паузу для сохранения. Мне говорили, что можно и принудительно вырубить всё. Последнее как раз и хотелось бы. Обходить всех самому и делать TerminateProcess() влом.
|
Emerald
|
опубликован 04-08-2001 14:43 MSK
Можно. Например так: rundll user,exitwindows но лучше прямо функцию вызывать. |
Kosha
|
опубликован 05-08-2001 01:51 MSK
Вот кстати "квесчион": Некоторые проги сильно виснут, так что на них TerminateProcess не работает (w98). Ничего из мастдаевских шатдаунеров тоже. А тот же ReGet как-то их закрывает!Никто не знает как? ;-) |
Emerald
|
опубликован 05-08-2001 02:11 MSK
Если выполнить функцию с определённым флагом - то закроется даже Ворд, если в нём не сохранённый текст. Я точно не помню какой это флаг, но по -моему:invoke ExitWindowsEx,4,0
|
server_mouse
|
опубликован 05-08-2001 12:49 MSK
2Emerald: rundll user,exitwindows в W2k перелогонило юзера. Питание не вырубило ;-( |
Emerald
|
опубликован 05-08-2001 15:50 MSK
Так надо было сказать, что для 2000 - я бы другое написал. Ну вот к примеру, смотри на ExitProcessEx 4,0 - должно работать везде. |
server_mouse
|
опубликован 05-08-2001 17:18 MSK
Emerald> Ну вот к примеру, смотри на ExitProcessEx 4,0 Сори, не понял.... ExitProcess(...) завершит текущий процесс... Чего-то я не уловил. |
VICX1
|
опубликован 06-08-2001 01:25 MSK
#include <conio.h>main() { _outp(0x64,0xf6); return 0; } Работает под WIN9x; Функция :общий сброс и тест клавиатуры; Всю систему посылает на 3 известные буквы; Под WINNT можно использовать любой драйвер для доступа к портам. Victor. |
breeder
|
опубликован 06-08-2001 06:31 MSK
InitiateSystemShutdown? %) |
Emerald
|
опубликован 06-08-2001 12:28 MSK
Оф коз, я не прав --> ExitWindowsEx 4,0 - сорри |
server_mouse
|
опубликован 06-08-2001 12:49 MSK
Делаю if(!InitiateSystemShutdown(NULL,NULL,0,TRUE,FALSE)) DWORD er=GetLastError(); .....Всё из под сервиса запущеного с правами администратора. В er получаю код ошибки 5=ERROR_ACCESS_DENIED!!! Что не так?!! |
server_mouse
|
опубликован 06-08-2001 13:25 MSK
Ага! Нашёл! Оказывается, даже если ты под админом, необходимо повысить своей проге привелегии. Аделается сея фитча таким кодом (в нете нашёл): HANDLE hToken; TOKEN_PRIVILEGES* NewState; 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);
|
Emerald
|
опубликован 06-08-2001 13:26 MSK
Ты енту функцию будешь использовать в сети (перегружать другие компы). Свой так не перезагрузить. Надо или ExitWindowsEx или что-то типа:> debug o 64, fe <8)
|
server_mouse
|
опубликован 06-08-2001 13:31 MSK
Да, вот только ещё вопрос... Если я делаю InitiateSystemShutdown(NULL,NULL,0,TRUE,TRUE); то система перегружается, а если InitiateSystemShutdown(NULL,NULL,0,TRUE,FALSE); то выводит сообщение о том, что питание можно вырубить. Я же хочу просто его вырубить, ATX-же! |
breeder
|
опубликован 06-08-2001 13:57 MSK
Тогда ExitWindowsEx с параметром EWX_POWEROFF | EWX_FORCE %)2Emerald, перегрузить перегрузить :) |
breeder
|
опубликован 06-08-2001 13:59 MSK
Кстати, если процесс запущен пользователем (не сервис) то ему разрешать привилегии ненужно чтобы вызывать эти функции... |
server_mouse
|
опубликован 06-08-2001 15:32 MSK
Да, спасибо всем! ExitWindowsEx работает на ура. |
Emerald
|
опубликован 06-08-2001 16:59 MSK
А я с самого начала сказал, что ExitWindowsEx - а вы там InitateSystemShutdown ...
|
server_mouse
|
опубликован 06-08-2001 20:31 MSK
2Emerald : Сорри, не понял... Да и как тут поймёш "invoke ExitWindowsEx,4,0" И чего такое invoke ? |
Emerald
|
опубликован 07-08-2001 02:27 MSK
Народ тут знает - я ассемблер учил (и знаю). Просто INVOKE - вызов функции (и всё). Его можно опустить. Это я по привычке писал. Ну так ка - работает то прога? |
server_mouse
|
опубликован 07-08-2001 12:05 MSK
Да я вобщем-то тоже на асме баловался, было это давно и под досю. Потому видать и недогнал, хотя словцо какое-то знакомое ;-) А прога работает отлично! |