Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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");
}