Я учусь в простой школе, программирую на FASMe, помочь конечно некому, поэтому я решил обратиться к вам. Первый вопрос который меня мучает около года - это что изменяют Апи фичи из регистров и флагов, а что не трогают. И какие регистры кого меняют. Следом номера ошибок, к примеру, что обозначает возращаймое значение: -1 при вызове WriteFileA, но самое интересное когда смотришь на файл и понимаешь по размеру что операция прошла удачно??? В этом случае я понимаю о необходимости чтения Агнера Фога, но где взять его литературу (желательно на русском). Реестр тоже интересная вещь: RegOpenKey, RegCloseKey, RegSetValue - работают без проблем, НО RegQuerlyValue, дохнет? Поесните пожалуйста в чем дело. А некоторые примеры кину на днях.
UTeX ида. гениально. может ты всё таки хотел сказать Olly? RegQueryValueEx тыкай и в олли как раз таки смотри что происходит при/после(в соответствии с твоим скиллом) вызова RQV().
Если я правильно понял вопрос, то вот: API-функции имеют право менять, согласно конвенциям вызова, регистры EAX, EDX и ECX. Все остальные (если не брать в расчёт сервисный, по сути, EIP) после их выполнения остаются прежними. Что же насчёт флагов - то тут всё зависит от последней флаго-зависимой команды, выполненной в данной функции. Теоретически (в общем случае), меняются все флаги, кроме DF. А сам DF, еснеошибаюсь, проставляется в 0.
UTeX, TOLSTOPUZ, Comer_ Ребята не надоело еще флудить? Человек ведь задал несколько точных и конкретных вопросов, а вы Гугл, да Гугл или еще хуже отладчик. Everhest API-функции могут изменить любые из регистров, кроме ebx,esi,edi,esp,ebp, а также они не меняют флаг направления в регистре флагов. Теже самые правила ты должен соблюдать при программировании CALLBACK-функций. Также при вызове этих самых API значение указателя на вершину стека должно быть выровнено на 4, иначе возможно непредсказуемое поведение вызываемой API. Дополню это тем, что при вызове Native-функций и при передаче им параметров в виде указателей (куда будет помещен результат или часть результата), эти параметры в виде адреса должны быть выровнены на 4, иначе функция может возвратить ошибку. Все возвращаемые значения смотрятся в справочике по API-функциям. Он идет в комплекте с Platform SDK. Также он является частью MSDN - это бооольшая справка по всему от Micro$oft. Дохнет потому как передаешь не правильные параметры. Скажи как конкретно дохнет или приведи код. Агнера Фога еще рано читать, да и не так жизненно необходимо как справочник по API.
Osen замени вторую букву в своём нике на более подходящую, прежде чем тыкать мой ник: я запостил вполне содержательный ответ. http://www.wasm.ru/forum/viewtopic.php?pid=243370#p243370 перечитай
Ну и где взять MSDN на русском? Я то английский знаю на 3 и мало что смогу понять. На счет примеров с использованием RegQuerlyValue, скину завтра. На сколько я помню получаймое значение -1 в регистре eax после вызова Апи свидетельствует о неудаче. Но с WriteFile разобрался, вина всему моя неправильная установка SEH. DEEP и Osen спасибо за ответы.
Вообще-то WriteFile возвращает значение типа BOOL, и после неё eax=0 - ошибка, а любое другое значение сигнализирует об успехе.
желательно, чтобы при вызове апи был сброшен DF. иначе могут быть проблемы (попробуй вызвать MessageBoxA с DF=1)
Great Конечно. DF всегда в 0, поэтому я и говорил, что он не должен менятся, а если он меняется в результате какого-либо алгоритма, то перед вызовом любой API его надо восстанавливать в первоначальное значение, т.к. в коде всех API нет выставления флага направления.
Ну и как можно по другому прочитать данные с ключа в формате REG_SZ с помощью RegQueryValue ? Код (Text): format PE GUI 4.0 entry start include '..\..\include\win32a.inc' ERROR_SUCCESS = 0 section '.data' data readable writeable message_create db 'Будет создан раздел "HKEY_CURRENT_USER\.DEFAULT\Test\STRING"',0 message_write db 'В раздел "HKEY_USERS\Test\STRING" будет вписана строка - "Hello World!"',0 message_error db 'При работе с реестром произошла ошибка, программа будет закрыта.',0 title_info db 'Информация',0 text_to_write db 'Hello World!',0 sub_key db '.DEFAULT\Test\',0 sub_text_key db 'STRING',0 buffer rb 260 hkey dd ? section '.code' code readable executable start: invoke MessageBox,0,message_create,title_info,MB_ICONINFORMATION .seh_init: push error pushd dword[fs:0] mov [fs:0], esp .create_key: invoke RegCreateKey, HKEY_USERS, sub_key, hkey cmp eax, ERROR_SUCCESS jne error .write_key: invoke MessageBox,0,message_write,title_info,MB_ICONINFORMATION invoke lstrlen,text_to_write invoke RegSetValueEx,[hkey],sub_text_key,0,REG_SZ,text_to_write,eax cmp eax,ERROR_SUCCESS jne error .read_key: ; invoke RegQueryValueEx,[hkey],sub_text_key, 0, REG_SZ, buffer, 260 invoke RegQueryValue,[hkey], sub_text_key, buffer, 260 cmp eax,ERROR_SUCCESS jne error invoke MessageBox,0,buffer,title_info,MB_ICONINFORMATION .close_key: invoke RegCloseKey,[hkey] mov esp,[fs:0] popd dword[fs:0] jmp close error: invoke MessageBox,0,message_error,0,MB_ICONERROR close: invoke ExitProcess,0 section '.idata' import data readable writeable macro import lib,[functions] { common macro import_#lib \{ import lib,functions \} } macro api [functions] { common macro all_api \{ all_api api functions \} } macro all_api {} include '..\..\include\api/kernel32.inc' include '..\..\include\api/user32.inc' include '..\..\include\api/gdi32.inc' include '..\..\include\api/advapi32.inc' include '..\..\include\api/comctl32.inc' include '..\..\include\api/comdlg32.inc' include '..\..\include\api/shell32.inc' include '..\..\include\api/wsock32.inc' purge import,api library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL',\ gdi32,'GDI32.DLL',\ advapi32,'ADVAPI32.DLL',\ comctl32,'COMCTL32.DLL',\ comdlg32,'COMDLG32.DLL',\ shell32,'SHELL32.DLL',\ wsock32,'WSOCK32.DLL' import_kernel32 import_user32 import_gdi32 import_advapi32 import_comctl32 import_comdlg32 import_shell32 import_wsock32 all_api
Everhest Неизменный лидер в рейтинге советов - MSDN. Пользуйтесь словарем, переводчиком, учебником английского, но НИКОГДА не вызывайте API до прочтения и полного понимания соответствующей статьи MSDN. А по сути последний параметр - указатель на размер буфера, а не сам размер.
Everhest Даже если MSDN будет полноценно переведён на русский, английский знать всё же абсолютно необходимо. На уровне умения понять технический текст на оном языке, коненчо -- свободно говорить вовсе не требуется. Кстати, выучить язык именно на таком уровне меня заставила как раз нужда читать англоязычную документацию. Кроме того, помимо MSDN, часто бывают нужны другие документы. Например, вознамерился написать игрушку, значит, нужно читать про DirectX. В имеющихся книжках на русском даны лишь его основы, очень многое там опущено, но имеется либо в SDK, либо со всяких статьях и форумах -- очень часто англоязычных. Так что по-любому надо учить
Дружище, вот: www.citforum.ru www.intuit.ru www.rsdn.ru Там много полезного, покапайся. Из книг найди Пирогова, неплохо пишет.