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

23 декабря 2015, среда | просмотров: 3247

Доброго дня! Хочу поделиться с вами программой, которая через заданный интервал времени выключает, перезагружает компьютер либо осуществляет выход из системы. Причем делает это с опцией "форсированно", то есть она выполнит указанное действие завершив все работающие приложения принудительно.

Писал я ее для собственных целей. Использую там, где нет назначенного задания, shutdown.exe и других подобных приложений.

Вначале я определил для себя, что программа должна была обладать следующими качествами:
1. Простой интерфейс.
2. Сверхмаленький размер.
3. Гарантированное выключение ПК.

В качестве языка программирования я выбрал ассемблер MASM32, так как имею опыт написания на нем программ для Windows.

Привожу исходный код:


.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-файлом:


#include "masm32include
esource.h"

;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



Объем получившегося файла равен 2,5 Кбайт.



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



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




Скачать


Понравилась публикация? Поддержи сайт, поделись записью внизу страницы !


Комментариев нет.




Только подтвержденные пользователи могут оставлять комментарии.

Поделиться страницей в социальных сетях



Поделиться ВКонтакте Поделиться Facebook Поделиться Одноклассники Поделиться Twitter Поделиться Google+
Просмотр изображения