проблемы с рисованием в чужом окне (перехват оконной процедуры)

Тема в разделе "WASM.WIN32", создана пользователем DrSex, 21 дек 2006.

  1. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Цель: запретить ставить на рабочий стол картинки. (одной политики безопасности домена мало-уж очень ушлые пользователи)
    Есть задача: подменить оконную процедуру SysListVew32, который Desktop, и самим обрабатывать WM_PAINT.
    Все вроде ок, но при первом появлении рабрчего стола, Explorer.exe падает!

    Подмена происходит в DLL, которую я подгружаю к Explorer'у:
    Код (Text):
    1. //Вызывается так: Infect("Shell_TrayWnd");
    2. #define DLL "C:\\windows\\system32\\sockhelp.dll"
    3. void Infect(char *c){
    4.     w = FindWindow(c,0);
    5.     if(w){
    6.         GetWindowThreadProcessId(w,&pid);
    7.         p = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
    8.         if(p){
    9.             data = VirtualAllocEx(p,0,lstrlen(DLL)+1,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
    10.             WriteProcessMemory(p,data,DLL,lstrlen(DLL)+1,&tid);
    11.             CreateRemoteThread(p,0,0,(LPTHREAD_START_ROUTINE)LoadLibrary,data,0,&tid);
    12.         }
    13.         CloseHandle(p);
    14.     }
    15. }
    Вот код подмены:
    Код (Text):
    1. HWND wnd = FindWindowEx(0,0,"Progman",0);
    2. wnd = FindWindowEx(wnd,0,"SHELLDLL_DefView",0);
    3. wnd = FindWindowEx(wnd,0,"SysListView32","FolderView");
    4. if(wnd){
    5.     old = SetWindowLong(wnd,GWL_WNDPROC,(LONG)&New_Desktop);
    6.     MessageBox(0,"Change WNDPROC Ok! *)","",0);
    7. }
    Вот код новой оконной процедуры:
    Код (Text):
    1. BOOL CALLBACK New_Desktop(HWND w,UINT m,WPARAM wp,LPARAM lp){
    2.     switch(m){
    3.     case WM_LBUTTONDOWN:
    4.             MessageBox(0,"HellO!","",0);
    5.             return TRUE;
    6.     };
    7.     __asm{
    8.         push    lp
    9.         push    wp
    10.         push    m
    11.         push    w
    12.         mov eax,old
    13.         call    eax
    14.     }
    15. }
    Чего не так?? :dntknw:
     
  2. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Есть контакт:
    Вместо
    Код (Text):
    1. __asm{
    2.         push    lp
    3.         push    wp
    4.         push    m
    5.         push    w
    6.         mov eax,old
    7.         call    eax
    8.     }
    Надо:
    Код (Text):
    1. CallWindowProc((WNDPROC)old,w,m,wp,lp);