Всем привет! Ниже приведенная процедура должна выключать компьютер. Если я включаю ее в EXE, то все работает - комп. выключается. Из ДЛЛ же она не работает. Вернее не работает вызов AdjustTokenPrivileges - после нее в EAX - NULL Если вместо хэндла процесса (который возвращает GetCurrentProcess) использовать хэндл инстанса ДЛЛ, то результат тот же. В чем проблема? Заранее спсибо. вот код (Flat asm): Код (Text): proc powerControl _action mov esi, [_action] invoke GetCurrentProcess invoke OpenProcessToken, [hhh], TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken invoke LookupPrivilegeValue, NULL, szShut, priveleges.Privileges0.Luid mov [priveleges.PrivilegeCount], 1 mov [priveleges.Privileges0.Attributes], SE_PRIVILEGE_ENABLED lea eax, [priveleges] invoke AdjustTokenPrivileges, [hToken], FALSE, eax, 0, NULL, 0 cmp eax, NULL jnz qwerty invoke MessageBox, HWND_DESKTOP, szShut, NULL, MB_ICONERROR + MB_OK ret qwerty: invoke ExitWindowsEx, esi, NULL xor eax, eax ret endp
Спасибо за код. Правда я им не воспользовался. Заработал мой собственный, но повода для радости нет - я не понимаю причин Ошибка в следующем: При таком расположении данных в дата-сенгменте вылетает на вызове AdjustTokenPrivileges с ошибкой "Invalid access to memory location" Код (Text): section '.data' data readable writeable datadump db 1169 dup (0) [b]hToken dd 0 priveleges TOKEN_PRIVILEGES, <>[/b] Стоит мне поменять местами переменные, то все работает : Код (Text): section '.data' data readable writeable [b]hToken dd 0 priveleges TOKEN_PRIVILEGES, <>[/b] datadump db 1169 dup (0) Вот сама процедура: Код (Text): proc powerControl _action mov esi, [_action] invoke GetCurrentProcess invoke OpenProcessToken, eax, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken cmp eax, NULL jnz qwerty0 stdcall ShowLastError, 0 ret qwerty0: invoke LookupPrivilegeValue, NULL, szShut, priveleges.Privileges0.Luid cmp eax, NULL jnz qwerty1 stdcall ShowLastError, 0 ret qwerty1: mov [priveleges.PrivilegeCount], 1 mov [priveleges.Privileges0.Attributes], SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges, [hToken], FALSE, priveleges, 0, NULL, 0 ;invoke CloseHandle, [hToken] cmp eax, NULL jnz qwerty stdcall ShowLastError, 0 ret qwerty: invoke ExitWindowsEx, esi, NULL xor eax, eax ret endp Где грабли ? Заранее спасибо.