проблемка с WH_JOURNALRECORD

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

  1. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Доброго времени суток.
    В своем коде пытаюсь установить хук WH_JOURNALRECORD чтобы отлавливать и в последующем обрабатывать нажатия некоторых клавиш.
    делаю так:
    Код (Text):
    1.                 .....
    2.  
    3.         .data
    4.  
    5.         dwHookHandle    dd 0
    6.  
    7.                 .code
    8.  
    9. h00k_install    proc
    10.         cmp dwHookHandle, 0
    11.         jz  @F
    12.         ret
    13. @@:    
    14.         push    0
    15.         call    GetModuleHandleA
    16.         test    eax, eax
    17.         jnz @F
    18.         ret
    19. @@:
    20.         push    0
    21.         push    eax
    22.         push    offset h00k_proc
    23.         push    WH_JOURNALRECORD
    24.         call    SetWindowsHookEx
    25.         mov dwHookHandle, eax
    26.         ret
    27. h00k_install    endp
    28.  
    29. ;//////////////////////////////////////////////////////////////////////////
    30.  
    31. h00k_proc   proc nCode : DWORD, WParam : WORD, LParam : DWORD
    32.         LOCAL   E_MSG : EVENTMSG
    33.  
    34.         cmp nCode, 0        ; HC_ACTION
    35.         jnz _next_h00k
    36.         cmp WParam, 0
    37.         jz  _next_h00k
    38.  
    39.         push    LParam
    40.         pop E_MSG
    41.  
    42.         mov ebx, dword ptr [E_MSG]
    43.  
    44. _key_process:
    45.  
    46.         cmp ebx, WM_KEYDOWN
    47.         jnz _next_h00k
    48.        
    49. ; WORK WITH KEYBOARD
    50.         invoke  MessageBoxA,0,0,0,0
    51.        
    52. _next_h00k:
    53.         push    LParam
    54.         push    WParam
    55.         push    nCode
    56.         push    dwHookHandle
    57.         call    CallNextHookEx
    58.         ret
    59. h00k_proc   endp
    60.  
    61. ;//////////////////////////////////////////////////////////////////////////
    62.  
    63. start:         
    64.  
    65.         call    h00k_install
    66.        
    67. @@:
    68.         push    1
    69.         call    Sleep
    70.         jmp @B
    71.  
    72.                 ....
    прога зависает при вызове SetWindowsHookEx...
    как решить данную проблему? может кто сталкивался?

    благодарю за внимание.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    GeNeZiS
    Код (Text):
    1. push    LParam
    2. pop E_MSG
    В LParam - указатель на EVENTMSG, E_MSG - это структура EVENTMSG.
    Как ты себе представляешь pop структуры?
    Какого эффекта ты ожидаешь от pop'а?
     
  3. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    хм. точно)) недоглядел. мне нужно получить из EVENTMSG значение поля message.
    т.е. получаю так
    Код (Text):
    1. ...
    2. mov     ebx, dword ptr LParam
    3. ...
    эффект тот же. прога висит. что я еще делаю не правильно?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    GeNeZiS
    > прога висит
    Как ты это определяешь?

    > что я еще делаю не правильно?
    Например:
    1) не сохраняешь значение регистра EBX;
    2) зачем cmp nCode, 0 и cmp WParam, 0 перед анализом значения EVENTMSG.message, согласно документации (msdn: JournalPlaybackProc Function) "lParam ... This parameter is valid only when the code parameter is HC_GETNEXT", а HC_GETNEXT определен как единица;
    3) не критично, однако WPARAM под win32 - это DWORD.

    > нужно получить из EVENTMSG значение поля message
    Синтаксис masm
    Код (Text):
    1.     mov     eax, LParam
    2. ;; теперь в EAX указатель на EVENTMSG, общаться с полем message, например, можно так:
    3.     cmp (EVENTMSG ptr [eax]).message, WM_KEYDOWN
    4. ;; или
    5.     cmp dword ptr [eax], WM_KEYDOWN
    6. ;; или
    7.     cmp [eax.EVENTMSG].message, WM_KEYDOWN
    8. ;; или
    9.     assume  eax : ptr EVENTMSG
    10.     cmp [eax].message, WM_KEYDOWN
     
  5. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    сделал таким образом:
    Код (Text):
    1. h00k_proc   proc nCode : DWORD, WParam : WORD, LParam : DWORD
    2.         cmp nCode, 1        ; HC_GETNEXT
    3.         jnz _next_h00k
    4.  
    5.         mov ebx, LParam
    6.         push    ebx
    7.  
    8. _key_process:
    9.         pop ebx
    10.         cmp dword ptr [ebx], WM_KEYDOWN
    11.         jnz _next_h00k
    12.    
    13. ;       WORK WITH KEYBOARD
    14.         invoke  MessageBoxA,0,0,0,0
    15.        
    16. _next_h00k:
    17.         push    LParam
    18.         push    WParam
    19.         push    nCode
    20.         push    dwHookHandle
    21.         call    CallNextHookEx
    22.         ret
    23. h00k_proc   endp
    к сожалению по прежнему ничего не работает. до нажатия CTRL+ALT+DEL система не отвечает на события мыши и клавиатуры...
    в чем еще может быть ошибка?
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    GeNeZiS
    > в чем еще может быть ошибка?
    См. #4.
    Ты не учел п.1.
    Я был не прав – п.3 критичен.
    Посмотри на код, генерируемый для push WParam, в стек кладется слово, что нарушает, нормальное для win32, выравнивание стека по 4-ех байтной границе.