Files
Work/proto/junk/dllmain.cpp
2024-08-07 09:24:33 -04:00

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;
}