Справочник по WIN API

Тема в разделе "WASM.BEGINNERS", создана пользователем Luzer, 16 янв 2008.

  1. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    Доброго времени суток. Следует уточнить, что нужно такой справочник, в котором показывается какие регистры изменяются и какие значения, что означают. Сам справочник есть, но там про регистры нет ничего. Есть ли таковые вообще?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ссылку не дам, но скажу, что:

    1. В основном используется stdcall (стек чистит вызываемая ф-ия)
    2. При вызове API сохраняют регистры ebx, esi, edi, ebp и ждут от пользовательских ф-ий того же. (Это в большей степени касается callback)
    3. API ожидают, что EFLAGS.DF сброшен (cld).

    Пункт 2 относится только к 32 битам. В 64 сохраняется больше регистров.
     
  3. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    я ничего не понял) Вот например, функция GetFileAttributes. передаю путь к файлу. Вызываю. А как мне получить данные, которые она вернула? Через делфи пошагово могу отследить какие регистры были изменены. Но, как я не извращался, они постоянно одинакого меняются.
     
  4. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    Код (Text):
    1. function GetFileAttributes(lpFileName: PChar): DWORD; stdcall;
    функция вернёт DWORD :)

    Код (Text):
    1. var
    2.   dwTme:dword;
    3. begin
    4. dwTmp:=GetFileAttributes('file.ext');
    5. ...
     
  5. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    Luzer
    возвращаемое значение всегда лови в eax.
     
  6. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    эт я понял, что она дворд вернет)
    то что в еах, я так и думал. Вот если передать строку на файл, вернет 0FFFFFFFFh
    в случаи с папкой тоже самое) дак как тогда определить?
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    spencer
    Ага, про возвращаемое значение я забыл.

    Luzer
    Вот пример:

    Код (Text):
    1. main:
    2.  push ebp ;подготовим стековый кадр.
    3.  mov ebp, esp ;Этого можно не делать, но ebp надо сохранить.
    4.  push ebx ;Эти регистры лучше сохранить в main
    5.  push esi  ; т.к. вызывающая ф-ия, вероятно,
    6.  push edi  ; в них что-то сохранила.
    7.  mov ebx, 0x5
    8.  cld ;если мы до этого меняли DF, то перед вызовом его надо восстановить. Иначе some_API_function может осерчать на нас исключением.
    9. @@:
    10.  call some_API_function
    11.  or eax, eax ;проверим возвращаемое значение.
    12.  jz @f ;Если 0 -- выйдем мз цикла.
    13.  sub ebx, 0x1 ;можно не беспокоиться, some_API_function не изменит значение ebx. Этого нельзя сказать про другие регистры, кроме ebp, esi, edi.
    14.  jnz @b
    15. @@:
    16.  pop edi
    17.  pop esi
    18.  pop ebx
    19.  pop ebp
    20.  ret
     
  8. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    Код (Text):
    1. Return Values
    2. If the function succeeds, the return value contains the attributes of the specified file or directory.
    3. If the function fails, the return value is INVALID_FILE_ATTRIBUTES. To get extended error information, call GetLastError.
    задаем поиск попапке .../include файлов *.h содержаших фразу INVALID_FILE_ATTRIBUTES
    нашелся лишь WinBase.h, смотрим в него:
    #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)

    вот тебе и 0FFFFFFFFh. Думаю ход мысли понятен и он проясяет описываемую тобою картину
     
  9. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    да да) тока я не врубаюсь) почему всегда это возвращается...
     
  10. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    врублися-)) только о существовании справочника я так и не узнал:)
    Придется делать, как спэнсэр говорит)
     
  11. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    Вот такая вставочка на делфи
    Код (Text):
    1. jmp @start
    2. @sa: db "c:\test",0
    3.  
    4. @start:
    5. mov eax, offset @sa
    6. inc eax
    7. push 0
    8. push eax
    9. push eax
    10. push 0
    11. call MessageBoxA
    почему вместо строки, вылезает две кракозябры? ничего не понимаю
     
  12. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    с первого взгляда вес корректно, но я бы не стал делфи юзать, тем более для проверки асм вставочек. Поюзай дебагер поставив бряк на call MessageBoxA и погляди что на самом деле лежит в [eax]

    P/S
    зачем там inc eax?
     
  13. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    inc остался от предыдущего раза, когда я из var'а брал строку...
    Раньше этот пример и на делфях катил=)

    з.ы: Почему-то делфя заменяет "\" на пробел... хрень какая-то) косяк ее видать.
     
  14. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    Код (Text):
    1.     jmp @start
    2.     @sa: db 'c:\test',0
    3.  
    4.     @start:
    5.     lea eax, @sa+1
    6.     push 0
    7.     push eax
    8.     push eax
    9.     push 0
    10.     call MessageBoxA
    \t - символ табуляции
    работает только в строках ограниченных двойными кавычками
     
  15. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    zet действительно=)
    Опять путаница. Делаю все в масме
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. extern GetFileAttributes@4:near
    5. includelib kernel32.lib
    6. .data
    7. sss db "C:\test\tets.txt",0
    8. .code
    9. start:
    10. push offset sss
    11. call GetFileAttributes@4
    12. end start
    testmasm.obj : error LNK2001: unresolved external symbol _GetFileAttributes@4
    testmasm.exe : fatal error LNK1120: 1 unresolved externals

    Тоже самое делаю с FindNextFile - все нормально)) Почему?
     
  16. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    GetFileAttributesA
     
  17. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. extern GetFileAttributesA@4:near
    5. includelib \masm32\lib\kernel32.lib
    6. .data
    7. sss db "C:\test\tets.txt",0
    8. .code
    9. start:
    10. push offset sss
    11. call GetFileAttributesA@4
    12. end start
     
  18. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    У меня где-то лежал талмуд на английском языке, где описывались спецификации вызовов процедур. Но блин пока не смог найти.

    К тому, что уже сказано могу добавить то, что если процедура работает с плавающей точкой, то результат в st0, если MMX, то MM0. При этом полагаться на содержимое других регистров процедура не должна они могут быть любыми. То же относится и к SSE.
     
  19. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    zet, не понятно, почему с "А". Ведь есть функция и без А, я смотрел в модуле windows.pas
     
  20. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Luzer
    если работаешь с масм то смотри на в .pas а в .inc в самом масме, а там соотвественно или с А или с W. ЕСли бы ты подключил kernel32.inc то никакой буквы A добавлять не нужно было бы, а так как у вас извольте добавлять.