LookupPrivelegeValue - так и должно быть?

Тема в разделе "WASM.WIN32", создана пользователем afybc, 18 окт 2006.

  1. afybc

    afybc New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2006
    Сообщения:
    73
    Почему при вызове LookupPrivelegeValue в eax возвращается "1", а LastError даёт ERROR_IO_PENDING? Но при этом AdjustTokenPrivileges работает нормально. Так и должно быть? В msdn ответа не нашел.
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. ;___________________________________________________________________________________________________________________________
    5.  
    6. TOKEN_ADJUST_PRIVILEGES         = 0x0020
    7. TOKEN_QUERY                     = 0x0008
    8. SE_PRIVILEGE_ENABLED            = 0x0002
    9.  
    10.  
    11.  
    12.  
    13. ;___________________________________________________________________________________________________________________________
    14. section '.code' code readable executable writeable
    15.  
    16.   start:
    17.     invoke   GetCurrentProcess
    18.     invoke   OpenProcessToken, eax, TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY, phToken
    19.     invoke   LookupPrivilegeValue, NULL, pszPrivName, pNewState.Luid
    20.     test     eax, eax
    21.     jnz      @f
    22.     invoke   CloseHandle, phToken
    23.     jmp      finish
    24.  
    25.     @@:
    26.     invoke   AdjustTokenPrivileges, [phToken], FALSE, pNewState, NULL, NULL, NULL
    27.  
    28.   finish:
    29.     invoke   ExitProcess,0
    30.  
    31.  
    32. ;___________________________________________________________________________________________________________________________
    33. section '.data' code readable executable writeable
    34. phToken         dd   ?
    35. pszPrivName     db 'SeDebugPrivilege',0
    36.  
    37. align 4
    38. pNewState:
    39.         .PrivilegeCount  dd 1
    40.         .Luid            dd ?
    41.         .Attributes      dd SE_PRIVILEGE_ENABLED
    42.         .Size = $ - pNewState
    43.  
    44. pluid           dd ?
    45. ReturnLength    dd ?
    46.  
    47. ;___________________________________________________________________________________________________________________________
    48. section '.idata' import data readable writeable
    49.  
    50.   library kernel32,'kernel32.DLL',\
    51.           advapi32,'advapi32.dll'
    52.  
    53.   include '%includepath%\APIA\kernel32.inc'
    54.   include '%includepath%\APIA\advapi32.INC'
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    afybc
    Значит, не искал:
    Return Values
    If the function succeeds, the function returns nonzero.
     
  3. afybc

    afybc New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2006
    Сообщения:
    73
    Как раз это то я и нашел. У меня функция возвращает nonzero. A GetLastError даёт ERROR_IO_PENDING. Вопрос почему??
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Так что тебя беспокоит?

    Это код последней ошибки. Он не обязательно выставляется последней вызванной функцией. Вот если функция вернула ошибку, только тогда нужно проверять LastError.
     
  5. afybc

    afybc New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2006
    Сообщения:
    73
    Спасибо понял. Я думал что перед выходм из LookupPrivelegeValue, LookupPrivelegeValue делает SetLastError(ERROR_SUCCSES).