Всем привет! API GetLastError() возвращает код последней ошибки, из которого при помощи FormatMessage() можно получить более внятную строку, типа "Операция успешно завершена", или-же "Неверный дескриптор". Здесь всё ясно, и я вынес это дело в отдельную процедуру: Код (ASM): proc LastError invoke GetLastError invoke FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,errMes,256,0 invoke CharToOem,errMes,errMes cinvoke printf,<'%s',0>,errMes ret endp Однако в некоторых случаях можно получить "Error Success", а по факту функция не отработала, о чём свидетельствует код "LastStatus" - вот такая ситуация в отладчике x64Dbg: Вопрос - какими средствами API можно получить строковое представление статуса последней операции? Пробовал брать код статуса напрямую из TEB и передавать его той-же FormatMessage(), но она не принимает его утверждая, что нет такого кода в сис.таблице сообщений. Подозреваю, что нужно сменить эту таблицу в аргументе FormatMessage(), но на какую - хз. Кстати коды Error/Status можно брать из TEB потока: Код (ASM): mov eax,[fs:0034h] ;// Win32 LastError code mov ebx,[fs:0bf4h] ;// Win32 LastStatus code mov eax,[gs:0068h] ;// Win64 LastError code mov ebx,[gs:1250h] ;// Win64 LastStatus code ;//*********************************************** 0: kd> dt _teb ntdll!_TEB +0x0000 NtTib : _NT_TIB +0x0038 EnvironmentPointer : Ptr64 Void +0x0040 ClientId : _CLIENT_ID +0x0050 ActiveRpcHandle : Ptr64 Void +0x0058 ThreadLocalStorage : Ptr64 Void +0x0060 PEB : Ptr64 _PEB +0x0068 LastErrorValue : Uint4B ...... +0x1250 LastStatusValue : Uint4B
RtlNtstatusToDosError вроде, затем в FormatMessage. Но я не был бы таким оптимистичным по этому поводу, если функция сама не ставит LastError, то и не стоит на него рассчитывать, LastStatus вообще может остаться там хрен пойми с какого вызова. Может быть, что функция возвращает код ошибки через EAX/RAX, читай MSDN. По сабжу: некоторых особенных кодов ошибок в базе нет, например, того же wininet'а. Чтобы FormatMessage поддерживал эти коды ошибок, нужно HMODULE дллки в FormatMessage передать, и последняя подцепит их.
Enjoy... спасибо помогло! Оказывается таблица с сообщениями NTSTATUS лежит (как и ожидалось) в Ntdll.dll. Такой вариант отображает строки как кодов "LastError", так и кодов "LastStatus": Код (ASM): proc LastError invoke GetLastError invoke FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,errMes,256,0 invoke CharToOem,errMes,errMes cinvoke printf,<' %s',0>,errMes ; ret invoke GetModuleHandle,<'ntdll.dll',0> ;//<--- подключаем таблицу "NTSTATUS" mov ebx,[fs:0bf4h] invoke FormatMessage,FORMAT_MESSAGE_FROM_HMODULE + FORMAT_MESSAGE_IGNORE_INSERTS,\ eax,ebx,0,errMes,512,0 invoke CharToOem,errMes,errMes cinvoke printf,<' lastStatus: %s',0>,errMes ret endp --- Сообщение объединено, 25 авг 2023 --- PS: здесь нашёл интересную мыслю на эту тему + пдфка с привязанными к NtStatus кодов LastError: https://www.osr.com/blog/2020/04/23/ntstatus-to-win32-error-code-mappings/