Завершение работы компьютера - 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'

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы