Завершение работы компьютера - Assembler
Формулировка задачи:
Подскажите, как в защищённом режиме (без прерываний) выключить компьютер.
Решение задачи: «Завершение работы компьютера»
textual
Листинг программы
format PE GUI 4.0 entry Start include 'win32a.inc' ; Сегмент данных section '.data' data readable writeable ; Определяем константы TOKEN_ADJUST_PRIVILEGES = 20h TOKEN_QUERY = 8h SE_PRIVILEGE_ENABLED = 2h ; Определяем необходимые структуры struct LUID lowPart dd ? HighPart dd ? ends struct LUID_AND_ATTRIBUTES pLuid LUID Attributes dd ? ends struct _TOKEN_PRIVILEGES PrivilegeCount dd ? Privileges LUID_AND_ATTRIBUTES ends TTokenHd dd ? udtLUID LUID tkp _TOKEN_PRIVILEGES SE_SHUTDOWN_NAME db 'SeShutdownPrivilege',0 ; Сегмент кода section '.code' code readable executable Start: invoke GetCurrentProcess ; Открыть маркер доступа (access token), ассоциирующийся с процессом invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,TTokenHd or eax,eax jz loc_exit ; Ошибка ; Получить текущее значение привилегии на выключение и ; перезагрузку системы invoke LookupPrivilegeValue, NULL, SE_SHUTDOWN_NAME, udtLUID or eax,eax jz loc_exit ; Ошибка ; Заполнить структуры mov [tkp.PrivilegeCount],1 mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED mov eax,[udtLUID.lowPart] mov [tkp.Privileges.pLuid.lowPart],eax mov eax,[udtLUID.HighPart] mov [tkp.Privileges.pLuid.HighPart],eax invoke AdjustTokenPrivileges,[TTokenHd],0,tkp,0,0,0 ; Здесь будет код, требующий повышенных привилегий, ; например выключение компьютера invoke ExitWindowsEx,EWX_POWEROFF,NULL ; Выход loc_exit: invoke ExitProcess,0 section '.idata' import data readable writeable library kernel32, 'KERNEL32.DLL',user32, 'USER32.DLL',Advapi,'ADVAPI32.DLL' include 'api\kernel32.inc' include 'api\user32.inc' import Advapi,\ OpenProcessToken,'OpenProcessToken',\ LookupPrivilegeValue,'LookupPrivilegeValueA',\ AdjustTokenPrivileges,'AdjustTokenPrivileges'
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д