From a3385262c10d49a477e1e071a44ebdfd8e4b7d24 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 18 Nov 2012 14:45:04 +0000 Subject: fix: AAA crashes another programs when global hooks are active git-svn-id: http://svn.miranda-ng.org/main/trunk@2355 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- .../AdvancedAutoAway/AdvancedAutoAway_10.vcxproj | 1 + .../AdvancedAutoAway/advancedautoaway.cpp | 42 +++++++++++----------- .../AdvancedAutoAway/advancedautoaway.h | 4 +-- plugins/StatusPlugins/AdvancedAutoAway/main.cpp | 13 ++++--- plugins/StatusPlugins/AdvancedAutoAway/options.cpp | 21 +++++------ 5 files changed, 43 insertions(+), 38 deletions(-) (limited to 'plugins/StatusPlugins/AdvancedAutoAway') diff --git a/plugins/StatusPlugins/AdvancedAutoAway/AdvancedAutoAway_10.vcxproj b/plugins/StatusPlugins/AdvancedAutoAway/AdvancedAutoAway_10.vcxproj index 290d43eb64..24a61ea27c 100644 --- a/plugins/StatusPlugins/AdvancedAutoAway/AdvancedAutoAway_10.vcxproj +++ b/plugins/StatusPlugins/AdvancedAutoAway/AdvancedAutoAway_10.vcxproj @@ -161,6 +161,7 @@ Level3 WIN64;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 4996;%(DisableSpecificWarnings) + AssemblyAndSourceCode true diff --git a/plugins/StatusPlugins/AdvancedAutoAway/advancedautoaway.cpp b/plugins/StatusPlugins/AdvancedAutoAway/advancedautoaway.cpp index 00cc8ab90b..b40e45960f 100644 --- a/plugins/StatusPlugins/AdvancedAutoAway/advancedautoaway.cpp +++ b/plugins/StatusPlugins/AdvancedAutoAway/advancedautoaway.cpp @@ -44,7 +44,7 @@ int CompareSettings( const TAAAProtoSetting* p1, const TAAAProtoSetting* p2 ) return lstrcmpA( p1->szName, p2->szName ); } -OBJLIST autoAwaySettings( 10, CompareSettings ); +OBJLIST *autoAwaySettings; TAAAProtoSetting::TAAAProtoSetting( PROTOACCOUNT* pa ) { @@ -190,14 +190,14 @@ static int ProcessProtoAck(WPARAM wParam,LPARAM lParam) if ( ack->result != ACKRESULT_SUCCESS ) return 0; log_debugA("ProcessProtoAck: ack->szModule: %s", ack->szModule); - for ( int i=0; i < autoAwaySettings.getCount(); i++ ) { - log_debugA("chk: %s", autoAwaySettings[i].szName); - if (!strcmp(autoAwaySettings[i].szName, ack->szModule)) { - log_debugA("ack->szModule: %s autoAwaySettings[i].statusChanged: %d", ack->szModule, autoAwaySettings[i].statusChanged); - if (!autoAwaySettings[i].statusChanged) - autoAwaySettings[i].mStatus = TRUE; - - autoAwaySettings[i].statusChanged = FALSE; + for ( int i=0; i < autoAwaySettings->getCount(); i++ ) { + log_debugA("chk: %s", (*autoAwaySettings)[i].szName); + if (!strcmp((*autoAwaySettings)[i].szName, ack->szModule)) { + log_debugA("ack->szModule: %s (*autoAwaySettings)[i].statusChanged: %d", ack->szModule, (*autoAwaySettings)[i].statusChanged); + if (!(*autoAwaySettings)[i].statusChanged) + (*autoAwaySettings)[i].mStatus = TRUE; + + (*autoAwaySettings)[i].statusChanged = FALSE; } } return 0; @@ -211,14 +211,14 @@ int OnAccChanged(WPARAM wParam,LPARAM lParam) PROTOACCOUNT* pa = ( PROTOACCOUNT* )lParam; switch( wParam ) { case PRAC_ADDED: - autoAwaySettings.insert( new TAAAProtoSetting( pa )); + autoAwaySettings->insert( new TAAAProtoSetting( pa )); break; case PRAC_REMOVED: { - for ( int i=0; i < autoAwaySettings.getCount(); i++ ) { - if ( !lstrcmpA( autoAwaySettings[i].szName, pa->szModuleName )) { - autoAwaySettings.remove( i ); + for ( int i=0; i < autoAwaySettings->getCount(); i++ ) { + if ( !lstrcmpA( (*autoAwaySettings)[i].szName, pa->szModuleName )) { + autoAwaySettings->remove( i ); break; } } } break; @@ -293,8 +293,8 @@ static VOID CALLBACK AutoAwayTimer(HWND hwnd,UINT message,UINT_PTR idEvent,DWORD int statusChanged = FALSE; int confirm = FALSE; - for ( int i=0; i < autoAwaySettings.getCount(); i++ ) { - TAAAProtoSetting& aas = autoAwaySettings[i]; + for ( int i=0; i < autoAwaySettings->getCount(); i++ ) { + TAAAProtoSetting& aas = (*autoAwaySettings)[i]; aas.status = ID_STATUS_DISABLED; BOOL screenSaver = FALSE, locked = FALSE; @@ -400,11 +400,11 @@ static VOID CALLBACK AutoAwayTimer(HWND hwnd,UINT message,UINT_PTR idEvent,DWORD changeState(aas, ACTIVE); aas.sts1setTimer = 0; } - autoAwaySettings[i].mStatus = FALSE; + (*autoAwaySettings)[i].mStatus = FALSE; } if ( confirm || statusChanged ) { - OBJLIST ps = autoAwaySettings; + OBJLIST ps = *autoAwaySettings; int i; for ( i=0; i < ps.getCount(); i++ ) { @@ -592,7 +592,7 @@ static int AutoAwayShutdown(WPARAM wParam,LPARAM lParam) UnhookWindowsHooks(); DestroyHookableEvent(hStateChangedEvent); - autoAwaySettings.destroy(); + autoAwaySettings->destroy(); return 0; } @@ -616,7 +616,7 @@ int CSModuleLoaded(WPARAM wParam, LPARAM lParam) //////////////////////////////////////////////////////////////////////////////////////// - protoList = ( OBJLIST* )&autoAwaySettings; + protoList = ( OBJLIST* )autoAwaySettings; int count; PROTOACCOUNT** protos; @@ -624,11 +624,11 @@ int CSModuleLoaded(WPARAM wParam, LPARAM lParam) for ( int i=0; i < count; i++ ) if ( IsSuitableProto( protos[i] )) - autoAwaySettings.insert( new TAAAProtoSetting( protos[i] )); + autoAwaySettings->insert( new TAAAProtoSetting( protos[i] )); //////////////////////////////////////////////////////////////////////////////////////// - LoadOptions(autoAwaySettings, FALSE); + LoadOptions(*autoAwaySettings, FALSE); #ifdef TRIGGERPLUGIN InitTrigger(); diff --git a/plugins/StatusPlugins/AdvancedAutoAway/advancedautoaway.h b/plugins/StatusPlugins/AdvancedAutoAway/advancedautoaway.h index 5820a5f85c..e9b2565466 100644 --- a/plugins/StatusPlugins/AdvancedAutoAway/advancedautoaway.h +++ b/plugins/StatusPlugins/AdvancedAutoAway/advancedautoaway.h @@ -80,11 +80,11 @@ struct AAMSGSETTING char* msg; }; -extern HINSTANCE hInst; +extern HINSTANCE hInst, hCore; int CompareSettings( const TAAAProtoSetting* p1, const TAAAProtoSetting* p2 ); -extern OBJLIST autoAwaySettings; +extern OBJLIST *autoAwaySettings; int LoadAutoAwaySetting(TAAAProtoSetting& autoAwaySetting, char* protoName); void LoadOptions(OBJLIST& settings, BOOL override); diff --git a/plugins/StatusPlugins/AdvancedAutoAway/main.cpp b/plugins/StatusPlugins/AdvancedAutoAway/main.cpp index f640369607..4cd6e31f4d 100644 --- a/plugins/StatusPlugins/AdvancedAutoAway/main.cpp +++ b/plugins/StatusPlugins/AdvancedAutoAway/main.cpp @@ -27,9 +27,7 @@ // {F0FDF73A-753D-499d-8DBA-336DB79CDD41} #define MIID_ADVAUTOAWAY { 0xf0fdf73a, 0x753d, 0x499d, { 0x8d, 0xba, 0x33, 0x6d, 0xb7, 0x9c, 0xdd, 0x41 } } -HINSTANCE hInst; - - +HINSTANCE hInst, hCore = NULL; HANDLE hCSModuleLoadedHook; HANDLE hStateChangedEvent; @@ -42,7 +40,10 @@ int CSModuleLoaded(WPARAM wParam, LPARAM lParam); BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { - hInst = hinstDLL; + if (fdwReason == DLL_PROCESS_ATTACH) { + hInst = hinstDLL; + hCore = GetModuleHandleA("mir_core.dll"); + } return TRUE; } @@ -72,9 +73,10 @@ extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD miranda extern "C" __declspec(dllexport) int Load(void) { - mir_getLP( &pluginInfoEx ); + autoAwaySettings = new OBJLIST(10, CompareSettings); + InitCommonStatus(); hCSModuleLoadedHook = HookEvent(ME_SYSTEM_MODULESLOADED, CSModuleLoaded); hStateChangedEvent = CreateHookableEvent(ME_AAA_STATECHANGED); @@ -87,5 +89,6 @@ extern "C" __declspec(dllexport) int Load(void) extern "C" __declspec(dllexport) int Unload(void) { DestroyHookableEvent( hStateChangedEvent ); + delete autoAwaySettings; return 0; } diff --git a/plugins/StatusPlugins/AdvancedAutoAway/options.cpp b/plugins/StatusPlugins/AdvancedAutoAway/options.cpp index f9599f7b4d..edfeb0aaa8 100644 --- a/plugins/StatusPlugins/AdvancedAutoAway/options.cpp +++ b/plugins/StatusPlugins/AdvancedAutoAway/options.cpp @@ -31,8 +31,6 @@ static BOOL (WINAPI *pfnEnableThemeDialogTexture)(HANDLE, DWORD) = 0; #define ListView_SetCheckState(w,i,f) ListView_SetItemState(w,i,INDEXTOSTATEIMAGEMASK((f)+1),LVIS_STATEIMAGEMASK) #endif -static OBJLIST optionSettings( 10, CompareSettings ); - int LoadAutoAwaySetting(TAAAProtoSetting& autoAwaySetting, char* protoName); INT_PTR CALLBACK DlgProcAutoAwayMsgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); @@ -125,6 +123,8 @@ static void SetDialogStatus(HWND hwndDlg, TAAAProtoSetting* sameSetting) ///////////////////////////////////////////////////////////////////////////////////////// // Rules dialog window procedure +static OBJLIST *optionSettings; + static INT_PTR CALLBACK DlgProcAutoAwayRulesOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static TAAAProtoSetting* sameSetting; @@ -136,15 +136,16 @@ static INT_PTR CALLBACK DlgProcAutoAwayRulesOpts(HWND hwndDlg, UINT msg, WPARAM TranslateDialogDefault(hwndDlg); // copy the settings - optionSettings = autoAwaySettings; + optionSettings = new OBJLIST(10, CompareSettings); + *optionSettings = *autoAwaySettings; sameSetting = ( TAAAProtoSetting* )malloc(sizeof(TAAAProtoSetting)); LoadAutoAwaySetting(*sameSetting, SETTING_ALL); // fill list from currentProtoSettings { - for ( int i=0; i < optionSettings.getCount(); i++ ) { - TAAAProtoSetting& p = optionSettings[i]; + for ( int i=0; i < optionSettings->getCount(); i++ ) { + TAAAProtoSetting& p = (*optionSettings)[i]; int item = SendDlgItemMessage( hwndDlg, IDC_PROTOCOL, CB_ADDSTRING, 0, ( LPARAM )p.tszAccName ); SendDlgItemMessage( hwndDlg, IDC_PROTOCOL, CB_SETITEMDATA, item, (LPARAM)&p ); } @@ -351,15 +352,15 @@ static INT_PTR CALLBACK DlgProcAutoAwayRulesOpts(HWND hwndDlg, UINT msg, WPARAM if (bSettingSame) WriteAutoAwaySetting(*sameSetting, SETTING_ALL); else { - for (int i=0; i < optionSettings.getCount(); i++ ) - WriteAutoAwaySetting(optionSettings[i], optionSettings[i].szName); + for (int i=0; i < optionSettings->getCount(); i++ ) + WriteAutoAwaySetting((*optionSettings)[i], (*optionSettings)[i].szName); } - LoadOptions(autoAwaySettings, FALSE); + LoadOptions(*autoAwaySettings, FALSE); } break; case WM_DESTROY: - optionSettings.destroy(); + optionSettings->destroy(); free(sameSetting); break; } @@ -419,7 +420,7 @@ static INT_PTR CALLBACK DlgProcAutoAwayGeneralOpts(HWND hwndDlg, UINT msg, WPARA DBWriteContactSettingWord(NULL, MODULENAME, SETTING_CONFIRMDELAY, (WORD)GetDlgItemInt(hwndDlg, IDC_CONFIRMDELAY, NULL, FALSE)); DBWriteContactSettingByte(NULL, MODULENAME, SETTING_MONITORMOUSE, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_MONITORMOUSE)); DBWriteContactSettingByte(NULL, MODULENAME, SETTING_MONITORKEYBOARD, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_MONITORKEYBOARD)); - LoadOptions(autoAwaySettings, FALSE); + LoadOptions(*autoAwaySettings, FALSE); } break; } -- cgit v1.2.3