Любой процесс в системе выполняется с правами какого-то пользователя или самой системы. Привилегии – это права процесса на совершение каких-либо действий по отношению ко всей системе, и при выполнении каких-либо привилегированных операций система проверяет, обладает ли пользователь соответствующей привилегией. Например, выключение и перезагрузка компьютера компьютера относятся как раз к таким операциям, и без повышения привилегий функция
ExitWindowsEx завершится с ошибкой. Готовых решений на FASM найти не удалось, пришлось портировать из языков высокого уровня.
; Сегмент данных
section '.data' data readable writeable
; Определяем константы
TOKEN_ADJUST_PRIVILEGES = 20h
TOKEN_QUERY = 8h
SE_PRIVILEGE_ENABLED = 2h
; Определяем необходимые структуры, потому что в FASM'е их нет
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
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
Выключение рассмотрено как наиболее часто встречающаяся задача, более подробное описание использованных структур и функций вы можете найти на сайте
Microsoft Developer Network.