Выключение комп. (Windows) - из DLL не работает. Почему ?

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 10 апр 2006.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Всем привет!



    Ниже приведенная процедура должна выключать компьютер.

    Если я включаю ее в EXE, то все работает - комп. выключается.



    Из ДЛЛ же она не работает. Вернее не работает

    вызов AdjustTokenPrivileges -

    после нее в EAX - NULL



    Если вместо хэндла процесса (который возвращает GetCurrentProcess) использовать хэндл инстанса ДЛЛ,

    то результат тот же.



    В чем проблема?

    Заранее спсибо.



    вот код (Flat asm):
    Код (Text):
    1. proc powerControl _action
    2.     mov esi, [_action]
    3.  
    4.     invoke GetCurrentProcess
    5.     invoke OpenProcessToken, [hhh], TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
    6.  
    7.     invoke LookupPrivilegeValue, NULL, szShut, priveleges.Privileges0.Luid
    8.  
    9.  
    10.     mov [priveleges.PrivilegeCount], 1
    11.     mov [priveleges.Privileges0.Attributes], SE_PRIVILEGE_ENABLED
    12.  
    13.     lea eax, [priveleges]
    14.     invoke AdjustTokenPrivileges, [hToken], FALSE, eax, 0, NULL, 0
    15.  
    16.     cmp eax, NULL
    17.     jnz qwerty
    18.     invoke  MessageBox, HWND_DESKTOP, szShut, NULL, MB_ICONERROR + MB_OK
    19.     ret
    20. qwerty:
    21.  
    22.     invoke ExitWindowsEx, esi, NULL
    23.     xor eax, eax
    24.     ret
    25. endp
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
  3. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Спасибо за код.

    Правда я им не воспользовался.

    Заработал мой собственный,

    но повода для радости нет - я не понимаю причин



    Ошибка в следующем:



    При таком расположении данных в дата-сенгменте

    вылетает на вызове AdjustTokenPrivileges

    с ошибкой "Invalid access to memory location"
    Код (Text):
    1.  
    2. section '.data' data readable writeable
    3. datadump db  1169 dup (0)
    4. [b]hToken dd 0
    5. priveleges TOKEN_PRIVILEGES, <>[/b]
    6.  






    Стоит мне поменять местами переменные, то все работает :
    Код (Text):
    1.  
    2. section '.data' data readable writeable
    3. [b]hToken dd 0
    4. priveleges TOKEN_PRIVILEGES, <>[/b]
    5. datadump db  1169 dup (0)
    6.  






    Вот сама процедура:


    Код (Text):
    1.  
    2. proc powerControl _action
    3.  
    4.     mov esi, [_action]
    5.  
    6.     invoke GetCurrentProcess
    7.  
    8.     invoke OpenProcessToken, eax, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
    9.     cmp eax, NULL
    10.     jnz qwerty0
    11.     stdcall ShowLastError, 0
    12.     ret
    13.  
    14. qwerty0:
    15.  
    16.     invoke LookupPrivilegeValue, NULL, szShut, priveleges.Privileges0.Luid
    17.     cmp eax, NULL
    18.     jnz qwerty1
    19.     stdcall ShowLastError, 0
    20.     ret
    21.  
    22. qwerty1:
    23.  
    24.     mov [priveleges.PrivilegeCount], 1
    25.     mov [priveleges.Privileges0.Attributes], SE_PRIVILEGE_ENABLED
    26.  
    27.     invoke AdjustTokenPrivileges, [hToken], FALSE, priveleges, 0, NULL, 0
    28.     ;invoke CloseHandle, [hToken]
    29.  
    30.     cmp eax, NULL
    31.     jnz qwerty
    32.     stdcall ShowLastError, 0
    33.     ret
    34.  
    35. qwerty:
    36.  
    37.     invoke ExitWindowsEx, esi, NULL
    38.     xor eax, eax
    39.     ret
    40. endp
    41.  






    Где грабли ?

    Заранее спасибо.