FASM_DLL_HELPME

Тема в разделе "WASM.WIN32", создана пользователем babek, 14 мар 2007.

  1. babek

    babek New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2007
    Сообщения:
    8
    Все наверное видели туториалы Iczelion'а, решил попробовать переписать DLL из туториала 24 MouseHook под FASM, код привожу ниже. Откомпилировал DLLка получилась на полкило больше, но главное что она рабтает только в окне приложения из которого запущена, для запуска использовал экзешник Iczelion'а. Кто видит ошибку помогите плз

    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include 'C:\FASM\INCLUDE\win32a.inc'
    5.  
    6. WM_MOUSEHOOK  = WM_USER + 6
    7.  
    8. section '.code' code readable executable
    9.  
    10. proc DllEntryPoint hInst,reason,reserved1
    11.     push    [hInst]
    12.     pop [hInstance]
    13.     mov eax,TRUE
    14.     ret
    15. endp
    16.  
    17. proc MouseProc,nCode,wparam,lparam
    18.  
    19.     invoke  CallNextHookEx,[hHook],[nCode],[wparam],[lparam]
    20.     mov edx,[lparam]
    21.     invoke  WindowFromPoint,[edx],[edx+4]
    22.     invoke  PostMessage,[hWnd],WM_MOUSEHOOK,eax,0
    23.     xor eax,eax
    24.     ret
    25. endp
    26.  
    27. proc InstallHook,hwnd
    28.     push    [hwnd]
    29.     pop [hWnd]
    30.     invoke  SetWindowsHookEx,WH_MOUSE,MouseProc,[hInstance],NULL
    31.     mov [hHook],eax
    32.     ret
    33. endp
    34.  
    35. proc UninstallHook
    36.     invoke UnhookWindowsHookEx,[hHook]
    37.     ret
    38. endp
    39.  
    40. section '.data' data readable writeable
    41.  
    42. hInstance dd 0
    43. hHook     dd ?
    44. hWnd      dd ?
    45.  
    46. section '.idata' import data readable writeable
    47.  
    48.   library user,'USER32.DLL'
    49.  
    50.   import user,\
    51.      SetWindowsHookEx,'SetWindowsHookExA',\
    52.      UnhookWindowsHookEx,'UnhookWindowsHookEx',\
    53.      CallNextHookEx,'CallNextHookEx',\
    54.      WindowFromPoint,'WindowFromPoint',\
    55.      PostMessage,'PostMessageA'
    56.  
    57. section '.edata' export data readable
    58.  
    59.   export 'MHOOK.DLL',\
    60.      InstallHook,'InstallHook',\
    61.      UninstallHook,'UninstallHook',\
    62.      MouseProc,'MouseProc'
    63.  
    64. section '.reloc' fixups data discardable
     
  2. axe_roma

    axe_roma New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2004
    Сообщения:
    93
    Адрес:
    Russia
    Че то не понял а ты как хочешь что бы она работала?
     
  3. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    babek
    Все верно. Это происходит из-за того что при заверщении процесса все его открытые описатели закрываются. В данном случае уничтожается установленный хук. Допустим, что мы загрузили DLL и выходим из программы. Счетчик
    для нашей DLL поставится на ноль и она уничтожиться из адресного пространства процессов. Чтобы этого не
    случилось для каждого процесса мы загружаем отдельно DLL. Но на самом деле она не загружается, а просто
    счетчик увеличивается на единицу с каждым новым процессом. Проще говоря, на инициализации хука, ставь еще один LoadLibraryA.

    Читай. размер архива - 5кб
    http://webfile.ru/1345589
    Там в архиве статья по хукам. Как раз объясняется, как решить твою проблему. Исходники там же.
     
  4. babek

    babek New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2007
    Сообщения:
    8
    Большое спасибо nitrotoluol за информативную статью!
    Но мне кажится дело не в этом потому что я гружу либу как (load-time dynamic linking), а самое главное что прототип на masm32 работает.... a моя dll несовсем
     
  5. babek

    babek New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2007
    Сообщения:
    8
    Секции .bss должна быть помечена как pазделяемая, чтобы все пpоцессы pазделяли секцию неинициализиpуемых данных хук-DLL.
    Без этой опции, DLL функциониpует непpавильно.
    в masm32 это так: Link /SECTION:.bss,S /DLL /DEF:$(NAME).def /SUBSYSTEM:WINDOWS
    а как в FASM прописать секцию?
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    section '.bss' data readable writeable shareable
     
  7. babek

    babek New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2007
    Сообщения:
    8
    Большое Thanks IceStudent ты спас мой мозг
    section '.bss' readable writeable shareable
    hInstance dd 0
    hHook dd ?
    hWnd dd ?
    и всё ОК