Строка с описанием "LastError" и "LastStatus"

Тема в разделе "WASM.WIN32", создана пользователем Marylin, 25 авг 2023.

Метки:
  1. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    Всем привет!
    API GetLastError() возвращает код последней ошибки, из которого при помощи FormatMessage() можно получить более внятную строку, типа "Операция успешно завершена", или-же "Неверный дескриптор". Здесь всё ясно, и я вынес это дело в отдельную процедуру:
    Код (ASM):
    1. proc     LastError
    2.          invoke  GetLastError
    3.          invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,errMes,256,0
    4.          invoke  CharToOem,errMes,errMes
    5.         cinvoke  printf,<'%s',0>,errMes
    6.          ret
    7. endp
    Однако в некоторых случаях можно получить "Error Success", а по факту функция не отработала, о чём свидетельствует код "LastStatus" - вот такая ситуация в отладчике x64Dbg:

    Status.png

    Вопрос - какими средствами API можно получить строковое представление статуса последней операции? Пробовал брать код статуса напрямую из TEB и передавать его той-же FormatMessage(), но она не принимает его утверждая, что нет такого кода в сис.таблице сообщений. Подозреваю, что нужно сменить эту таблицу в аргументе FormatMessage(), но на какую - хз.

    Error.png

    Кстати коды Error/Status можно брать из TEB потока:
    Код (ASM):
    1.  
    2.    mov   eax,[fs:0034h]  ;// Win32 LastError  code
    3.    mov   ebx,[fs:0bf4h]  ;// Win32 LastStatus code
    4.  
    5.    mov   eax,[gs:0068h]  ;// Win64 LastError  code
    6.    mov   ebx,[gs:1250h]  ;// Win64 LastStatus code
    7.  
    8. ;//***********************************************
    9. 0: kd> dt _teb
    10. ntdll!_TEB
    11.    +0x0000  NtTib              : _NT_TIB
    12.    +0x0038  EnvironmentPointer : Ptr64 Void
    13.    +0x0040  ClientId           : _CLIENT_ID
    14.    +0x0050  ActiveRpcHandle    : Ptr64 Void
    15.    +0x0058  ThreadLocalStorage : Ptr64 Void
    16.    +0x0060  PEB                : Ptr64 _PEB
    17.    +0x0068  LastErrorValue     : Uint4B
    18. ......
    19.    +0x1250  LastStatusValue    : Uint4B
     
    M0rg0t и Mikl___ нравится это.
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    RtlNtstatusToDosError вроде, затем в FormatMessage. Но я не был бы таким оптимистичным по этому поводу, если функция сама не ставит LastError, то и не стоит на него рассчитывать, LastStatus вообще может остаться там хрен пойми с какого вызова. Может быть, что функция возвращает код ошибки через EAX/RAX, читай MSDN.

    По сабжу: некоторых особенных кодов ошибок в базе нет, например, того же wininet'а. Чтобы FormatMessage поддерживал эти коды ошибок, нужно HMODULE дллки в FormatMessage передать, и последняя подцепит их.
     
    Mikl___ и Marylin нравится это.
  3. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    189
    Enjoy... спасибо помогло!
    Оказывается таблица с сообщениями NTSTATUS лежит (как и ожидалось) в Ntdll.dll.
    Такой вариант отображает строки как кодов "LastError", так и кодов "LastStatus":
    Код (ASM):
    1.  
    2. proc     LastError
    3.          invoke  GetLastError
    4.          invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,errMes,256,0
    5.          invoke  CharToOem,errMes,errMes
    6.         cinvoke  printf,<' %s',0>,errMes
    7. ;         ret
    8.          invoke  GetModuleHandle,<'ntdll.dll',0>  ;//<--- подключаем таблицу "NTSTATUS"
    9.          mov     ebx,[fs:0bf4h]
    10.          invoke  FormatMessage,FORMAT_MESSAGE_FROM_HMODULE + FORMAT_MESSAGE_IGNORE_INSERTS,\
    11.                                                              eax,ebx,0,errMes,512,0
    12.          invoke  CharToOem,errMes,errMes
    13.         cinvoke  printf,<' lastStatus:  %s',0>,errMes
    14.          ret
    15. endp
    16.  
    --- Сообщение объединено, 25 авг 2023 ---
    PS: здесь нашёл интересную мыслю на эту тему + пдфка с привязанными к NtStatus кодов LastError:
    https://www.osr.com/blog/2020/04/23/ntstatus-to-win32-error-code-mappings/
     
    M0rg0t, Mikl___ и R81... нравится это.
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Marylin, оффтоп, но сорцы х64дбг открыты, можно глянуть сразу там.
     
    Marylin нравится это.
  5. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    449
    Marylin нравится это.