BOOL WINAPI DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: { ghPluginModule = (HMODULE)hModule; //ghWorkingModule = (u64)hModule; HeapInitialize(); #ifdef SHOW_STARTED_MSGBOX if (!IsDebuggerPresent()) MessageBoxA(NULL, "ConEmuLn*.dll loaded", "ConEmuLn plugin", 0); #endif bool lbExportsChanged = false; if (LoadFarVersion()) { if (gFarVersion.dwVerMajor == 3) { lbExportsChanged = ChangeExports( Far3Func, ghPluginModule ); if (!lbExportsChanged) { _ASSERTE(lbExportsChanged); } } } } break; case DLL_PROCESS_DETACH: HeapDeinitialize(); break; } return TRUE; }
bool ProcessCommandLine(int& iRc, HMODULE& hConEmu) { LPCWSTR pszCmdLine = GetCommandLineW(); // If there is '-new_console' or '-cur_console' switches... if (IsNewConsoleArg(pszCmdLine) || IsNewConsoleArg(pszCmdLine, L"-cur_console")) return false; HeapInitialize(); bool bProcessed = false; // Loop through switches to find supported { CEStr lsArg; int iCount = 0; bool bHelpRequested = false; bool bFirst = true; while (NextArg(&pszCmdLine, lsArg) == 0) { if ((lsArg.ms_Val[0] == L'-') && lsArg.ms_Val[1] && !wcspbrk(lsArg.ms_Val+1, L"\\//|.&<>^")) { // Seems this is to be the "switch" too lsArg.ms_Val[0] = L'/'; } bool bWasFirst = bFirst; bFirst = false; if ((lsArg.ms_Val[0] != L'/') && bWasFirst) { LPCWSTR pszName = PointToName(lsArg.ms_Val); if (pszName && (lstrcmpi(pszName, WIN3264TEST(L"ConEmuC.exe",L"ConEmuC64.exe")) == 0)) continue; } iCount++; if ((lsArg.ms_Val[0] != L'/') && (iCount > 1)) { // Some unknown (here) switch, goto full version break; } if (lstrcmpi(lsArg, L"/Download") == 0) { iRc = DoDownload(pszCmdLine); // Return '0' on download success for compatibility if (iRc == CERR_DOWNLOAD_SUCCEEDED) iRc = 0; bProcessed = true; break; } if ((lstrcmpi(lsArg, L"/Args") == 0) || (lstrcmpi(lsArg, L"/ParseArgs") == 0)) { iRc = DoParseArgs(pszCmdLine); bProcessed = true; break; } if ((lstrcmpi(lsArg, L"/?") == 0) || (lstrcmpi(lsArg, L"/h") == 0) || (lstrcmpi(lsArg, L"/help") == 0) || (lstrcmpi(lsArg, L"/-help") == 0) ) { bHelpRequested = true; break; }; // ToDo: /IsConEmu may be processed partially? // TODO: Inject remote and standard, DefTerm } if (bHelpRequested || (iCount == 0)) { if (!hConEmu) { // Prefere Help from ConEmuCD.dll because ConEmuC.exe may be outdated (due to stability preference) hConEmu = LoadLibrary(WIN3264TEST(L"ConEmuCD.dll",L"ConEmuCD64.dll")); // Show internal Help variant if only ConEmuCD.dll was failed to load if (hConEmu == NULL) { Help(); iRc = CERR_HELPREQUESTED; bProcessed = true; } } } } HeapDeinitialize(); return bProcessed; }
void DllStop() { #if defined(SHOW_EXE_TIMINGS) || defined(SHOW_EXE_MSGBOX) wchar_t szTimingMsg[512]; UNREFERENCED_PARAMETER(szTimingMsg); HANDLE hTimingHandle = GetStdHandle(STD_OUTPUT_HANDLE); #endif print_timings(L"DllStop"); //gbDllStopCalled = TRUE; -- в конце #ifdef HOOK_USE_DLLTHREAD DllThreadClose(); #endif #ifdef _DEBUG wchar_t *szModule = (wchar_t*)calloc((MAX_PATH+1),sizeof(wchar_t)); if (!GetModuleFileName(NULL, szModule, MAX_PATH+1)) _wcscpy_c(szModule, MAX_PATH+1, L"GetModuleFileName failed"); const wchar_t* pszName = PointToName(szModule); //if (!lstrcmpi(pszName, L"mingw32-make.exe")) // GuiMessageBox(ghConEmuWnd, L"mingw32-make.exe terminating", L"ConEmuHk", MB_SYSTEMMODAL); free(szModule); #endif // 120528 - Очистить буфер от мышиных событий, иначе получаются казусы. // Если во время выполнения команды (например "dir c: /s") // успеть дернуть мышкой - то при возврате в ФАР сразу пойдет фаровский драг if (ghConWnd) { print_timings(L"FlushMouseEvents"); FlushMouseEvents(); } #ifdef USE_PIPE_SERVER if (gpHookServer) { print_timings(L"StopPipeServer"); gpHookServer->StopPipeServer(); free(gpHookServer); gpHookServer = NULL; } #endif #ifdef _DEBUG if (ghGuiClientRetHook) { print_timings(L"unhookWindowsHookEx"); user->unhookWindowsHookEx(ghGuiClientRetHook); } #endif if (/*!gbSkipInjects &&*/ gbHooksWasSet) { print_timings(L"ShutdownHooks"); gbHooksWasSet = FALSE; // Завершить работу с реестром DoneHooksReg(); // "Закрыть" хуки ShutdownHooks(); } //if (gnRunMode == RM_APPLICATION) //{ print_timings(L"SendStopped"); SendStopped(); //} if (gpConMap) { print_timings(L"gpConMap->CloseMap"); gpConMap->CloseMap(); gpConInfo = NULL; delete gpConMap; gpConMap = NULL; } //#ifndef TESTLINK print_timings(L"CommonShutdown"); CommonShutdown(); print_timings(L"FinalizeHookedModules"); FinalizeHookedModules(); #ifndef _DEBUG HeapDeinitialize(); #endif #ifdef _DEBUG #ifdef UseDebugExceptionFilter // ?gfnPrevFilter? // Вернуть. A value of NULL for this parameter specifies default handling within UnhandledExceptionFilter. SetUnhandledExceptionFilter(NULL); #endif #endif gbDllStopCalled = TRUE; print_timings(L"DllStop - Done"); }