Программа автоматического выключения компьютера на ассемблере MASM32

 23 декабря 2015, среда Владимир  3858




Всем привет! В жизни довольно часто появляется необходимость автоматического завершения работы или перезагрузки компьютера через заданный промежуток времени. Причины могут быть совсем разные. Конечно, есть средства, которые встроены в операционную систему, например, программа shutdown.exe, но что делать если они недоступны или требуют определенных навыков? Хочу поделиться своим решением, а именно программой, написанной на 32-битном ассемблере MASM32. Данная программа имеет простой пользовательский интерфейс и является надежной и безотказной помощницей :-) Не требует от пользователя специальных технических знаний. Скачать готовый файл можно по ссылке внизу страницы.

Программа автоматического выключения компьютера на ассемблере MASM32

Исходный код программы выключения компьютера на masm32:

.486
.model flat,stdcall
option casemap:none
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
include masm32includecomctl32.inc
include masm32includeadvapi32.inc
include masm32macrosmacros.asm
includelib masm32libuser32.lib
includelib masm32libkernel32.lib
includelib masm32libcomctl32.lib
includelib masm32libadvapi32.lib
.code
sz1 db "Завершить сеанс ", 0,
"Завершить работу", 0,
"Перезагрузить ", 0
sz2 db "SeShutdownPrivilege", 0 
wndproc proc hWnd :HWND, uMsg :UINT, wParam :WPARAM, lParam :LPARAM
local time: SYSTEMTIME
local hToken :DWORD
local tkp :TOKEN_PRIVILEGES
switch uMsg
case WM_CLOSE
call ExitProcess
case WM_INITDIALOG
xor ebx, ebx
@@:
invoke SendDlgItemMessageA, hWnd, 2, CB_ADDSTRING, 0, addr sz1[ebx]
add ebx, 17
cmp ebx, 51
jnz @B
invoke SendDlgItemMessageA, hWnd, 2, CB_SETCURSEL, 1, 0
case WM_TIMER
invoke SendDlgItemMessageA, hWnd, 1, DTM_GETSYSTEMTIME, 0, addr time 
.if time.wSecond == 0
.if time.wMinute == 0
.if time.wHour == 0
invoke SendDlgItemMessageA, hWnd, 4, BM_CLICK, 0, 0
invoke GetCurrentProcess
mov ebx, eax
invoke OpenProcessToken, ebx, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, addr hToken
invoke LookupPrivilegeValue, 0, offset sz2, addr tkp.Privileges[0].Luid
mov [tkp.PrivilegeCount], 1
mov tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges, [hToken], 0, addr tkp, 0, 0, 0
invoke SendDlgItemMessageA, hWnd, 2, CB_GETCURSEL, 0, 0
or eax, EWX_FORCE
invoke ExitWindowsEx, eax, 0
.else
dec time.wHour
.endif
mov time.wMinute, 59
.else
dec time.wMinute
.endif
mov time.wSecond, 59
.else
dec time.wSecond 
.endif
invoke SendDlgItemMessageA, hWnd, 1, DTM_SETSYSTEMTIME, GDT_VALID, addr time
case WM_COMMAND
switch wParam
case 3
invoke SendDlgItemMessageA, hWnd, 3, BM_GETCHECK, 0, 0
dec eax
mov esi, eax 
xor ebx, ebx
@@:
invoke EnableWindow, FUNC(GetDlgItem, hWnd, ebx), esi
inc ebx
cmp ebx, 3
jnz @B
.if esi == 0
invoke SetTimer, hWnd, 123, 1000, NULL
.elseif
invoke KillTimer, hWnd, 123
.endif
endsw
endsw 
xor eax, eax
ret
wndproc endp
start: 
main proc 
local msg: DWORD
xor ebx, ebx
call InitCommonControls
invoke CreateDialogParamA, ebx, 1, ebx, addr wndproc, ebx
@@:
invoke GetMessageA, addr msg, ebx, ebx, ebx
invoke TranslateMessage, addr msg
invoke DispatchMessageA, addr msg
jmp @B
main endp
end start

Пользовательский интерфейс описан RC-файлом:

;1 24 MOVEABLE PURE LOADONCALL DISCARDABLE "MANIFEST.TXT"
1 DIALOGEX 0, 0, 150, 68, 0
STYLE DS_SETFONT | DS_SETFOREGROUND | DS_CENTER | WS_MINIMIZEBOX | WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE
CAPTION "Выключалка"
FONT 8, "MS Shell Dlg", 0
BEGIN
GROUPBOX "", -1, 3, 7, 144, 55, BS_FLAT
LTEXT "через :", 0, 15, 23, 30, 8
CONTROL "DateTimePicker1", 1, "SysDateTimePick32", WS_TABSTOP | 0x00000029, 50, 21, 65, 14
COMBOBOX 2, 8, 41, 130, 50, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
AUTOCHECKBOX "&Активировать", 3, 8, 6, 63, 10
END

Так выглядит интерфейс программы:

Программа автоматического выключения компьютера на ассемблере MASM32

Программа автоматического выключения компьютера на ассемблере MASM32

После компиляции размер exe-файла всего 2,5 Кб!

Программа автоматического выключения компьютера на ассемблере MASM32

Важно! Выключение системы происходит с опцией форсированного завершения всех работающих программ! Это означает, что если имеются какие-либо несохраненные данные, то они будут утеряны.

Программа много раз доказывала свою эффективность, пользуюсь ей регулярно. Особенно удобно ставить таким образом сервера на перезагрузку с настроенным автовходом.

Скачать