Помогите с работой с файлами

Тема в разделе "WASM.BEGINNERS", создана пользователем ukrlanser_2009, 30 май 2009.

  1. ukrlanser_2009

    ukrlanser_2009 New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    2
    Всем привет! Пишу программу для работы с файлами. Поскольку я только учусь, не могу найти ошибку. CreateFileA прыгает на какой-то адрес. Догадываюсь, что проблема в lparam, но исправить не могу. Подскажите, где у меня ошибка:


    include '../include/win32ax.inc'
    .data
    lparam db "test.txt",0
    text db "Hello",0


    .code

    start:
    pusha
    push FILE_ATTRIBUTE_NORMAL
    push OPEN_EXISTING
    push 0
    push FILE_SHARE_READ + FILE_SHARE_WRITE
    push GENERIC_READ + GENERIC_WRITE
    push lparam
    call CreateFileA


    xor ebx,ebx
    invoke WriteFile,eax,text,5,0,0
    pop eax
    invoke CloseHandle,eax
    invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!","Win32 Assembly",MB_OK
    invoke ExitProcess,0

    .end start


    Заранее спасибо.
     
  2. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    include '../include/win32ax.inc'
    .data
    lparam db "test.txt",0
    text db "Hello",0
    nRealWrite dd 0

    .code

    start:
    push 0
    push FILE_ATTRIBUTE_NORMAL
    push OPEN_EXISTING
    push 0
    push FILE_SHARE_READ + FILE_SHARE_WRITE
    push GENERIC_READ + GENERIC_WRITE
    push offset lparam
    call CreateFileA
    cmp eax,INVALID_HANDLE_VALUE
    je @F
    push eax
    invoke WriteFile,eax,addr text,5,addr nRealWrite,0
    call CloseHandle
    invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!","Win32 Assembly",MB_OK
    @@:
    invoke ExitProcess,0
    .end start

    Сложилось впечатление что писал в IDE, а она ругалась на CreateFile :) пэтому решил call написать.
    Читай описание функций внимательней.
     
  3. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Что значит
    Код (Text):
    1.     pusha
    ?

    Надо
    push 0
     
  4. ukrlanser_2009

    ukrlanser_2009 New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    2
    Спасибо за помощь, но я пишу на фасме, который директивы offset не поддерживает. Писалась прога на ide, согласен. Но теперь жалуется на offset и наотрез отказывается компилить. Что делать?
     
  5. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    ukrlanser_2009
    FASM не знаю :dntknw:
    Попробуй offset убрать. На addr не ругается?
    И зачем начинать с такого гемора как FASM?
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну оффсет убери - у тебя и без него вроде правильно все для фасма написано. А вот первую инструкцию оставь все-таки push 0, а не pusha. Подозреваю, что, посылая в стек все регистры через pusha, ты запихнул туда какое-то левое число, по которому CreateFileA пыталась что-то записать. А когда не получилось записать, в ольке у тебя вывалился эксепшн. Так что замени сначала первую инструкцию, а там посмотрим.
     
  7. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    MSoft
    Ага, особенно "правильно" используется CloseHandle
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а что не так? хендл передается перед WriteFile - все правильно
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. call    [CreateFileA]
    это фасм!
     
  10. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    MSoft
    Я собственно об этом. Какой файл закроет CloseHandle?
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    MirrorBlack
    бггг, точно :) я твой код смотрю, а говорю, что все в порядке :)))
    вобщем, сидеть ТС в ольке еще долго и долго :)
     
  12. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    кстати, эта тема в очередной раз доказывает, что фасм - это зло :)
     
  13. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    MirrorBlack
    Хм, что-то я не вижу импорта... может проблема в нём?
    и
    Вот этого на надо писать в фасме...
    Вот из-за такой фигни фасм может визжать и нервно дёргать окончаниями :)
    Фасм известный приколист... если, например, портировать из масма и не переделать определение proc-a, то фасм всё скомпилирует, пока вы не захотите вызвать эту функцию через инвок. Но сути проблемы вам при этом не расскажет, а будет писать что-то невнятное и догадаться в чём проблема будет невозможно (догадаться можно только через инсайт и глубокую медитацию)....

    Совет: если фасм впадает в истерику, а вы не можете понять причину, то просто закомментируйте причину нервных воплей. И вот так, комментируя всё подряд, под конец вы возможно дойдёте до истины, 50 на 50 :dntknw:.
    Только если вышеперечисленное является злым умыслом. Остаётся лишь надеяться, что когда-нибудь его наделят надлежащим интеллектом. А то тупое развёртывание макроса при ошибке заставляет меня просто выпасть в осадок :).
    Чуть не забыл, offset в фасме писать не надо. А вот addr надо только тогда, когда вы адресуите локальную переменную, тогда фасм разворачивает её в lea. В общем всё просто:
    Если надо запушить значение переменной, то тогда используются квадратные скобки ([variable]).
    Если это "lp", то ничего не надо писать, если это не локальная переменная.
     
  14. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    да что ж вы все так смещений боитесь :) это походу единственный плюс в сторону фасма :)))
    ладно, дальше на реплику отвечать не буду, а то начнется холивар :)
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Код (Text):
    1. macro .end label
    2. {
    3.    entry label
    4.  
    5.    section '.idata' import data readable writeable
    6.  
    7.      library kernel32,'KERNEL32.DLL',\
    8.          user32,'USER32.DLL',\
    9.          gdi32,'GDI32.DLL',\
    10.          advapi32,'ADVAPI32.DLL',\
    11.          comctl32,'COMCTL32.DLL',\
    12.          comdlg32,'COMDLG32.DLL',\
    13.          shell32,'SHELL32.DLL',\
    14.          wsock32,'WSOCK32.DLL'
    15.  
    16.      import_kernel32
    17.      import_user32
    18.      import_gdi32
    19.      import_advapi32
    20.      import_comctl32
    21.      import_comdlg32
    22.      import_shell32
    23.      import_wsock32
    24.  
    25.      all_api
    26. }
    На fasm не гнать, просто раз уж решили использовать макросы, идущие в комплекте с fasm'ом, нужно детально в них разобраться, ну и писать внимательно, а не абы как.
     
  16. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Сколько пишу на фасме, а этого не знал. Я импорт специальной тулзой составляю (scan, по-моему), его потом только ручками подрихтовать и всё нормально. Жаль, что тулза без сырцов идёт, а то "кернел32" на "кернел" менять каждый раз немного надоедает.

    Каждый раз нажимать на капслок и набирать OFFSET меня немного напрягает. У меня вместо DWORD,WORD,BYTE просто D,W,B... пересилил себя и накатал макрос, намного удобнее стало и быстрее писать :))). Не говоря уже о компактности, а в случае асма - это критично потому, что существует предел строк, которые в состоянии удерживать программист в уме.

    Далеко не единственный, мне он нравиться потому, что у него идеология такая: "Закат солнца вручную...". Люблю всё контролировать, а теже Кресты мне не дают поизвращаться как следует. Я писал как-то в них с использованием гди плюс, так код получился такой, что мне самому стало противно. Столько лишних телодвижений, что жутко просто, а по другому просто никак.... Ну-у-у-у, почти никак, можно было использовать гди плюс флат апи, но смысл тогда писать на крестах?
     
  17. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    :))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

    я конечно дико-предико извиняюсь, но какое отношение твой капслок имеет к масму? :)
    ну вообще я имел ввиду плюс фасма по сравнению с масмом, а не с си. Но не важно, холивар разводить не стану.