#include #include #include #include #include #include extern "C" { __declspec(dllexport) bool FAR PASCAL unHook(void); __declspec(dllexport) bool FAR PASCAL setHook(void); } bool validate(CREATESTRUCT &createStruct); LRESULT CALLBACK cbtHookProc(int nCode,WPARAM wParam,LPARAM lParam); LRESULT handleActive(WPARAM wParam,LPARAM lParam); LRESULT handleClickSkipped(WPARAM wParam,LPARAM lParam); LRESULT handleCreateWnd(WPARAM wParam,LPARAM lParam); LRESULT handleDestroyWnd(WPARAM wParam,LPARAM lParam); LRESULT handleKeySkipped(WPARAM wParam,LPARAM lParam); LRESULT handleMinMax(WPARAM wParam,LPARAM lParam); LRESULT handleMoveSize(WPARAM wParam,LPARAM lParam); LRESULT handleQs(WPARAM wParam,LPARAM lParam); LRESULT handleSetFocus(WPARAM wParam,LPARAM lParam); LRESULT handleSysCommand(WPARAM wParam,LPARAM lParam); HHOOK smhHook=(HHOOK)0; Mutex mutex; File outFile("d:\\log.txt","a+b"); BOOL WINAPI DLLMain(HINSTANCE hDLLInst,DWORD dwReason,LPVOID lpReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH : ::printf("Process attach\n"); break; case DLL_PROCESS_DETACH : ::printf("Process detach\n"); break; case DLL_THREAD_ATTACH : ::printf("Thread attach\n"); break; case DLL_THREAD_DETACH : ::printf("Thread detach\n"); break; default : break; } return TRUE; } bool FAR PASCAL setHook(void) { HINSTANCE hInst=::GetModuleHandle("cbtdll"); if(!hInst)return false; smhHook=::SetWindowsHookEx(WH_CBT,(HOOKPROC)&cbtHookProc,hInst,0); return smhHook?true:false; } bool FAR PASCAL unHook() { if(!smhHook)return false; ::UnhookWindowsHookEx(smhHook); smhHook=0; return true; } LRESULT CALLBACK cbtHookProc(int nCode,WPARAM wParam,LPARAM lParam) { LRESULT result; if(nCode<0)return result=::CallNextHookEx(smhHook,nCode,wParam,lParam); switch(nCode) { case HCBT_ACTIVATE : result=handleActive(wParam,lParam); break; case HCBT_CLICKSKIPPED : result=handleClickSkipped(wParam,lParam); break; case HCBT_CREATEWND : result=handleCreateWnd(wParam,lParam); break; case HCBT_DESTROYWND : result=handleDestroyWnd(wParam,lParam); break; case HCBT_KEYSKIPPED : result=handleKeySkipped(wParam,lParam); break; case HCBT_MINMAX : result=handleMinMax(wParam,lParam); break; case HCBT_MOVESIZE : result=handleMoveSize(wParam,lParam); break; case HCBT_QS : result=handleQs(wParam,lParam); break; case HCBT_SETFOCUS : result=handleSetFocus(wParam,lParam); break; case HCBT_SYSCOMMAND : result=handleSysCommand(wParam,lParam); break; } return result; } // ************************************************************************************************ LRESULT handleActive(WPARAM wParam,LPARAM lParam) { return 0; } LRESULT handleClickSkipped(WPARAM wParam,LPARAM lParam) { return 0; } LRESULT handleCreateWnd(WPARAM wParam,LPARAM lParam) { CBT_CREATEWND *pCBTCreateWnd; CREATESTRUCT *pCreateStruct; HWND hWnd; HWND hwndParent; String windowName; String parentText; String strLine; hWnd=(HWND)wParam; pCBTCreateWnd=(CBT_CREATEWND*)lParam; if(!pCBTCreateWnd) { return 0; } pCreateStruct=pCBTCreateWnd->lpcs; if(!pCreateStruct) { return 0; } hwndParent=pCreateStruct->hwndParent; windowName=pCreateStruct->lpszName; parentText.reserve(String::MaxString); ::GetWindowText(hwndParent,parentText,String::MaxString); strLine.reserve(1024); ::sprintf(strLine.str(),"window name=%s, parent=%s",windowName.str(),parentText.str()); mutex.requestMutex(); outFile.writeLine(strLine); outFile.flush(); mutex.releaseMutex(); if(!validate(*pCreateStruct)) { outFile.writeLine("Not allowing child window to activate"); outFile.flush(); return 1; } return 0; } LRESULT handleDestroyWnd(WPARAM wParam,LPARAM lParam) { return 0; } LRESULT handleKeySkipped(WPARAM wParam,LPARAM lParam) { return 0; } LRESULT handleMinMax(WPARAM wParam,LPARAM lParam) { return 0; } LRESULT handleMoveSize(WPARAM wParam,LPARAM lParam) { return 0; } LRESULT handleQs(WPARAM wParam,LPARAM lParam) { return 0; } LRESULT handleSetFocus(WPARAM wParam,LPARAM lParam) { return 0; } LRESULT handleSysCommand(WPARAM wParam,LPARAM lParam) { return 0; } STDAPI DllCanUnloadNow(void) { ::printf("DllCanUnloadNow\n"); return S_OK; // S_FALSE } STDAPI DllUnregisterServer(void) { ::printf("DllUnregisterServer\n"); return S_OK; } bool validate(CREATESTRUCT &createStruct) { String parentText; String moduleFileName; moduleFileName.reserve(512); ::GetModuleFileName(createStruct.hInstance,moduleFileName.str(),512); outFile.writeLine(moduleFileName); parentText.reserve(String::MaxString); ::GetWindowText(createStruct.hwndParent,parentText,String::MaxString); // if(parentText==String("Internet Explorer"))return false; // if(parentText==String("Microsoft Internet Explorer"))return false; return true; }