Досадная ошибка с LoadLibrary ... помогите!

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 25 янв 2007.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Добрый день.
    Подскажите в чем ошибка
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include 'c:\fasmw\include\win32a.inc'
    4. section '.code' code readable writeable executable
    5.     dllname     db 'ws2_32.DLL',0
    6.     ;dllname        db 'c:\WINNT\system32\ws2_32.dll', 0
    7. start:
    8.  
    9.     push    dllname
    10.     call    [LoadLibrary]
    11. ; - GetLastError постоянно = ERROR_INVALID_HANDLE (00000006)
    12. int 3
    13.     ret
    14.  
    15. section '.idata' import data readable writeable
    16. library kernel32, 'kernel32.dll',\
    17.     user32, 'user32.dll';,\
    18. include 'C:\fasmw\INCLUDE\APIA\kernel32.inc'
    19. include 'C:\fasmw\INCLUDE\APIA\USER32.INC'
    Что делать?
     
  2. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    lea eax,dllname
    push eax
    call LoadLibrary
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    ?
    Код (Text):
    1.         lea     eax, dllname
    2. error: invalid operand.
     
  4. cpp_and_wasm

    cpp_and_wasm Владимир

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    128
    _sheva740
    int 3 - привелегированная инструкция.
     
  5. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'E:\FASM\Include\win32a.inc'
    4.  
    5.         invoke  LoadLibrary,libname
    6.         ; Тут ставим бряк и смотрим - в EAX адрес загруженной либы
    7.         invoke  ExitProcess,0
    8.  
    9.         libname    db    'D:\WINNT\system32\appmgr.dll',0
    10.  
    11. data import
    12.  
    13.  library kernel32,'KERNEL32.DLL'
    14.  
    15.  import kernel32,\
    16.         ExitProcess,'ExitProcess',\
    17.         LoadLibrary,'LoadLibraryA'
    18.  
    19. end data
    Да, и как уже сказал cpp_and_wasm, int 3 привилегированная инструкция, ее нужно убрать из программы, если она не отлаживается...
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Спасибо за помощь
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    seeQ
    У него фасм, если ты не заметил.

    _sheva740
    Твой код рабочий, если смотреть под отладчиком.
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    действительно так и есть
    - программа отрабатывает
    - выдается ошибка ERROR_INVALID_HANDLE (00000006)
    - И после всего этого в eax мы наблюдаем
    правильный адрес загрузки ws2_32.DLL = 74FC0000

    Парадокс! Вывод - не верить GetLastError() ?
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну почему же, с точки зрения системы 74FC0000 действительно какой-то левый хендл, другое дело, что LoadLibrary возврашает не хендл а HMODULE.
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    GetLastError() проверяется только если API возвращает ошибку. В твоём случае назад приходит нормальный HANDLE. Если API работает - не надо обращать внимания на GetLastError().
     
  11. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Еще раз повторю слова n0name - LoadLibrary возвращает не хэндл, а HMODULE, т.е. тот адрес, куда была загружена DLL. Но вот только не знаю, приведенный мной код отрабатывает нормально, и GetLastError говорит ERROR_SUCSESS...
     
  12. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Цитата из MSDN:

    "If the function succeeds, the return value is a handle to the module.
    If the function fails, the return value is NULL. To get extended error information, call GetLastError."


    Разницы нет: HANDLE это или HMODULE. Если получен назад не NULL, значит не надо смотреть на GetLastError().
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    AsmGuru62
    Разница есть при STRICT, да и HMODULE не вставишь в CloseHandle. Да и по реализации: хэндл - это всего лишь дескриптор, а HMODULE всё же по сути адрес модуля.
     
  14. trash_master

    trash_master New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2006
    Сообщения:
    319
    Адрес:
    Україна
    не верь этим еретикам :)
     
  15. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Одно точно скажу - если функция failed, то return value действительно ноль... ;)