Сабкласинг

Тема в разделе "WASM.WIN32", создана пользователем __Ranger, 23 сен 2004.

  1. __Ranger

    __Ranger New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2003
    Сообщения:
    23
    Адрес:
    Russia
    Есть код, который заменяет процедуру кнопки "Пуск" на мою собственную. Так вот, он прекрасно работает в Win2k, WinXP, но под Win98 никак. Что он делает:

    1)Вешается хук WH_CALLWNDPROCRET

    2)В этом хуке идет проверка, сработал ли хук на кнопке "Пуск"

    3)Через SetWindowLong меняется процедура. Но под Win98 мне SetWindowLong возвращает 0 и говорит, что неверный параметр. В чем грабли и почему под XP и 2k всё работает?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    __Ranger

    Код покажешь или будем ждать телепатов?
     
  3. __Ranger

    __Ranger New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2003
    Сообщения:
    23
    Адрес:
    Russia
    Код (Text):
    1.  
    2. set_startmenu proc uses ebx
    3.     xor eax,eax
    4.     invoke FindWindowEx,eax,eax,offset tray_name,eax
    5.     invoke GetDlgItem,eax,304
    6.     test eax,eax
    7.     jz no_menu
    8.     mov ebx,eax
    9.     invoke SetWindowsHookEx,WH_CALLWNDPROCRET,offset shell_proc,hInstance,0
    10.     mov btn_hook,eax
    11.     invoke SendMessage,ebx,WM_NULL,0,0
    12.     invoke Sleep,50;чтоб наверняка
    13.     invoke SendMessage,ebx,WM_NULL,0,0
    14.     invoke UnhookWindowsHookEx,btn_hook
    15.     and btn_hook,0
    16. no_menu:
    17.     ret
    18. set_startmenu endp
    19.  
    20. shell_proc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    21.     mov eax,nCode
    22.     .if eax<0
    23.         invoke CallNextHookEx,btn_hook,nCode,wParam,lParam
    24.         ret
    25.     .else
    26.         mov edx,lParam
    27.         assume edx:ptr CWPRETSTRUCT
    28.         mov eax,[edx].message
    29.         mov eсx,[edx].hwnd
    30.         .if ((start_dll==0)&&(eax==WM_NULL))
    31.             invoke set_startmenu_proc,eсx
    32.         .endif
    33.                 assume edx:NOTHING
    34.         .endif
    35.  
    36.     xor eax,eax
    37. fin:
    38.  
    39.     ret
    40. shell_proc endp
    41.  
    42. set_startmenu_proc proc uses edi hWin:DWORD
    43.     mov edi,hWin
    44.     mov start_btn,edi
    45.     invoke GetWindowRect,edi,addr startmenu_x
    46.     invoke GetClassLong,edi,GCL_WNDPROC
    47.     mov default_proc,eax
    48.     invoke SetWindowLong,edi,GWL_WNDPROC,offset start_btn_proc
    49. ;вот здесь 0 приходит под 98
    50.         mov old_start,eax
    51.     m2m start_dll,hInstance
    52.     ret
    53. set_startmenu_proc endp
    54.  
    55.  
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    __Ranger

    В рамках какого процесса выполняется этот код?

    Imho наивно надеяться, что в системе не ходят сообщения WM_NULL, т.е. где в shell_proc проверка, что (CWPRETSTRUCT ptr [edx]).hwnd равен дескриптору окна кнопки "Пуск"?

    Почему так сложно, разве не достаточно, получив дескриптор окна кнопки "Пуск" применить к нему SetWindowLong (разумеется, сначала надо попасть в адресное пространство ее процесса)?
     
  5. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    У меня написана програмка, которая ловит все сообщ. через хук и записывает мышиные и клавишные (не через journal). Так вот все работает но на копке Пуск и меню этом- нет! (Win98). В чем дело, не знаю.
     
  6. __Ranger

    __Ranger New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2003
    Сообщения:
    23
    Адрес:
    Russia
    WM_NULL не ходит, но в любом случае, поменять на какое-то своё сообщение ничего не стоит, проблема в другом. А хук именно для того, чтобы попасть в адресное пространство ее процесса, иначе, естественно, никто ничего мне менять не даст. Set_startmenu выполняется в моём процессе.