From 948e063ea441d3da6cf31d31b94d22eaa6fffffe Mon Sep 17 00:00:00 2001 From: Paddy Xu Date: Sat, 29 Nov 2014 12:49:28 +0100 Subject: [PATCH] Dummy --- .gitattributes | 63 ++++ LEProc/Program.cs | 736 +++++++++++++++++++++++----------------------- 2 files changed, 431 insertions(+), 368 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/LEProc/Program.cs b/LEProc/Program.cs index 2b55a7f..35a88c4 100644 --- a/LEProc/Program.cs +++ b/LEProc/Program.cs @@ -1,369 +1,369 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Windows.Forms; -using LECommonLibrary; - -namespace LEProc -{ - internal static class Program - { - internal static string[] Args; - - /// - /// The main entry point for the application. - /// - [STAThread] - private static void Main(string[] args) - { - try - { - Process.Start(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), - "LEUpdater.exe")); - } - catch - { - } - - if (!File.Exists(LEConfig.GlobalConfigPath)) - { - MessageBox.Show( - "\"LEConfig.xml\" not found. \r\n" + - "Please run \"LEGUI.exe\" once to let it generate one for you.", - "Locale Emulator Version " + GlobalHelper.GetLEVersion(), - MessageBoxButtons.OK, - MessageBoxIcon.Information); - } - - if (args.Length == 0) - { - MessageBox.Show( - "Welcome to Locale Emulator command line tool.\r\n" + - "\r\n" + - "Usage: LEProc.exe\r\n" + - "\t\t\t\t--(1)\r\n" + - "\t-run \t\t\t--(2)\r\n" + - "\t-manage \t\t--(3)\r\n" + - "\t-global\t\t\t\t--(4)\r\n" + - "\t-runas \t--(5)\r\n" + - "\r\n" + - "(1): Run an application with a build-in profile(as Japanese).\r\n" + - "(2): Run an application with it's own profile.\r\n" + - "(3): Modify the profile of one application.\r\n" + - "(4): Open Global Profile Manager.\r\n" + - "(5): Run an application with a global profile of specific Guid.\r\n" + - "\r\n" + - "\r\n" + - "Have a suggestion? Want to report a bug? You are welcome! \r\n" + - "Go to https://github.com/xupefei/Locale-Emulator/issues,\r\n" + - "or send a message to https://google.com/+PaddyXu.\r\n" + - "\r\n" + - "\r\n" + - "You can press CTRL+C to copy this message to your clipboard.\r\n", - "Locale Emulator Version " + GlobalHelper.GetLEVersion() - ); - - return; - } - - try - { - Args = args; - - switch (args[0]) - { - case "-run": //-run %APP% - RunWithIndependentProfile(args[1]); - break; - - case "-manage": //-manage %APP% - Process.Start(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), - "LEGUI.exe"), - String.Format("\"{0}.le.config\"", args[1])); - break; - - case "-global": //-global - Process.Start(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), - "LEGUI.exe")); - break; - - case "-runas": //-runas %GUID% %APP% - RunWithGlobalProfile(args[1], args[2]); - break; - - default: // Run with default profile - if (File.Exists(args[0])) - RunWithDefaultProfile(args[0]); - break; - } - } - catch - { - } - } - - private static void RunWithDefaultProfile(string path) - { - DoRunWithLEProfile(path, new LEProfile(true)); - } - - private static void RunWithGlobalProfile(string guid, string path) - { - // We do not check whether the config exists because only when it exists can this method be called. - - LEProfile profile = LEConfig.GetProfiles().First(p => p.Guid == guid); - - DoRunWithLEProfile(path, profile); - } - - private static void RunWithIndependentProfile(string path) - { - string conf = path + ".le.config"; - - if (!File.Exists(conf)) - { - Process.Start( - Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "LEGUI.exe"), - String.Format("\"{0}.le.config\"", path)); - } - else - { - LEProfile profile = LEConfig.GetProfiles(conf)[0]; - DoRunWithLEProfile(path, profile); - } - } - - private static void DoRunWithLEProfile(string path, LEProfile profile) - { - try - { - if (profile.RunAsAdmin && !SystemHelper.IsAdministrator()) - { - ElevateProcess(); - - return; - } - - if (profile.RunWithSuspend) - { - if (DialogResult.No == - MessageBox.Show( - "You are running a exectuable with CREATE_SUSPENDED flag.\r\n" + - "\r\n" + - "The exectuable will be executed after you click the \"Yes\" button, " + - "But as a background process which has no notfications at all." + - "You can attach it by using OllyDbg, or stop it with Task Manager.\r\n", - "Locale Emulator Debug Mode Warning", - MessageBoxButtons.YesNo, - MessageBoxIcon.Information - )) - return; - } - - string applicationName = string.Empty; - string commandLine = string.Empty; - - if (Path.GetExtension(path).ToLower() == ".exe") - { - applicationName = path; - - commandLine = path.StartsWith("\"") - ? string.Format("{0} ", path) - : String.Format("\"{0}\" ", path); - - commandLine += profile.Parameter; - } - else - { - string[] jb = AssociationReader.GetAssociatedProgram(Path.GetExtension(path)); - - if (jb == null) - return; - - applicationName = jb[0]; - - commandLine = jb[0].StartsWith("\"") - ? string.Format("{0} ", jb[0]) - : String.Format("\"{0}\" ", jb[0]); - commandLine += jb[1].Replace("%1", path).Replace("%*", profile.Parameter); - } - - string currentDirectory = Path.GetDirectoryName(path); - bool debugMode = profile.RunWithSuspend; - var ansiCodePage = (uint)CultureInfo.GetCultureInfo(profile.Location).TextInfo.ANSICodePage; - var oemCodePage = (uint)CultureInfo.GetCultureInfo(profile.Location).TextInfo.OEMCodePage; - var localeID = (uint)CultureInfo.GetCultureInfo(profile.Location).TextInfo.LCID; - var defaultCharset = (uint) - GetCharsetFromANSICodepage(CultureInfo.GetCultureInfo(profile.Location) - .TextInfo.ANSICodePage); - - TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(profile.Timezone); - var timezoneBias = (int)-tzi.BaseUtcOffset.TotalMinutes; - - TimeZoneInfo.AdjustmentRule[] adjustmentRules = tzi.GetAdjustmentRules(); - TimeZoneInfo.AdjustmentRule adjustmentRule = null; - if (adjustmentRules.Length > 0) - { - // Find the single record that encompasses today's date. If none exists, sets adjustmentRule to null. - adjustmentRule = - adjustmentRules.SingleOrDefault(ar => ar.DateStart <= DateTime.Now && DateTime.Now <= ar.DateEnd); - } - int timezoneDaylightBias = adjustmentRule == null ? 0 : (int)-adjustmentRule.DaylightDelta.TotalMinutes; - - string timezoneStandardName = tzi.StandardName; - - string timezoneDaylightName = tzi.DaylightName; - - LERegistryEntry[] registries = profile.RedirectRegistry - ? new LERegistry().GetRegistryEntries() - : new LERegistryEntry[0]; - - var l = new LoaderWrapper - { - ApplicationName = applicationName, - CommandLine = commandLine, - CurrentDirectory = currentDirectory, - AnsiCodePage = ansiCodePage, - OemCodePage = oemCodePage, - LocaleID = localeID, - DefaultCharset = defaultCharset, - TimezoneBias = timezoneBias, - TimezoneDaylightBias = timezoneDaylightBias, - TimezoneStandardName = timezoneStandardName, - TimezoneDaylightName = timezoneDaylightName, - NumberOfRegistryRedirectionEntries = registries.Length, - DebugMode = debugMode, - }; - - registries.ToList() - .ForEach( - item => - l.AddRegistryRedirectEntry(item.Root, item.Key, item.Name, item.Type, item.Data)); - - uint ret; - if ((ret = l.Start()) != 0) - { - if (SystemHelper.IsAdministrator()) - { - MessageBox.Show(String.Format( - "Launch failed.\r\n" + - "\r\n" + - "Commands: {0}\r\n" + - "Error Number: {1}\r\n" + - "Administrator: {2}\r\n" + - "\r\n" + - "If you have any antivirus software running, please turn it off and try again.\r\n" - + - "If you think this error is related to LE itself, feel free to submit an issue at\r\n" - + - "https://github.com/xupefei/Locale-Emulator/issues.\r\n" + - "\r\n" + - "\r\n" + - "You can press CTRL+C to copy this message to your clipboard.\r\n", - commandLine, - Convert.ToString(ret, 16).ToUpper(), - SystemHelper.IsAdministrator() - ), - "Locale Emulator Version " + GlobalHelper.GetLEVersion()); - } - else - { - ElevateProcess(); - } - } - } - catch (Exception e) - { - MessageBox.Show(e.ToString()); - } - } - - private static void ElevateProcess() - { - try - { - SystemHelper.RunWithElevatedProcess( - Path.Combine( - Path.GetDirectoryName( - Assembly.GetExecutingAssembly() - .Location), - "LEProc.exe"), - Args); - } - catch (Exception) - { - } - } - - private static int GetCharsetFromANSICodepage(int ansicp) - { - const int ANSI_CHARSET = 0; - const int DEFAULT_CHARSET = 1; - const int SYMBOL_CHARSET = 2; - const int SHIFTJIS_CHARSET = 128; - const int HANGEUL_CHARSET = 129; - const int HANGUL_CHARSET = 129; - const int GB2312_CHARSET = 134; - const int CHINESEBIG5_CHARSET = 136; - const int OEM_CHARSET = 255; - const int JOHAB_CHARSET = 130; - const int HEBREW_CHARSET = 177; - const int ARABIC_CHARSET = 178; - const int GREEK_CHARSET = 161; - const int TURKISH_CHARSET = 162; - const int VIETNAMESE_CHARSET = 163; - const int THAI_CHARSET = 222; - const int EASTEUROPE_CHARSET = 238; - const int RUSSIAN_CHARSET = 204; - const int MAC_CHARSET = 77; - const int BALTIC_CHARSET = 186; - - int charset = ANSI_CHARSET; - - switch (ansicp) - { - case 932: // Japanese - charset = SHIFTJIS_CHARSET; - break; - case 936: // Simplified Chinese - charset = GB2312_CHARSET; - break; - case 949: // Korean - charset = HANGEUL_CHARSET; - break; - case 950: // Traditional Chinese - charset = CHINESEBIG5_CHARSET; - break; - case 1250: // Eastern Europe - charset = EASTEUROPE_CHARSET; - break; - case 1251: // Russian - charset = RUSSIAN_CHARSET; - break; - case 1252: // Western European Languages - charset = ANSI_CHARSET; - break; - case 1253: // Greek - charset = GREEK_CHARSET; - break; - case 1254: // Turkish - charset = TURKISH_CHARSET; - break; - case 1255: // Hebrew - charset = HEBREW_CHARSET; - break; - case 1256: // Arabic - charset = ARABIC_CHARSET; - break; - case 1257: // Baltic - charset = BALTIC_CHARSET; - break; - } - - return charset; - } - } +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Windows.Forms; +using LECommonLibrary; + +namespace LEProc +{ + internal static class Program + { + internal static string[] Args; + + /// + /// The main entry point for the application. + /// + [STAThread] + private static void Main(string[] args) + { + try + { + Process.Start(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), + "LEUpdater.exe")); + } + catch + { + } + + if (!File.Exists(LEConfig.GlobalConfigPath)) + { + MessageBox.Show( + "\"LEConfig.xml\" not found. \r\n" + + "Please run \"LEGUI.exe\" once to let it generate one for you.", + "Locale Emulator Version " + GlobalHelper.GetLEVersion(), + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + + if (args.Length == 0) + { + MessageBox.Show( + "Welcome to Locale Emulator command line tool.\r\n" + + "\r\n" + + "Usage: LEProc.exe\r\n" + + "\t\t\t\t--(1)\r\n" + + "\t-run \t\t\t--(2)\r\n" + + "\t-manage \t\t--(3)\r\n" + + "\t-global\t\t\t\t--(4)\r\n" + + "\t-runas \t--(5)\r\n" + + "\r\n" + + "(1): Run an application with a build-in profile(as Japanese).\r\n" + + "(2): Run an application with it's own profile.\r\n" + + "(3): Modify the profile of one application.\r\n" + + "(4): Open Global Profile Manager.\r\n" + + "(5): Run an application with a global profile of specific Guid.\r\n" + + "\r\n" + + "\r\n" + + "Have a suggestion? Want to report a bug? You are welcome! \r\n" + + "Go to https://github.com/xupefei/Locale-Emulator/issues,\r\n" + + "or send a message to https://google.com/+PaddyXu.\r\n" + + "\r\n" + + "\r\n" + + "You can press CTRL+C to copy this message to your clipboard.\r\n", + "Locale Emulator Version " + GlobalHelper.GetLEVersion() + ); + + return; + } + + try + { + Args = args; + + switch (args[0]) + { + case "-run": //-run %APP% + RunWithIndependentProfile(args[1]); + break; + + case "-manage": //-manage %APP% + Process.Start(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), + "LEGUI.exe"), + String.Format("\"{0}.le.config\"", args[1])); + break; + + case "-global": //-global + Process.Start(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), + "LEGUI.exe")); + break; + + case "-runas": //-runas %GUID% %APP% + RunWithGlobalProfile(args[1], args[2]); + break; + + default: // Run with default profile + if (File.Exists(args[0])) + RunWithDefaultProfile(args[0]); + break; + } + } + catch + { + } + } + + private static void RunWithDefaultProfile(string path) + { + DoRunWithLEProfile(path, new LEProfile(true)); + } + + private static void RunWithGlobalProfile(string guid, string path) + { + // We do not check whether the config exists because only when it exists can this method be called. + + LEProfile profile = LEConfig.GetProfiles().First(p => p.Guid == guid); + + DoRunWithLEProfile(path, profile); + } + + private static void RunWithIndependentProfile(string path) + { + string conf = path + ".le.config"; + + if (!File.Exists(conf)) + { + Process.Start( + Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "LEGUI.exe"), + String.Format("\"{0}.le.config\"", path)); + } + else + { + LEProfile profile = LEConfig.GetProfiles(conf)[0]; + DoRunWithLEProfile(path, profile); + } + } + + private static void DoRunWithLEProfile(string path, LEProfile profile) + { + try + { + if (profile.RunAsAdmin && !SystemHelper.IsAdministrator()) + { + ElevateProcess(); + + return; + } + + if (profile.RunWithSuspend) + { + if (DialogResult.No == + MessageBox.Show( + "You are running a exectuable with CREATE_SUSPENDED flag.\r\n" + + "\r\n" + + "The exectuable will be executed after you click the \"Yes\" button, " + + "But as a background process which has no notfications at all." + + "You can attach it by using OllyDbg, or stop it with Task Manager.\r\n", + "Locale Emulator Debug Mode Warning", + MessageBoxButtons.YesNo, + MessageBoxIcon.Information + )) + return; + } + + string applicationName = string.Empty; + string commandLine = string.Empty; + + if (Path.GetExtension(path).ToLower() == ".exe") + { + applicationName = path; + + commandLine = path.StartsWith("\"") + ? string.Format("{0} ", path) + : String.Format("\"{0}\" ", path); + + commandLine += profile.Parameter; + } + else + { + string[] jb = AssociationReader.GetAssociatedProgram(Path.GetExtension(path)); + + if (jb == null) + return; + + applicationName = jb[0]; + + commandLine = jb[0].StartsWith("\"") + ? string.Format("{0} ", jb[0]) + : String.Format("\"{0}\" ", jb[0]); + commandLine += jb[1].Replace("%1", path).Replace("%*", profile.Parameter); + } + + string currentDirectory = Path.GetDirectoryName(path); + bool debugMode = profile.RunWithSuspend; + var ansiCodePage = (uint)CultureInfo.GetCultureInfo(profile.Location).TextInfo.ANSICodePage; + var oemCodePage = (uint)CultureInfo.GetCultureInfo(profile.Location).TextInfo.OEMCodePage; + var localeID = (uint)CultureInfo.GetCultureInfo(profile.Location).TextInfo.LCID; + var defaultCharset = (uint) + GetCharsetFromANSICodepage(CultureInfo.GetCultureInfo(profile.Location) + .TextInfo.ANSICodePage); + + TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(profile.Timezone); + var timezoneBias = (int)-tzi.BaseUtcOffset.TotalMinutes; + + TimeZoneInfo.AdjustmentRule[] adjustmentRules = tzi.GetAdjustmentRules(); + TimeZoneInfo.AdjustmentRule adjustmentRule = null; + if (adjustmentRules.Length > 0) + { + // Find the single record that encompasses today's date. If none exists, sets adjustmentRule to null. + adjustmentRule = + adjustmentRules.SingleOrDefault(ar => ar.DateStart <= DateTime.Now && DateTime.Now <= ar.DateEnd); + } + int timezoneDaylightBias = adjustmentRule == null ? 0 : (int)-adjustmentRule.DaylightDelta.TotalMinutes; + + string timezoneStandardName = tzi.StandardName; + + string timezoneDaylightName = tzi.DaylightName; + + LERegistryEntry[] registries = profile.RedirectRegistry + ? new LERegistry().GetRegistryEntries() + : new LERegistryEntry[0]; + + var l = new LoaderWrapper + { + ApplicationName = applicationName, + CommandLine = commandLine, + CurrentDirectory = currentDirectory, + AnsiCodePage = ansiCodePage, + OemCodePage = oemCodePage, + LocaleID = localeID, + DefaultCharset = defaultCharset, + TimezoneBias = timezoneBias, + TimezoneDaylightBias = timezoneDaylightBias, + TimezoneStandardName = timezoneStandardName, + TimezoneDaylightName = timezoneDaylightName, + NumberOfRegistryRedirectionEntries = registries.Length, + DebugMode = debugMode, + }; + + registries.ToList() + .ForEach( + item => + l.AddRegistryRedirectEntry(item.Root, item.Key, item.Name, item.Type, item.Data)); + + uint ret; + if ((ret = l.Start()) != 0) + { + if (SystemHelper.IsAdministrator()) + { + MessageBox.Show(String.Format( + "Launch failed.\r\n" + + "\r\n" + + "Commands: {0}\r\n" + + "Error Number: {1}\r\n" + + "Administrator: {2}\r\n" + + "\r\n" + + "If you have any antivirus software running, please turn it off and try again.\r\n" + + + "If you think this error is related to LE itself, feel free to submit an issue at\r\n" + + + "https://github.com/xupefei/Locale-Emulator/issues.\r\n" + + "\r\n" + + "\r\n" + + "You can press CTRL+C to copy this message to your clipboard.\r\n", + commandLine, + Convert.ToString(ret, 16).ToUpper(), + SystemHelper.IsAdministrator() + ), + "Locale Emulator Version " + GlobalHelper.GetLEVersion()); + } + else + { + ElevateProcess(); + } + } + } + catch (Exception e) + { + MessageBox.Show(e.ToString()); + } + } + + private static void ElevateProcess() + { + try + { + SystemHelper.RunWithElevatedProcess( + Path.Combine( + Path.GetDirectoryName( + Assembly.GetExecutingAssembly() + .Location), + "LEProc.exe"), + Args); + } + catch (Exception) + { + } + } + + private static int GetCharsetFromANSICodepage(int ansicp) + { + const int ANSI_CHARSET = 0; + const int DEFAULT_CHARSET = 1; + const int SYMBOL_CHARSET = 2; + const int SHIFTJIS_CHARSET = 128; + const int HANGEUL_CHARSET = 129; + const int HANGUL_CHARSET = 129; + const int GB2312_CHARSET = 134; + const int CHINESEBIG5_CHARSET = 136; + const int OEM_CHARSET = 255; + const int JOHAB_CHARSET = 130; + const int HEBREW_CHARSET = 177; + const int ARABIC_CHARSET = 178; + const int GREEK_CHARSET = 161; + const int TURKISH_CHARSET = 162; + const int VIETNAMESE_CHARSET = 163; + const int THAI_CHARSET = 222; + const int EASTEUROPE_CHARSET = 238; + const int RUSSIAN_CHARSET = 204; + const int MAC_CHARSET = 77; + const int BALTIC_CHARSET = 186; + + int charset = ANSI_CHARSET; + + switch (ansicp) + { + case 932: // Japanese + charset = SHIFTJIS_CHARSET; + break; + case 936: // Simplified Chinese + charset = GB2312_CHARSET; + break; + case 949: // Korean + charset = HANGEUL_CHARSET; + break; + case 950: // Traditional Chinese + charset = CHINESEBIG5_CHARSET; + break; + case 1250: // Eastern Europe + charset = EASTEUROPE_CHARSET; + break; + case 1251: // Russian + charset = RUSSIAN_CHARSET; + break; + case 1252: // Western European Languages + charset = ANSI_CHARSET; + break; + case 1253: // Greek + charset = GREEK_CHARSET; + break; + case 1254: // Turkish + charset = TURKISH_CHARSET; + break; + case 1255: // Hebrew + charset = HEBREW_CHARSET; + break; + case 1256: // Arabic + charset = ARABIC_CHARSET; + break; + case 1257: // Baltic + charset = BALTIC_CHARSET; + break; + } + + return charset; + } + } } \ No newline at end of file