public static string CheckForImports(IntPtr resourceUpdateHandle, string scriptContent, string mname, string mainPath) { string result = scriptContent; var h = resourceUpdateHandle; string[] scriptLines = ESCode.SplitCode(scriptContent); foreach (var line in scriptLines) { if (line.StartsWith("Import ")) { FileInfo importScriptFile = new FileInfo(line.Remove(0, "Import ".Length)); if (!importScriptFile.Exists) { importScriptFile = new FileInfo(Path.Combine(mainPath, line.Remove(0, "Import ".Length))); } if (!importScriptFile.Exists) { EConsole.WriteLine($"[ERROR] File {importScriptFile.FullName} not found ({line})", true, ConsoleColor.Red); continue; } if (importScriptFile.Extension.ToLower() != ".es" && importScriptFile.Extension.ToLower() != ".escript" && importScriptFile.Extension.ToLower() != ".esh") { EConsole.WriteLine($"Import: Unsupported extension: {importScriptFile.Extension}", true, ConsoleColor.Yellow); continue; } string importName = "import" + Cmd.Process("RandomString 16"); result = result.Replace(line, "Import " + importName); EConsole.WriteLine("Processing Import " + importScriptFile.Name + "..."); string importScriptContent; using (StreamReader r = new StreamReader(importScriptFile.FullName)) { importScriptContent = r.ReadToEnd(); } importScriptContent = GlobalVars.RemoveDirtFromCode(importScriptContent); importScriptContent = CheckForImports(h, importScriptContent, mname, mainPath); //importScriptContent = "BASE64:" + GlobalVars.Base64Encode(importScriptContent); byte[] bytes = Encoding.ASCII.GetBytes(importScriptContent); // Get language identifier System.Globalization.CultureInfo currentCulture = System.Globalization.CultureInfo.CurrentCulture; int pid = ((ushort)currentCulture.LCID) & 0x3ff; int sid = ((ushort)currentCulture.LCID) >> 10; ushort languageID = (ushort)((((ushort)pid) << 10) | ((ushort)sid)); // Get pointer to data GCHandle scriptHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned); if (GlobalVars.UpdateResource(h, (IntPtr)10, importName, languageID, scriptHandle.AddrOfPinnedObject(), (uint)bytes.Length)) { EConsole.WriteLine("[" + importName + "(" + importScriptFile.Name + ")] 0x" + scriptHandle.AddrOfPinnedObject().ToString("X4") + " (" + bytes.Length + ") -> " + mname); } else { throw new Exception($"Can't insert resource ({importScriptFile.Name}): " + Marshal.GetLastWin32Error()); } } } return(result); }
// // Source: https://stackoverflow.com/questions/4127785/using-updateresource-in-c // public static void CompileScript(string fileName, string outName, string iconPath = "", bool anyKey = false) { string mname = new FileInfo(outName).Name; if (!GlobalVars.IgnoreRunAsAdmin) { Process source = Process.GetCurrentProcess(); Process target = new Process(); target.StartInfo = source.StartInfo; target.StartInfo.FileName = source.MainModule.FileName; target.StartInfo.WorkingDirectory = Path.GetDirectoryName(source.MainModule.FileName); target.StartInfo.UseShellExecute = true; if (Environment.OSVersion.Version.Major > 5) { target.StartInfo.Verb = "runas"; } string iconInfo = ""; if (iconPath != "") { iconInfo = " \"" + iconPath + "\""; } target.StartInfo.Arguments = String.Format("\"{0}\" /convert \"{1}\"{2} -ignoreRunasRestart", fileName, outName, iconInfo); if (anyKey) { target.StartInfo.Arguments += " -anykey"; } target.Start(); return; } Cmd.Process("ShowConsole"); Cmd.Process("title Compile " + new FileInfo(fileName).Name); EConsole.ForegroundColor = ConsoleColor.White; EConsole.WriteLine(" Script: " + fileName); EConsole.ForegroundColor = ConsoleColor.Yellow; EConsole.WriteLine(" = STARTING COMPILATION"); EConsole.WriteLine(""); EConsole.ForegroundColor = ConsoleColor.Gray; try { EConsole.WriteLine("Reading " + new FileInfo(fileName).Name + "..."); string scriptContent; using (StreamReader r = new StreamReader(fileName)) { scriptContent = r.ReadToEnd(); } scriptContent = GlobalVars.RemoveDirtFromCode(scriptContent); File.Copy(System.Reflection.Assembly.GetExecutingAssembly().Location, outName, true); EConsole.WriteLine("Created copy of current executable"); var h = GlobalVars.BeginUpdateResource(outName, false); EConsole.WriteLine("BeginUpdateResource (" + mname + ")"); if (h == null) { throw new Exception("Handle = null"); } // Get language identifier System.Globalization.CultureInfo currentCulture = System.Globalization.CultureInfo.CurrentCulture; int pid = ((ushort)currentCulture.LCID) & 0x3ff; int sid = ((ushort)currentCulture.LCID) >> 10; ushort languageID = (ushort)((((ushort)pid) << 10) | ((ushort)sid)); EConsole.WriteLine("Language: " + languageID); byte[] iconData = { }; // Get pointer to data //for (int i = 1; i <= 12; i++) //{ // if (GlobalVars.UpdateResource(h, (IntPtr)3, "#"+i.ToString(), 0, IntPtr.Zero, (uint)0)) // { // EConsole.WriteLine(" Icon #" + i + " removed from final executable"); // } // else EConsole.WriteLine(" ! Icon #" + i + " NOT removed: " + Marshal.GetLastWin32Error()); //} //for (int i = 1; i <= 6; i++) //{ // if (GlobalVars.UpdateResource(h, (IntPtr)3, i.ToString(), languageID, iconHandle.AddrOfPinnedObject(), (uint)iconData.Length)) // { // EConsole.WriteLine(" Icon #" + i + " updated"); // } // else EConsole.WriteLine(" ! Icon #" + i + " NOT updated: " + Marshal.GetLastWin32Error()); //} //if (GlobalVars.UpdateResource(h, (IntPtr)3, "1", languageID, iconHandle.AddrOfPinnedObject(), (uint)iconData.Length)) //{ // EConsole.WriteLine(" Icon data inserted"); //} //else throw new Exception("Can't insert resource: icon data: " + Marshal.GetLastWin32Error()); //EConsole.WriteLine(" = EndUpdateResource"); //if (!GlobalVars.EndUpdateResource(h, false)) throw new Exception("Can't finish resource updating"); //h = GlobalVars.BeginUpdateResource(outName, false); //EConsole.WriteLine(" = BeginUpdateResource"); scriptContent = CheckForImports(h, scriptContent, mname, new FileInfo(fileName).Directory.FullName); //scriptContent = "BASE64:" + GlobalVars.Base64Encode(scriptContent); byte[] bytes = Encoding.ASCII.GetBytes(scriptContent); GCHandle scriptHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned); if (GlobalVars.UpdateResource(h, (IntPtr)10, "script", languageID, scriptHandle.AddrOfPinnedObject(), (uint)bytes.Length)) { EConsole.WriteLine("[SCRIPT DATA] 0x" + scriptHandle.AddrOfPinnedObject().ToString("X4") + " (" + bytes.Length + ")" + mname); } else { throw new Exception("Can't insert script resource: " + Marshal.GetLastWin32Error()); } EConsole.WriteLine("EndUpdateResource (" + mname + ")"); if (!GlobalVars.EndUpdateResource(h, false)) { throw new Exception("Can't finish resource updating: " + Marshal.GetLastWin32Error()); } if (Cmd.Process("winver").ToLower().Contains("windows")) { string iName = ""; try { iName = new FileInfo(iconPath).Name; } catch { } EConsole.WriteLine("Extracting resources to insert icon " + iName); WriteResourceToFile("escript.InsertIcons.exe", "InsertIconsX.exe"); if (iconPath == "") { WriteResourceToFile("escript.02.ico", "00.ico"); } else { File.Copy(iconPath, "00.ico"); } EConsole.WriteLine("Running InsertIcons (https://github.com/einaregilsson/InsertIcons)"); Process ii = new Process(); ii.StartInfo.FileName = "InsertIconsX.exe"; ii.StartInfo.Arguments = "\"" + outName + "\" 00.ico"; ii.StartInfo.UseShellExecute = true; if (Environment.OSVersion.Version.Major > 5) { ii.StartInfo.Verb = "runas"; } ii.Start(); ii.WaitForExit(); } else { EConsole.WriteLine(" * Skipping Instert Icons (only for Windows + .NET Framework 4)"); } EConsole.WriteLine("Removing temporary files..."); if (File.Exists("InsertIconsX.exe")) { File.Delete("InsertIconsX.exe"); } if (File.Exists("00.ico")) { File.Delete("00.ico"); } } catch (Exception ex) { EConsole.WriteLine("Removing temporary files..."); if (File.Exists("InsertIconsX.exe")) { File.Delete("InsertIconsX.exe"); } if (File.Exists("00.ico")) { File.Delete("00.ico"); } EConsole.WriteLine(""); EConsole.ForegroundColor = ConsoleColor.Red; EConsole.WriteLine(" = ERROR: " + ex.ToString()); EConsole.ForegroundColor = ConsoleColor.Gray; EConsole.WriteLine("Press any key to close this window..."); try { EConsole.ReadKey(); } catch { } #if DEBUG throw ex; #endif Environment.Exit(-1); } EConsole.WriteLine(""); EConsole.ForegroundColor = ConsoleColor.Green; EConsole.WriteLine(" = COMPLETED"); EConsole.ForegroundColor = ConsoleColor.White; EConsole.WriteLine(" Result: " + outName); EConsole.ForegroundColor = ConsoleColor.Gray; if (anyKey) { EConsole.WriteLine("Press any key to close this window..."); EConsole.ReadKey(); } Environment.Exit(0); }