WIN32 API радость и мучение школьника...

Тема в разделе "WASM.BEGINNERS", создана пользователем Everhest, 13 май 2008.

  1. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    Я учусь в простой школе, программирую на FASMe, помочь конечно некому, поэтому я решил обратиться к вам.

    Первый вопрос который меня мучает около года - это что изменяют Апи фичи из регистров и флагов, а что не трогают. И какие регистры кого меняют. Следом номера ошибок, к примеру, что обозначает возращаймое значение: -1 при вызове WriteFileA, но самое интересное когда смотришь на файл и понимаешь по размеру что операция прошла удачно??? В этом случае я понимаю о необходимости чтения Агнера Фога, но где взять его литературу (желательно на русском). Реестр тоже интересная вещь: RegOpenKey, RegCloseKey, RegSetValue - работают без проблем, НО RegQuerlyValue, дохнет?

    Поесните пожалуйста в чем дело. А некоторые примеры кину на днях.
     
  2. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    И вот ещё вспомнил: ГУГЛ.
     
  3. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    UTeX
    ида. гениально. может ты всё таки хотел сказать Olly?

    RegQueryValueEx тыкай и в олли как раз таки смотри что происходит при/после(в соответствии с твоим скиллом) вызова RQV().
     
  4. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Если я правильно понял вопрос, то вот:
    API-функции имеют право менять, согласно конвенциям вызова, регистры EAX, EDX и ECX. Все остальные (если не брать в расчёт сервисный, по сути, EIP) после их выполнения остаются прежними. Что же насчёт флагов - то тут всё зависит от последней флаго-зависимой команды, выполненной в данной функции. Теоретически (в общем случае), меняются все флаги, кроме DF. А сам DF, еснеошибаюсь, проставляется в 0.
     
  5. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    UTeX, TOLSTOPUZ, Comer_
    Ребята не надоело еще флудить? Человек ведь задал несколько точных и конкретных вопросов, а вы Гугл, да Гугл или еще хуже отладчик.

    Everhest
    API-функции могут изменить любые из регистров, кроме ebx,esi,edi,esp,ebp, а также они не меняют флаг направления в регистре флагов. Теже самые правила ты должен соблюдать при программировании CALLBACK-функций. Также при вызове этих самых API значение указателя на вершину стека должно быть выровнено на 4, иначе возможно непредсказуемое поведение вызываемой API. Дополню это тем, что при вызове Native-функций и при передаче им параметров в виде указателей (куда будет помещен результат или часть результата), эти параметры в виде адреса должны быть выровнены на 4, иначе функция может возвратить ошибку.

    Все возвращаемые значения смотрятся в справочике по API-функциям. Он идет в комплекте с Platform SDK. Также он является частью MSDN - это бооольшая справка по всему от Micro$oft.

    Дохнет потому как передаешь не правильные параметры. Скажи как конкретно дохнет или приведи код.

    Агнера Фога еще рано читать, да и не так жизненно необходимо как справочник по API.
     
  6. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    Osen замени вторую букву в своём нике на более подходящую, прежде чем тыкать мой ник:
    я запостил вполне содержательный ответ.

    http://www.wasm.ru/forum/viewtopic.php?pid=243370#p243370
    перечитай
     
  7. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    Ну и где взять MSDN на русском? Я то английский знаю на 3 и мало что смогу понять. На счет примеров с использованием RegQuerlyValue, скину завтра.

    На сколько я помню получаймое значение -1 в регистре eax после вызова Апи свидетельствует о неудаче. Но с WriteFile разобрался, вина всему моя неправильная установка SEH.

    DEEP и Osen спасибо за ответы.
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Вообще-то WriteFile возвращает значение типа BOOL, и после неё eax=0 - ошибка, а любое другое значение сигнализирует об успехе.
     
  9. requiem

    requiem New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2005
    Сообщения:
    71
    http://www.wasm.ru/forum/viewtopic.php?id=22898
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    желательно, чтобы при вызове апи был сброшен DF. иначе могут быть проблемы (попробуй вызвать MessageBoxA с DF=1)
     
  11. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    Great
    Конечно. DF всегда в 0, поэтому я и говорил, что он не должен менятся, а если он меняется в результате какого-либо алгоритма, то перед вызовом любой API его надо восстанавливать в первоначальное значение, т.к. в коде всех API нет выставления флага направления.
     
  12. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    Ну и как можно по другому прочитать данные с ключа в формате REG_SZ с помощью RegQueryValue ?

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4.  
    5. include '..\..\include\win32a.inc'
    6. ERROR_SUCCESS   = 0
    7.  
    8. section '.data' data readable writeable
    9.  
    10.     message_create  db 'Будет создан раздел "HKEY_CURRENT_USER\.DEFAULT\Test\STRING"',0
    11.     message_write   db 'В раздел "HKEY_USERS\Test\STRING" будет вписана строка - "Hello World!"',0
    12.     message_error   db 'При работе с реестром произошла ошибка, программа будет закрыта.',0
    13.     title_info  db 'Информация',0
    14.     text_to_write   db 'Hello World!',0
    15.     sub_key     db '.DEFAULT\Test\',0
    16.     sub_text_key    db 'STRING',0
    17.     buffer      rb 260
    18.     hkey        dd ?
    19.  
    20. section '.code' code readable executable
    21.  
    22.   start:
    23.     invoke  MessageBox,0,message_create,title_info,MB_ICONINFORMATION
    24.       .seh_init:
    25.     push    error
    26.     pushd   dword[fs:0]
    27.     mov [fs:0], esp
    28.  
    29.       .create_key:
    30.     invoke  RegCreateKey, HKEY_USERS, sub_key, hkey
    31.     cmp eax, ERROR_SUCCESS
    32.     jne error
    33.  
    34.       .write_key:
    35.     invoke  MessageBox,0,message_write,title_info,MB_ICONINFORMATION
    36.     invoke  lstrlen,text_to_write
    37.     invoke  RegSetValueEx,[hkey],sub_text_key,0,REG_SZ,text_to_write,eax
    38.     cmp eax,ERROR_SUCCESS
    39.     jne error
    40.  
    41.       .read_key:
    42.     ;    invoke  RegQueryValueEx,[hkey],sub_text_key, 0, REG_SZ, buffer, 260
    43.     invoke  RegQueryValue,[hkey], sub_text_key, buffer, 260
    44.     cmp eax,ERROR_SUCCESS
    45.     jne error
    46.     invoke  MessageBox,0,buffer,title_info,MB_ICONINFORMATION
    47.  
    48.       .close_key:
    49.     invoke  RegCloseKey,[hkey]
    50.  
    51.     mov esp,[fs:0]
    52.     popd    dword[fs:0]
    53.     jmp close
    54.   error:
    55.     invoke  MessageBox,0,message_error,0,MB_ICONERROR
    56.   close:
    57.     invoke  ExitProcess,0
    58.  
    59.  
    60. section '.idata' import data readable writeable
    61.  
    62. macro import lib,[functions]
    63. { common macro import_#lib \{ import lib,functions \} }
    64. macro api [functions]
    65. { common macro all_api \{ all_api
    66.               api functions \} }
    67. macro all_api {}
    68. include '..\..\include\api/kernel32.inc'
    69. include '..\..\include\api/user32.inc'
    70. include '..\..\include\api/gdi32.inc'
    71. include '..\..\include\api/advapi32.inc'
    72. include '..\..\include\api/comctl32.inc'
    73. include '..\..\include\api/comdlg32.inc'
    74. include '..\..\include\api/shell32.inc'
    75. include '..\..\include\api/wsock32.inc'
    76. purge import,api
    77.      library kernel32,'KERNEL32.DLL',\
    78.          user32,'USER32.DLL',\
    79.          gdi32,'GDI32.DLL',\
    80.          advapi32,'ADVAPI32.DLL',\
    81.          comctl32,'COMCTL32.DLL',\
    82.          comdlg32,'COMDLG32.DLL',\
    83.          shell32,'SHELL32.DLL',\
    84.          wsock32,'WSOCK32.DLL'
    85.      import_kernel32
    86.      import_user32
    87.      import_gdi32
    88.      import_advapi32
    89.      import_comctl32
    90.      import_comdlg32
    91.      import_shell32
    92.      import_wsock32
    93.      all_api
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Everhest
    Неизменный лидер в рейтинге советов - MSDN. Пользуйтесь словарем, переводчиком, учебником английского, но НИКОГДА не вызывайте API до прочтения и полного понимания соответствующей статьи MSDN.
    А по сути последний параметр - указатель на размер буфера, а не сам размер.
     
  14. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Everhest
    Даже если MSDN будет полноценно переведён на русский, английский знать всё же абсолютно необходимо. На уровне умения понять технический текст на оном языке, коненчо -- свободно говорить вовсе не требуется. Кстати, выучить язык именно на таком уровне меня заставила как раз нужда читать англоязычную документацию.

    Кроме того, помимо MSDN, часто бывают нужны другие документы. Например, вознамерился написать игрушку, значит, нужно читать про DirectX. В имеющихся книжках на русском даны лишь его основы, очень многое там опущено, но имеется либо в SDK, либо со всяких статьях и форумах -- очень часто англоязычных. Так что по-любому надо учить :)
     
  15. Torvald

    Torvald New Member

    Публикаций:
    0
    Регистрация:
    3 мар 2008
    Сообщения:
    9
    Дружище, вот:
    www.citforum.ru
    www.intuit.ru
    www.rsdn.ru
    Там много полезного, покапайся.
    Из книг найди Пирогова, неплохо пишет.
     
  16. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    Спасибо всем, вообщем помогли очень сильно... :))