private static void MainCleanUp() { IpcBroadcast.StopServer(); EntryMenu.Destroy(); GlobalMutexPool.ReleaseAll(); CommonTerminate(); }
private static void MainCleanUp() { IpcBroadcast.StopServer(); if (m_tempFilesPool != null) { m_tempFilesPool.Clear(); } EntryMenu.Destroy(); GlobalMutexPool.ReleaseAll(); CommonTerminate(); }
public static void Main(string[] args) { #if DEBUG // Program.DesignMode should not be queried before executing // Main (e.g. by a static Control) when running the program // normally Debug.Assert(!m_bDesignModeQueried); #endif m_bDesignMode = false; // Designer doesn't call Main method m_cmdLineArgs = new CommandLineArgs(args); // Before loading the configuration string strWaDisable = m_cmdLineArgs[ AppDefs.CommandLineOptions.WorkaroundDisable]; if (!string.IsNullOrEmpty(strWaDisable)) { MonoWorkarounds.SetEnabled(strWaDisable, false); } DpiUtil.ConfigureProcess(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.DoEvents(); // Required #if DEBUG string strInitialWorkDir = WinUtil.GetWorkingDirectory(); #endif if (!CommonInit()) { CommonTerminate(); return; } if (m_appConfig.Application.Start.PluginCacheClearOnce) { PlgxCache.Clear(); m_appConfig.Application.Start.PluginCacheClearOnce = false; AppConfigSerializer.Save(Program.Config); } if (m_cmdLineArgs[AppDefs.CommandLineOptions.FileExtRegister] != null) { ShellUtil.RegisterExtension(AppDefs.FileExtension.FileExt, AppDefs.FileExtension.ExtId, KPRes.FileExtName, WinUtil.GetExecutable(), PwDefs.ShortProductName, false); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.FileExtUnregister] != null) { ShellUtil.UnregisterExtension(AppDefs.FileExtension.FileExt, AppDefs.FileExtension.ExtId); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.PreLoad] != null) { // All important .NET assemblies are in memory now already try { SelfTest.Perform(); } catch (Exception) { Debug.Assert(false); } MainCleanUp(); return; } /* if(m_cmdLineArgs[AppDefs.CommandLineOptions.PreLoadRegister] != null) * { * string strPreLoadPath = WinUtil.GetExecutable().Trim(); * if(strPreLoadPath.StartsWith("\"") == false) * strPreLoadPath = "\"" + strPreLoadPath + "\""; * ShellUtil.RegisterPreLoad(AppDefs.PreLoadName, strPreLoadPath, * @"--" + AppDefs.CommandLineOptions.PreLoad, true); * MainCleanUp(); * return; * } * if(m_cmdLineArgs[AppDefs.CommandLineOptions.PreLoadUnregister] != null) * { * ShellUtil.RegisterPreLoad(AppDefs.PreLoadName, string.Empty, * string.Empty, false); * MainCleanUp(); * return; * } */ if ((m_cmdLineArgs[AppDefs.CommandLineOptions.Help] != null) || (m_cmdLineArgs[AppDefs.CommandLineOptions.HelpLong] != null)) { AppHelp.ShowHelp(AppDefs.HelpTopics.CommandLine, null); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.ConfigSetUrlOverride] != null) { Program.Config.Integration.UrlOverride = m_cmdLineArgs[ AppDefs.CommandLineOptions.ConfigSetUrlOverride]; AppConfigSerializer.Save(Program.Config); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.ConfigClearUrlOverride] != null) { Program.Config.Integration.UrlOverride = string.Empty; AppConfigSerializer.Save(Program.Config); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.ConfigGetUrlOverride] != null) { try { string strFileOut = UrlUtil.EnsureTerminatingSeparator( UrlUtil.GetTempPath(), false) + "KeePass_UrlOverride.tmp"; string strContent = ("[KeePass]\r\nKeeURLOverride=" + Program.Config.Integration.UrlOverride + "\r\n"); File.WriteAllText(strFileOut, strContent); } catch (Exception) { Debug.Assert(false); } MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.ConfigSetLanguageFile] != null) { Program.Config.Application.LanguageFile = m_cmdLineArgs[ AppDefs.CommandLineOptions.ConfigSetLanguageFile]; AppConfigSerializer.Save(Program.Config); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.PlgxCreate] != null) { PlgxPlugin.CreateFromCommandLine(); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.PlgxCreateInfo] != null) { PlgxPlugin.CreateInfoFile(m_cmdLineArgs.FileName); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.ShowAssemblyInfo] != null) { MessageService.ShowInfo(Assembly.GetExecutingAssembly().ToString()); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.MakeXmlSerializerEx] != null) { XmlSerializerEx.GenerateSerializers(m_cmdLineArgs); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.MakeXspFile] != null) { XspArchive.CreateFile(m_cmdLineArgs.FileName, m_cmdLineArgs["d"]); MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.Version] != null) { Console.WriteLine(PwDefs.ShortProductName + " " + PwDefs.VersionString); Console.WriteLine(PwDefs.Copyright); MainCleanUp(); return; } #if DEBUG if (m_cmdLineArgs[AppDefs.CommandLineOptions.TestGfx] != null) { List <Image> lImg = new List <Image>(); lImg.Add(Properties.Resources.B16x16_Browser); lImg.Add(Properties.Resources.B48x48_Keyboard_Layout); ImageArchive aHighRes = new ImageArchive(); aHighRes.Load(Properties.Resources.Images_Client_HighRes); lImg.Add(aHighRes.GetForObject("C12_IRKickFlash")); if (File.Exists("Test.png")) { lImg.Add(Image.FromFile("Test.png")); } Image img = GfxUtil.ScaleTest(lImg.ToArray()); img.Save("GfxScaleTest.png", ImageFormat.Png); return; } #endif // #if (DEBUG && !KeePassLibSD) // if(m_cmdLineArgs[AppDefs.CommandLineOptions.MakePopularPasswordTable] != null) // { // PopularPasswords.MakeList(); // MainCleanUp(); // return; // } // #endif try { m_nAppMessage = NativeMethods.RegisterWindowMessage(m_strWndMsgID); } catch (Exception) { Debug.Assert(NativeLib.IsUnix()); } if (m_cmdLineArgs[AppDefs.CommandLineOptions.ExitAll] != null) { BroadcastAppMessageAndCleanUp(AppMessage.Exit); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.AutoType] != null) { BroadcastAppMessageAndCleanUp(AppMessage.AutoType); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.AutoTypeSelected] != null) { BroadcastAppMessageAndCleanUp(AppMessage.AutoTypeSelected); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.OpenEntryUrl] != null) { string strEntryUuid = m_cmdLineArgs[AppDefs.CommandLineOptions.Uuid]; if (!string.IsNullOrEmpty(strEntryUuid)) { IpcParamEx ipUrl = new IpcParamEx(IpcUtilEx.CmdOpenEntryUrl, strEntryUuid, null, null, null, null); IpcUtilEx.SendGlobalMessage(ipUrl); } MainCleanUp(); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.LockAll] != null) { BroadcastAppMessageAndCleanUp(AppMessage.Lock); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.UnlockAll] != null) { BroadcastAppMessageAndCleanUp(AppMessage.Unlock); return; } if (m_cmdLineArgs[AppDefs.CommandLineOptions.IpcEvent] != null) { string strName = m_cmdLineArgs[AppDefs.CommandLineOptions.IpcEvent]; if (!string.IsNullOrEmpty(strName)) { string[] vFlt = KeyUtil.MakeCtxIndependent(args); IpcParamEx ipEvent = new IpcParamEx(IpcUtilEx.CmdIpcEvent, strName, CommandLineArgs.SafeSerialize(vFlt), null, null, null); IpcUtilEx.SendGlobalMessage(ipEvent); } MainCleanUp(); return; } // Mutex mSingleLock = TrySingleInstanceLock(AppDefs.MutexName, true); bool bSingleLock = GlobalMutexPool.CreateMutex(AppDefs.MutexName, true); // if((mSingleLock == null) && m_appConfig.Integration.LimitToSingleInstance) if (!bSingleLock && m_appConfig.Integration.LimitToSingleInstance) { ActivatePreviousInstance(args); MainCleanUp(); return; } Mutex mGlobalNotify = TryGlobalInstanceNotify(AppDefs.MutexNameGlobal); AutoType.InitStatic(); CustomMessageFilterEx cmfx = new CustomMessageFilterEx(); Application.AddMessageFilter(cmfx); #if DEBUG if (m_cmdLineArgs[AppDefs.CommandLineOptions.DebugThrowException] != null) { throw new Exception(AppDefs.CommandLineOptions.DebugThrowException); } m_formMain = new MainForm(); Application.Run(m_formMain); #else try { if (m_cmdLineArgs[AppDefs.CommandLineOptions.DebugThrowException] != null) { throw new Exception(AppDefs.CommandLineOptions.DebugThrowException); } m_formMain = new MainForm(); Application.Run(m_formMain); } catch (Exception exPrg) { // Catch message box exception; // https://sourceforge.net/p/keepass/patches/86/ try { MessageService.ShowFatal(exPrg); } catch (Exception) { Console.Error.WriteLine(exPrg.ToString()); } } #endif Application.RemoveMessageFilter(cmfx); Debug.Assert(GlobalWindowManager.WindowCount == 0); Debug.Assert(MessageService.CurrentMessageCount == 0); MainCleanUp(); #if DEBUG string strEndWorkDir = WinUtil.GetWorkingDirectory(); Debug.Assert(strEndWorkDir.Equals(strInitialWorkDir, StrUtil.CaseIgnoreCmp)); #endif if (mGlobalNotify != null) { GC.KeepAlive(mGlobalNotify); } // if(mSingleLock != null) { GC.KeepAlive(mSingleLock); } }
public static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.DoEvents(); // Required #if DEBUG string strInitialWorkDir = WinUtil.GetWorkingDirectory(); #endif if (!CommonInit()) { CommonTerminate(); return; } if (m_appConfig.Application.Start.PluginCacheClearOnce) { PlgxCache.Clear(); m_appConfig.Application.Start.PluginCacheClearOnce = false; AppConfigSerializer.Save(Program.Config); } m_cmdLineArgs = new CommandLineArgs(args); if (m_cmdLineArgs[AppDefs.CommandLineOptions.FileExtRegister] != null) { ShellUtil.RegisterExtension(AppDefs.FileExtension.FileExt, AppDefs.FileExtension.ExtId, KPRes.FileExtName, WinUtil.GetExecutable(), PwDefs.ShortProductName, false); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.FileExtUnregister] != null) { ShellUtil.UnregisterExtension(AppDefs.FileExtension.FileExt, AppDefs.FileExtension.ExtId); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.PreLoad] != null) { // All important .NET assemblies are in memory now already try { SelfTest.Perform(); } catch (Exception) { Debug.Assert(false); } MainCleanUp(); return; } /* else if(m_cmdLineArgs[AppDefs.CommandLineOptions.PreLoadRegister] != null) * { * string strPreLoadPath = WinUtil.GetExecutable().Trim(); * if(strPreLoadPath.StartsWith("\"") == false) * strPreLoadPath = "\"" + strPreLoadPath + "\""; * ShellUtil.RegisterPreLoad(AppDefs.PreLoadName, strPreLoadPath, * @"--" + AppDefs.CommandLineOptions.PreLoad, true); * MainCleanUp(); * return; * } * else if(m_cmdLineArgs[AppDefs.CommandLineOptions.PreLoadUnregister] != null) * { * ShellUtil.RegisterPreLoad(AppDefs.PreLoadName, string.Empty, * string.Empty, false); * MainCleanUp(); * return; * } */ else if ((m_cmdLineArgs[AppDefs.CommandLineOptions.Help] != null) || (m_cmdLineArgs[AppDefs.CommandLineOptions.HelpLong] != null)) { AppHelp.ShowHelp(AppDefs.HelpTopics.CommandLine, null); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.ConfigSetUrlOverride] != null) { Program.Config.Integration.UrlOverride = m_cmdLineArgs[ AppDefs.CommandLineOptions.ConfigSetUrlOverride]; AppConfigSerializer.Save(Program.Config); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.ConfigClearUrlOverride] != null) { Program.Config.Integration.UrlOverride = string.Empty; AppConfigSerializer.Save(Program.Config); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.ConfigGetUrlOverride] != null) { try { string strFileOut = UrlUtil.EnsureTerminatingSeparator( UrlUtil.GetTempPath(), false) + "KeePass_UrlOverride.tmp"; string strContent = ("[KeePass]\r\nKeeURLOverride=" + Program.Config.Integration.UrlOverride + "\r\n"); File.WriteAllText(strFileOut, strContent); } catch (Exception) { Debug.Assert(false); } MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.ConfigSetLanguageFile] != null) { Program.Config.Application.LanguageFile = m_cmdLineArgs[ AppDefs.CommandLineOptions.ConfigSetLanguageFile]; AppConfigSerializer.Save(Program.Config); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.PlgxCreate] != null) { PlgxPlugin.CreateFromCommandLine(); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.PlgxCreateInfo] != null) { PlgxPlugin.CreateInfoFile(m_cmdLineArgs.FileName); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.ShowAssemblyInfo] != null) { MessageService.ShowInfo(Assembly.GetExecutingAssembly().ToString()); MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.MakeXmlSerializerEx] != null) { XmlSerializerEx.GenerateSerializers(m_cmdLineArgs); MainCleanUp(); return; } // #if (DEBUG && !KeePassLibSD) // else if(m_cmdLineArgs[AppDefs.CommandLineOptions.MakePopularPasswordTable] != null) // { // PopularPasswords.MakeList(); // MainCleanUp(); // return; // } // #endif try { m_nAppMessage = NativeMethods.RegisterWindowMessage(m_strWndMsgID); } catch (Exception) { Debug.Assert(NativeLib.IsUnix()); } if (m_cmdLineArgs[AppDefs.CommandLineOptions.ExitAll] != null) { BroadcastAppMessageAndCleanUp(AppMessage.Exit); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.AutoType] != null) { BroadcastAppMessageAndCleanUp(AppMessage.AutoType); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.AutoTypeSelected] != null) { BroadcastAppMessageAndCleanUp(AppMessage.AutoTypeSelected); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.OpenEntryUrl] != null) { string strEntryUuid = m_cmdLineArgs[AppDefs.CommandLineOptions.Uuid]; if (!string.IsNullOrEmpty(strEntryUuid)) { IpcParamEx ipUrl = new IpcParamEx(IpcUtilEx.CmdOpenEntryUrl, strEntryUuid, null, null, null, null); IpcUtilEx.SendGlobalMessage(ipUrl); } MainCleanUp(); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.LockAll] != null) { BroadcastAppMessageAndCleanUp(AppMessage.Lock); return; } else if (m_cmdLineArgs[AppDefs.CommandLineOptions.UnlockAll] != null) { BroadcastAppMessageAndCleanUp(AppMessage.Unlock); return; } // Mutex mSingleLock = TrySingleInstanceLock(AppDefs.MutexName, true); bool bSingleLock = GlobalMutexPool.CreateMutex(AppDefs.MutexName, true); // if((mSingleLock == null) && m_appConfig.Integration.LimitToSingleInstance) if (!bSingleLock && m_appConfig.Integration.LimitToSingleInstance) { ActivatePreviousInstance(args); MainCleanUp(); return; } Mutex mGlobalNotify = TryGlobalInstanceNotify(AppDefs.MutexNameGlobal); AutoType.InitStatic(); UserActivityNotifyFilter nfActivity = new UserActivityNotifyFilter(); Application.AddMessageFilter(nfActivity); #if DEBUG if (m_cmdLineArgs[AppDefs.CommandLineOptions.DebugThrowException] != null) { throw new Exception(AppDefs.CommandLineOptions.DebugThrowException); } m_formMain = new MainForm(); Application.Run(m_formMain); #else try { if (m_cmdLineArgs[AppDefs.CommandLineOptions.DebugThrowException] != null) { throw new Exception(AppDefs.CommandLineOptions.DebugThrowException); } m_formMain = new MainForm(); Application.Run(m_formMain); } catch (Exception exPrg) { // Catch message box exception; // https://sourceforge.net/p/keepass/patches/86/ try { MessageService.ShowFatal(exPrg); } catch (Exception) { Console.Error.WriteLine(exPrg.ToString()); } } #endif Application.RemoveMessageFilter(nfActivity); Debug.Assert(GlobalWindowManager.WindowCount == 0); Debug.Assert(MessageService.CurrentMessageCount == 0); MainCleanUp(); #if DEBUG string strEndWorkDir = WinUtil.GetWorkingDirectory(); Debug.Assert(strEndWorkDir.Equals(strInitialWorkDir, StrUtil.CaseIgnoreCmp)); #endif if (mGlobalNotify != null) { GC.KeepAlive(mGlobalNotify); } // if(mSingleLock != null) { GC.KeepAlive(mSingleLock); } }
/// <summary> /// Release (and potentially restore) the mutex used for limiting KeePass to a single instance /// In some cases the restart with WinUtil.Restart is done while the global mutex is not yet released /// </summary> /// <param name="release"></param> private void HandleMutex(bool release) { List <string> lStrings = new List <string>(); lStrings.Add("Mutex: " + KeePass.App.AppDefs.MutexName); lStrings.Add("Release: " + release.ToString()); lStrings.Add("Single Instance: " + KeePass.Program.Config.Integration.LimitToSingleInstance.ToString()); //Get number of loaded databases //KeePass creates an initial PwDocument during startup which must NOT be considered here // //Initial = No LockedIoc and PwDatabase is not opened (!IsOpen) int iOpenedDB = 0; foreach (PwDocument pd in KeePass.Program.MainForm.DocumentManager.Documents) { if (!string.IsNullOrEmpty(pd.LockedIoc.Path)) { iOpenedDB++; } else if ((pd.Database != null) && pd.Database.IsOpen) { iOpenedDB++; } } lStrings.Add("Opened databases: " + iOpenedDB.ToString()); if (!KeePass.Program.Config.Integration.LimitToSingleInstance) { lStrings.Add("Action required: No"); PluginDebug.AddInfo("Handle global mutex", 0, lStrings.ToArray()); return; } if (release) { bool bSuccess = GlobalMutexPool.ReleaseMutex(KeePass.App.AppDefs.MutexName); lStrings.Add("Action required: Yes"); lStrings.Add("Success: " + bSuccess.ToString()); PluginDebug.AddInfo("Handle global mutex", 0, lStrings.ToArray()); return; } else if (iOpenedDB > 0) { //Only recreate mutex if at least document is loaded (lock flag is not relevant here) //If no db is open, Restart is in progress already lStrings.Add("Action required: Yes"); lStrings.Add("Success: See next entry"); PluginDebug.AddInfo("Handle global mutex", 0, lStrings.ToArray()); Thread t = new Thread(new ThreadStart(() => { Thread.Sleep(PluginConfig.RestoreMutexThreshold); bool bSuccess = GlobalMutexPool.CreateMutex(KeePass.App.AppDefs.MutexName, true); PluginDebug.AddInfo("Handle global mutex", 0, "Recreate mutex sucessful: " + bSuccess.ToString()); })); t.IsBackground = true; t.Start(); return; } lStrings.Add("Action required: No"); PluginDebug.AddInfo("Handle global mutex", 0, lStrings.ToArray()); }