#include #include "debug.h" #include "dllmain.h" #include "klog.h" HANDLE g_instance; HMODULE g_hLib; #ifdef LOCKED_DLL_CFG void *g_cfg; #endif void *get_persistent_data(const WCHAR *name, DWORD size, bool bCreate) { #ifndef LOCKED_DLL_CFG void *ptr=NULL; HWND hWnd= FindWindow(L"static", name); if (hWnd==NULL) { klogmsg(L"cfg window static/'%ls' not found\n", name); if (!bCreate) { klogmsg(L"get_persistent_data: not creating\n"); return NULL; } hWnd= CreateWindow(L"static", name, WS_DISABLED, -1, -1, 0, 0, 0, 0, 0, 0); ptr= LocalAlloc(LPTR, size); SetWindowLong(hWnd, GWL_USERDATA, (LONG)ptr); klogmsg(L"get_persistent_data: created wnd=%08lx ptr=%08lx\n", hWnd, ptr); } else { ptr= (void*)GetWindowLong(hWnd, GWL_USERDATA); klogmsg(L"get_persistent_data: existing wnd=%08lx ptr=%08lx\n", hWnd, ptr); } return ptr; #else if (g_cfg==NULL) { KeepItsutils(); g_cfg= LocalAlloc(LPTR, size); } return g_cfg; #endif } void load_config() { klogmsg(L"load_config\n"); GetVersionParams *cfg= (GetVersionParams *)get_persistent_data(L"itsutils_config_ptr", MAX_PATH+sizeof(DWORD), false); if (cfg==NULL) { klogmsg(L"no config found: logging disabled\n"); } else switch(cfg->logtype) { case LOG_NONE : klogmsg(L"logtype=LOG_NONE\n"); DebugSetLogfile(NULL); #ifdef _DEBUG_SOCKET DebugSetSocket(NULL); #endif DebugRegisterWindow(NULL); DebugNoMessagebox(); DebugNoOutputDebugString(); DebugNoStdOut(); break; case LOG_DEBUGSTRING: klogmsg(L"logtype=LOG_DEBUGSTRING\n"); DebugOutputDebugString(); break; case LOG_FILE : klogmsg(L"logtype=LOG_FILE '%hs'\n", cfg->szLogfile); DebugSetLogfile(cfg->szLogfile); break; #ifdef _DEBUG_SOCKET case LOG_NETWORK : klogmsg(L"logtype=LOG_NETWORK '%hs'\n", cfg->szLogfile); DebugSetSocket(cfg->szLogfile); break; #endif default: klogmsg(L"logtype=unknown %d\n", cfg->logtype); DebugSetLogfile("itsutils.log"); } //DebugOutputDebugString(); } void save_config(GetVersionParams*cfg) { klogmsg(L"save_config %d\n", cfg->logtype); GetVersionParams *memcfg= (GetVersionParams *)get_persistent_data(L"itsutils_config_ptr", MAX_PATH+sizeof(DWORD), true); memcpy(memcfg, cfg, MAX_PATH+sizeof(DWORD)); } void KeepItsutils() { if (g_hLib) return; TCHAR modname[MAX_PATH]; GetModuleFileName((HMODULE)g_instance, modname, MAX_PATH); g_hLib= LoadLibrary(modname); //debug("itsutils retained in memory\n"); } void ReleaseItsutils() { if (g_hLib) FreeLibrary(g_hLib); //debug("itsutils(%08lx) released\n", g_hLib); g_hLib= NULL; } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { //DebugOutputDebugString(); //test300(); //test420(); //test500(); g_instance= hModule; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: load_config(); //debug("DLL_PROCESS_ATTACH\n"); break; #ifdef LOCKED_DLL_CFG case DLL_THREAD_ATTACH: load_config(); //debug("DLL_THREAD_ATTACH\n"); break; #endif //case DLL_THREAD_DETACH: debug("DLL_THREAD_DETACH\n"); break; case DLL_PROCESS_DETACH: DebugSetLogfile(NULL); //debug("DLL_PROCESS_DETACH\n"); break; } //debugt("DllMain: pid=%08lx:tid=%08lx mod=%08lx reason=%d\n", GetCurrentProcessId(), GetCurrentThreadId(), hModule, ul_reason_for_call); return TRUE; }