HELP. Помогите! Апишная функция не фурычит. InitiateSystemShutdown. Может из-за оси, адреса функции в динамической либе другие? WinXP SP 2/5.1.2600.2180. 1055695713__SD.ASM
MASM32 здесь совершенно не причем... Проблема, скорее всего, заключается в том, что процесс вызывающий эти функции не имеет соответствующих привилегий. На сайте www.rsdn.ru есть хорошая статья по этой теме (т.е. о привилегиях, и работе с ними). Для изменения привилегий процесса нужно использовать API-функцию: AdjustTokenPrivileges. В данном случае, процессу необходимо дать привилегию: SE_SHUTDOWN_NAME. Вот ее описание, взятое из упомянутой статьи (статья, кстати, называется: "Что такое привилегии?", автор: Алексей Ширшов): SE_SHUTDOWN_NAME Последняя из рассматриваемых привилегий наиболее популярна на различных форумах. Она необходима для выключения компьютера и обычно используется с функцией ExitWindows[Ex]. Суть привилегии состоит в том, чтобы не давать пользователю выключать компьютер, на котором функционируют (в виде системных служб) важные серверные компоненты. При простом завершении сеанса пользователя (флаг EWX_LOGOFF) привилегия не проверяется.
Flanker Почитай в win32.hlp страничку Shutdowning system или нечто подобное. Там пример есть работающий, если с С порядок.
Извините за непонятливость, я новичок в этом деле ================================================= systime.ASM(20) : error A2084: constant value too large systime.ASM(20) : error A2114: INVOKE argument type mismatch : argument : 2 ================================================= .386 .model flat, stdcall option casemap:none include include\windows.inc include include\Advapi32.inc include include\kernel32.inc include include\user32.inc includelib lib\user32.lib includelib lib\kernel32.lib includelib lib\Advapi32.lib .data? tkp TOKEN_PRIVILEGES <> hToken HANDLE ? .code start: invoke GetCurrentProcess invoke OpenProcessToken, eax, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken invoke LookupPrivilegeValue, NULL, SE_SHUTDOWN_NAME, addr tkp.Privileges[0].Luid mov tkp.PrivilegeCount, 1 mov tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges, hToken, FALSE, addr tkp, 0, NULL, 0 invoke InitiateSystemShutdown, NULL, 0, 0, FALSE, TRUE mov tkp.Privileges[0].Attributes, 0 invoke AdjustTokenPrivileges, hToken, FALSE, addr tkp, 0, NULL, 0 invoke ExitProcess,NULL end start Похоже проблема в invoke LookupPrivilegeValue, NULL, SE_SHUTDOWN_NAME, addr tkp.Privileges[0].Luid Вроде SE_SHUTDOWN_NAME в windows.inc определен, а и аргументов 3? пробовал "SeShutdownPrivilege", не помогает.
to Flanker а самому определить не судьба ? Код (Text): SE_SHUTDOWN_NAME db "SeShutdownPrivilege",0 ... invoke LookupPrivilegeValue,NULL,offset SE_SHUTDOWN_NAME,offset tkp.Privileges[0].Luid
Чуваки! работает! Спасибо за советы. Только вот не пойму, почему с SE_SHUTDOWN_NAME, приходится создавать переменные, в windows.inc SE_SHUTDOWN_NAME~SeShutdownPrivilege .386 .model flat, stdcall option casemap:none include e:\Programming-Debugging\Compilers\masm32\include\windows.inc include e:\Programming-Debugging\Compilers\masm32\include\Advapi32.inc include e:\Programming-Debugging\Compilers\masm32\include\kernel32.inc include e:\Programming-Debugging\Compilers\masm32\include\user32.inc includelib e:\Programming-Debugging\Compilers\masm32\lib\user32.lib includelib e:\Programming-Debugging\Compilers\masm32\lib\kernel32.lib includelib e:\Programming-Debugging\Compilers\masm32\lib\Advapi32.lib .data string db "SeShutdownPrivilege",0 .data? tkp TOKEN_PRIVILEGES <> hToken HANDLE ? hProc HANDLE ? .code start: invoke GetCurrentProcess mov hProc, eax invoke OpenProcessToken, eax, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken invoke LookupPrivilegeValue, NULL, addr string, addr tkp.Privileges[0].Luid mov tkp.PrivilegeCount, 1 mov tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges, hToken, FALSE, addr tkp, 0, NULL, 0 invoke ExitWindowsEx, EWX_SHUTDOWN or EWX_FORCE, 0 invoke ExitProcess,NULL end start