.386
.model flat, stdcall
option casemap:none
include \myasm\include\windows.inc
include \myasm\include\kernel32.inc
includelib \myasm\lib\kernel32.lib
include \myasm\include\user32.inc
includelib \myasm\lib\user32.lib
include \myasm\include\advapi32.inc
includelib \myasm\lib\advapi32.lib
FShutdownSystem proto
GetVersionEx proto :DWORD
ShutdownSystem proto
GetRights proto
.data
tkp TOKEN_PRIVILEGES<>
sys OSVERSIONINFO<>
SeShut DB "SeShutdownPrivilege"
.code
start:
invoke FShutdownSystem
invoke ExitProcess,0
FShutdownSystem proc
mov sys.dwOSVersionInfoSize,sizeof OSVERSIONINFO
invoke GetVersionEx,offset sys
.if sys.dwPlatformId==2
INVOKE GetRights
invoke ExitWindowsEx,EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF,0
.else
invoke ExitWindowsEx,EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF,0
.ENDIF
mov eax,FALSE
ret
FShutdownSystem Endp
ShutdownSystem proc
mov sys.dwOSVersionInfoSize,sizeof OSVERSIONINFO
invoke GetVersionEx,offset sys
.if sys.dwPlatformId==2
INVOKE GetRights
invoke ExitWindowsEx,EWX_SHUTDOWN or EWX_POWEROFF,0
.else
invoke ExitWindowsEx,EWX_SHUTDOWN or EWX_POWEROFF,0
.ENDIF
mov eax,FALSE
ret
ShutdownSystem Endp
GetRights proc
LOCAL pro:DWORD
LOCAL hto:DWORD
push ecx
invoke GetCurrentProcess
mov ecx,eax
invoke OpenProcessToken,ecx,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr hto
mov ecx,eax
jecxz erro
invoke LookupPrivilegeValue,0,offset SeShut,offset tkp.Privileges[0].Luid
mov ecx,eax
jecxz erro
mov tkp.PrivilegeCount,1
mov tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges,hto,0,addr tkp,0,0,0
mov ecx,eax
jecxz erro
pop ecx
xor eax,eax
inc eax
ret
erro:
xor eax,eax
ret
GetRights Endp
end start
Вырубить комп!
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
.data?
.code
_start:
push 0
;push EWX_FORCE
push EWX_LOGOFF
;push EWX_POWEROFF
;push EWX_REBOOT
;push EWX_SHUTDOWN
call ExitWindowsEx
push 0
call ExitProcess
end _start
Почему-то работает только EWX_LOGOFF и EWX_FORCE (завершаем работу текущего пользователя)!!!
А вырубить комп EWX_POWEROFF и перезагрузиться EWX_SHUTDOWN почему-то не получается!!!! Почему???
По идее всё просто...
надо сначала включить привилегию для процесса что бы он мог выключать комп а так не сработает.......
Как то я тоже писал такую прогу. Вот посмотри исходник:
Но вот только я не понял:
А зачем мы используем диррективы условного ассемблирования (.if .else и .endif)???
(.if sys.dwPlatformId==2)
Ведь они как бы только на этапе компилирования работают...
Цитата: Meatcoins
А зачем мы используем диррективы условного ассемблирования (.if .else и .endif)???
(.if sys.dwPlatformId==2)
Ведь они как бы только на этапе компилирования работают...
что то ты попутал.....
они во время выполнения программы работают!
Правильно ahilles говоришь. Это упрощенные директивы для простой реализации ветвления и эта загагулина используется при проверки в какой ОС прога была запущена. Т.к. для NT и выше необходимо выполнить процедуру получения приоритета GetRights, потому что SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_HIGHEST) и SetPriorityClass(GetCurrentProcess, HIGH_PRIORITY_CLASS) не катят.
Цитата: Coffein
Т.к. для NT и выше необходимо выполнить процедуру получения приоритета GetRights, потому что SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_HIGHEST) и SetPriorityClass(GetCurrentProcess, HIGH_PRIORITY_CLASS) не катят.
я знаю что я правильно говорю, но я тоговорю про диррективы .if .else и т.д. а ты про функции