229 lines
4.9 KiB
C++
229 lines
4.9 KiB
C++
#include <common/string.hpp>
|
|
#include <common/stdio.hpp>
|
|
#include <common/file.hpp>
|
|
#include <common/console.hpp>
|
|
#include <thread/mutex.hpp>
|
|
#include <sgi_stl/map.h>
|
|
|
|
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;
|
|
}
|