Ошибки выполнения API Windows

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

  1. mobymax

    mobymax New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    1
    Известен код ошибки выполнения API функции, как определить какая ошибка скрывается за этим шестнадцатиричным кодом? Обычно код ошибки возаращается в регистре EAX. Аналогично и с параметрами для функций. Например есть необходимость применить какой-то параметр, но неизвестен его код. Где можно узнать, или каким образом можно определить коды ошибок и параметров для незнакомых функций?
     
  2. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Код (Text):
    1. void GET_ERROR()
    2. {
    3.     TCHAR szBuf[80];
    4.     LPVOID lpMsgBuf;
    5.     DWORD ERROR_DW = GetLastError();
    6.     FormatMessage(
    7.     FORMAT_MESSAGE_ALLOCATE_BUFFER |
    8.     FORMAT_MESSAGE_FROM_SYSTEM,
    9.     NULL,
    10.     ERROR_DW,
    11.     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    12.     (LPTSTR) &lpMsgBuf,
    13.     0, NULL );
    14.     wsprintf(szBuf,"Ошибка %d: %s",ERROR_DW, lpMsgBuf);
    15.     MessageBox(NULL, szBuf, 0, MB_OK);
    16.  
    17. }
    после вызова апи
     
  3. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    ой блин тебеж на асме, ну переделай в общем :)
     
  4. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    WIN32
    LocalFree(lpMsgBuf) забыл, умник.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вообще говоря, если после GET_ERROR() будет сразу ExitProcess, то на освобождение памяти можно забить.
    хотя это больше вопрос красоты =)
     
  6. Zhelezovsky

    Zhelezovsky Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    39
    mobymax

    Коды параметров объявлены во включаемых файлах. На ассемблере - *.inc, например windows.inc. На С - windows.h и другие заголовочные файлы. В каком именно файле объявлены коды параметров каждой конкретной функции, написано в описании этой функции в MSDN.
    В MSDN значения кодов ошибок не встречал (хотя специально не искал - мне достаточно, как OllyDbg их показывает).
     
  7. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    koderr не груби, ну ошибься малёк.
     
  8. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Код (Text):
    1. .386
    2. .MODEL Flat, STDCALL
    3. ;--------------------------------------------------------------------- ---
    4. ;   Functions
    5. ;--------------------------------------------------------------------- ---
    6.  
    7. ;--------------------------------------------------------------------- ---
    8. ; libs
    9. ;--------------------------------------------------------------------- ---
    10. includelib  c:\masm32\lib\kernel32.lib
    11. includelib  c:\masm32\lib\user32.lib
    12. include     c:\masm32\include\kernel32.inc
    13. include     c:\masm32\include\user32.inc
    14. include     c:\masm32\include\windows.inc
    15. ;--------------------------------------------------------------------- ---
    16. ; D A T A
    17. ;--------------------------------------------------------------------- ---
    18. .DATA?
    19. LASTERR     DWORD   ?
    20. lpBuffer    DB 1024 DUP (?)
    21. lpSource    DB 1024 DUP (?)
    22. .DATA
    23. FILENAME    db  "C:\text.txt",0
    24.  
    25. .CODE
    26. GETERROR    PROC
    27.     invoke  GetLastError
    28.     mov     LASTERR,eax
    29.     invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,DWORD PTR DS:[LASTERR],0,addr lpBuffer,1024,0
    30.     push    0
    31.     push    0
    32.     push    offset lpBuffer
    33.     push    0
    34.     call    MessageBox
    35.     ret
    36. GETERROR endp
    37.  
    38. start:
    39.     invoke  CreateFile,addr FILENAME,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
    40.     call    GETERROR
    41.     invoke  ExitProcess,0
    42. end start
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    mobymax
    Тебе надо свой код определить?
    Для преобразования кода в строку читай Message Tables
     
  10. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    зы:
    Я тихо,но скатываюсь под стол!!! :))))
     
  11. horpis

    horpis New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    154
    кто сказал что в MSDN нет кодов ошибок, там есть есть многое....
    ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WINCE.v50.en/wcecoreos5/html/wce50grferrorvalues.htm
     
  12. Zhelezovsky

    Zhelezovsky Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    39
    Ничего такого я не говорил. Знаю, что в MSDN есть многое. Я всего лишь сказал, что не искал специально.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    в MSDN есть всё, надо только поискать ;)
     
  14. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    если рець идёт о win32 api, то как уже было показано, юзай FormatMessage
    но если для native-api нужно, то ф-ций позволяющих получить сообщение вроде нет (хотя возможно плохо искал) но зато ко всем кодам есть комментарии в ntstatus.h =)
     
  15. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    RtlNtStatusToDosError?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Cr4sh
    хз, но у меня катило FormatMessage для NTSTATUS'а.
     
  17. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Great
    ниче се..
    по крайней мере ErrLook у меня не понимает
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Nouzui
    Ну, большинство кодов-то совпадает. А вышеупомянутая функция загоняет код возврата в LastError.
     
  19. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    STATUS_WAIT_3 (0x03) - FormatMessage="The system cannot find the path specified. "
    STATUS_ABANDONED (0x080) - FormatMessage="There are no child processes to wait for. "
    STATUS_USER_APC (0x0C0) - FormatMessage="The operating system cannot run %1. "
    итд
    STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) - ForrmatMessage возвращает ошибку
    STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L) - то же самое..
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Nouzui
    Да, не то сказал. Я думал, функция снимает верхние биты и сохраняет полученный код возврата; посмотрел реализацию — оказалось всё серьёзнее, там используются таблицы для преобразования.