Цель: запретить ставить на рабочий стол картинки. (одной политики безопасности домена мало-уж очень ушлые пользователи) Есть задача: подменить оконную процедуру SysListVew32, который Desktop, и самим обрабатывать WM_PAINT. Все вроде ок, но при первом появлении рабрчего стола, Explorer.exe падает! Подмена происходит в DLL, которую я подгружаю к Explorer'у: Код (Text): //Вызывается так: Infect("Shell_TrayWnd"); #define DLL "C:\\windows\\system32\\sockhelp.dll" void Infect(char *c){ w = FindWindow(c,0); if(w){ GetWindowThreadProcessId(w,&pid); p = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); if(p){ data = VirtualAllocEx(p,0,lstrlen(DLL)+1,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE); WriteProcessMemory(p,data,DLL,lstrlen(DLL)+1,&tid); CreateRemoteThread(p,0,0,(LPTHREAD_START_ROUTINE)LoadLibrary,data,0,&tid); } CloseHandle(p); } } Вот код подмены: Код (Text): HWND wnd = FindWindowEx(0,0,"Progman",0); wnd = FindWindowEx(wnd,0,"SHELLDLL_DefView",0); wnd = FindWindowEx(wnd,0,"SysListView32","FolderView"); if(wnd){ old = SetWindowLong(wnd,GWL_WNDPROC,(LONG)&New_Desktop); MessageBox(0,"Change WNDPROC Ok! *)","",0); } Вот код новой оконной процедуры: Код (Text): BOOL CALLBACK New_Desktop(HWND w,UINT m,WPARAM wp,LPARAM lp){ switch(m){ case WM_LBUTTONDOWN: MessageBox(0,"HellO!","",0); return TRUE; }; __asm{ push lp push wp push m push w mov eax,old call eax } } Чего не так??
Есть контакт: Вместо Код (Text): __asm{ push lp push wp push m push w mov eax,old call eax } Надо: Код (Text): CallWindowProc((WNDPROC)old,w,m,wp,lp);