mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-19 18:06:10 +00:00
f2ac1ece55
add
947 lines
41 KiB
C#
947 lines
41 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: JScriptCompiler
|
|
// Assembly: jsc, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
|
|
// MVID: 64FE9439-6D79-4C3B-BBDD-9D73A741F992
|
|
// Assembly location: C:\Users\Administrateur\Downloads\Virusshare.00004-msil\Virus.Win32.Sality.sil-4e552874df8b99a0969b07ded909051569fdb84478f01dd750d0323cc3573f48.exe
|
|
|
|
using Microsoft.JScript;
|
|
using Microsoft.JScript.Vsa;
|
|
using Microsoft.Vsa;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Reflection.Emit;
|
|
using System.Resources;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
|
|
internal class JScriptCompiler : MarshalByRefObject
|
|
{
|
|
private bool fPrintBanner;
|
|
private bool fBannerPrinted;
|
|
private bool fPrintTargets;
|
|
private int exitCode;
|
|
private bool fHelp;
|
|
private bool fUtf8Output;
|
|
private ArrayList targets;
|
|
private CompilerOptions currentTarget;
|
|
private int codeItemCounter = 0;
|
|
internal static readonly string ContextStringDelimiter = ";;";
|
|
private static int LCID = CultureInfo.CurrentUICulture.LCID;
|
|
private static readonly ResourceManager resourceManager = new ResourceManager("JSC", typeof (JScriptCompiler).Module.Assembly);
|
|
|
|
public int Run(string[] args)
|
|
{
|
|
this.exitCode = 0;
|
|
try
|
|
{
|
|
this.fPrintBanner = true;
|
|
this.fBannerPrinted = false;
|
|
this.fPrintTargets = false;
|
|
this.fHelp = false;
|
|
this.fUtf8Output = false;
|
|
this.targets = new ArrayList();
|
|
this.currentTarget = (CompilerOptions) null;
|
|
if (args.Length == 0)
|
|
{
|
|
this.PrintUsage();
|
|
return 0;
|
|
}
|
|
this.ParseArguments(args, false);
|
|
if (this.fUtf8Output)
|
|
Console.SetOut(TextWriter.Synchronized((TextWriter) new StreamWriter(Console.OpenStandardOutput(), (Encoding) new UTF8Encoding(false))
|
|
{
|
|
AutoFlush = true
|
|
}));
|
|
if (this.fHelp)
|
|
{
|
|
this.PrintUsage();
|
|
return 0;
|
|
}
|
|
foreach (CompilerOptions target in this.targets)
|
|
{
|
|
if (target.SourceFileNames.Count == 0)
|
|
throw new CmdLineException(CmdLineError.NoInputSourcesSpecified, JScriptCompiler.GetCultureInfo());
|
|
}
|
|
if (this.targets.Count > 1)
|
|
this.fPrintTargets = true;
|
|
this.PrintBanner();
|
|
foreach (CompilerOptions target in this.targets)
|
|
{
|
|
if (!target.fForceCodepage)
|
|
target.codepage = JScriptCompiler.GetCultureInfo().TextInfo.ANSICodePage;
|
|
if (target.strOutputFileName == null)
|
|
{
|
|
string withoutExtension = Path.GetFileNameWithoutExtension((string) target.SourceFileNames[0]);
|
|
target.strOutputFileName = withoutExtension + (target.PEFileKind == PEFileKinds.Dll ? ".dll" : ".exe");
|
|
}
|
|
if (!this.Compile(target))
|
|
this.exitCode = 10;
|
|
}
|
|
}
|
|
catch (CmdLineException ex)
|
|
{
|
|
this.PrintBanner();
|
|
Console.WriteLine(ex.Message);
|
|
this.exitCode = 10;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
this.PrintBanner();
|
|
Console.WriteLine("fatal error JS2999: " + ex.Message);
|
|
this.exitCode = 10;
|
|
}
|
|
return this.exitCode;
|
|
}
|
|
|
|
private void ParseArguments(string[] args, bool fromResponseFile)
|
|
{
|
|
int start = 0;
|
|
while (start < args.Length)
|
|
{
|
|
if (this.currentTarget == null)
|
|
this.currentTarget = new CompilerOptions();
|
|
int options = this.ParseOptions(args, start, fromResponseFile);
|
|
start = this.ParseSources(args, options);
|
|
if (!fromResponseFile || start < args.Length - 1)
|
|
{
|
|
this.targets.Add((object) this.currentTarget);
|
|
this.currentTarget = (CompilerOptions) null;
|
|
}
|
|
}
|
|
}
|
|
|
|
private int ParseOptions(string[] args, int start, bool fromResponseFile)
|
|
{
|
|
int options;
|
|
for (options = start; options < args.Length; ++options)
|
|
{
|
|
string str1 = args[options];
|
|
if (str1 != null && str1.Length != 0)
|
|
{
|
|
if ('@' == str1[0])
|
|
{
|
|
if (fromResponseFile)
|
|
throw new CmdLineException(CmdLineError.NestedResponseFiles, JScriptCompiler.GetCultureInfo());
|
|
string str2 = str1.Substring(1);
|
|
if (str2.Length == 0)
|
|
throw new CmdLineException(CmdLineError.NoFileName, args[options], JScriptCompiler.GetCultureInfo());
|
|
string[] args1 = File.Exists(str2) ? this.ReadResponseFile(str2) : throw new CmdLineException(CmdLineError.SourceNotFound, str2, JScriptCompiler.GetCultureInfo());
|
|
if (args1 != null)
|
|
this.ParseArguments(args1, true);
|
|
}
|
|
else
|
|
{
|
|
if ('-' == str1[0] || '/' == str1[0])
|
|
{
|
|
string option = str1.Substring(1);
|
|
if (option.Length >= 1)
|
|
{
|
|
switch (option[0])
|
|
{
|
|
case '?':
|
|
case 'H':
|
|
case 'h':
|
|
if (CmdLineOptionParser.IsSimpleOption(option, "?") || CmdLineOptionParser.IsSimpleOption(option, "help"))
|
|
{
|
|
this.fHelp = true;
|
|
continue;
|
|
}
|
|
break;
|
|
case 'A':
|
|
case 'a':
|
|
object obj1 = CmdLineOptionParser.IsBooleanOption(option, "autoref");
|
|
if (obj1 != null)
|
|
{
|
|
if ((bool) obj1)
|
|
{
|
|
this.currentTarget.autoRef = true;
|
|
this.currentTarget.autoRefSetExplicitly = true;
|
|
continue;
|
|
}
|
|
this.currentTarget.autoRef = false;
|
|
continue;
|
|
}
|
|
object obj2 = (object) CmdLineOptionParser.IsArgumentOption(option, "a.version", "assembly.version");
|
|
if (obj2 != null)
|
|
{
|
|
if (((string) obj2).Length == 0)
|
|
throw new CmdLineException(CmdLineError.MissingVersionInfo, JScriptCompiler.GetCultureInfo());
|
|
try
|
|
{
|
|
this.currentTarget.versionInfo = new Version((string) obj2);
|
|
continue;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.InvalidVersion, (string) obj2, JScriptCompiler.GetCultureInfo());
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
case 'C':
|
|
case 'c':
|
|
object obj3 = (object) CmdLineOptionParser.IsArgumentOption(option, "codepage");
|
|
if (obj3 != null)
|
|
{
|
|
if (((string) obj3).Length == 0)
|
|
throw new CmdLineException(CmdLineError.NoCodePage, args[options], JScriptCompiler.GetCultureInfo());
|
|
try
|
|
{
|
|
this.currentTarget.codepage = int.Parse((string) obj3, (IFormatProvider) CultureInfo.InvariantCulture);
|
|
this.currentTarget.fForceCodepage = true;
|
|
continue;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.InvalidCodePage, (string) obj3, JScriptCompiler.GetCultureInfo());
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
case 'D':
|
|
case 'd':
|
|
object obj4 = CmdLineOptionParser.IsBooleanOption(option, "debug");
|
|
if (obj4 != null)
|
|
{
|
|
this.currentTarget.fDebug = (bool) obj4;
|
|
continue;
|
|
}
|
|
object definitionList = (object) CmdLineOptionParser.IsArgumentOption(option, "d", "define");
|
|
if (definitionList != null)
|
|
{
|
|
IDictionaryEnumerator enumerator = this.GetAllDefines((string) definitionList).GetEnumerator();
|
|
try
|
|
{
|
|
while (enumerator.MoveNext())
|
|
{
|
|
DictionaryEntry current = (DictionaryEntry) enumerator.Current;
|
|
this.currentTarget.Defines[current.Key] = current.Value;
|
|
}
|
|
continue;
|
|
}
|
|
finally
|
|
{
|
|
if (enumerator is IDisposable disposable)
|
|
disposable.Dispose();
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
case 'F':
|
|
case 'f':
|
|
object obj5 = CmdLineOptionParser.IsBooleanOption(option, "fast");
|
|
if (obj5 != null)
|
|
{
|
|
this.currentTarget.fFast = (bool) obj5;
|
|
continue;
|
|
}
|
|
break;
|
|
case 'L':
|
|
case 'l':
|
|
object obj6 = (object) CmdLineOptionParser.IsArgumentOption(option, "lcid");
|
|
if (obj6 != null)
|
|
{
|
|
if (((string) obj6).Length == 0)
|
|
throw new CmdLineException(CmdLineError.NoLocaleID, args[options], JScriptCompiler.GetCultureInfo());
|
|
try
|
|
{
|
|
int culture = int.Parse((string) obj6, (IFormatProvider) CultureInfo.InvariantCulture);
|
|
CultureInfo cultureInfo = new CultureInfo(culture);
|
|
JScriptCompiler.LCID = culture;
|
|
continue;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.InvalidLocaleID, (string) obj6, JScriptCompiler.GetCultureInfo());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
object obj7 = (object) CmdLineOptionParser.IsArgumentOption(option, "lib");
|
|
if (obj7 != null)
|
|
{
|
|
string str3 = (string) obj7;
|
|
if (str3.Length == 0)
|
|
throw new CmdLineException(CmdLineError.MissingLibArgument, JScriptCompiler.GetCultureInfo());
|
|
this.currentTarget.libpath = str3.Replace(',', Path.PathSeparator) + (object) Path.PathSeparator + this.currentTarget.libpath;
|
|
continue;
|
|
}
|
|
object resinfo = (object) CmdLineOptionParser.IsArgumentOption(option, "linkres", "linkresource");
|
|
if (resinfo != null)
|
|
{
|
|
this.AddResourceFile(new ResInfo((string) resinfo, true));
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
case 'N':
|
|
case 'n':
|
|
if (CmdLineOptionParser.IsSimpleOption(option, "nologo"))
|
|
{
|
|
this.fPrintBanner = false;
|
|
continue;
|
|
}
|
|
object obj8 = CmdLineOptionParser.IsBooleanOption(option, "nostdlib");
|
|
if (obj8 != null)
|
|
{
|
|
this.currentTarget.fNoStdlib = (bool) obj8;
|
|
if ((bool) obj8 && !this.currentTarget.autoRefSetExplicitly)
|
|
{
|
|
this.currentTarget.autoRef = false;
|
|
continue;
|
|
}
|
|
continue;
|
|
}
|
|
break;
|
|
case 'O':
|
|
case 'o':
|
|
object path1 = (object) CmdLineOptionParser.IsArgumentOption(option, "out");
|
|
if (path1 != null)
|
|
{
|
|
try
|
|
{
|
|
if (Path.GetFileName((string) path1) == "")
|
|
throw new CmdLineException(CmdLineError.NoFileName, args[options], JScriptCompiler.GetCultureInfo());
|
|
}
|
|
catch (ArgumentException ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.NoFileName, args[options], JScriptCompiler.GetCultureInfo());
|
|
}
|
|
if (Path.GetExtension((string) path1) == "")
|
|
throw new CmdLineException(CmdLineError.MissingExtension, args[options], JScriptCompiler.GetCultureInfo());
|
|
this.currentTarget.strOutputFileName = this.currentTarget.strOutputFileName == null ? (string) path1 : throw new CmdLineException(CmdLineError.MultipleOutputNames, JScriptCompiler.GetCultureInfo());
|
|
continue;
|
|
}
|
|
break;
|
|
case 'P':
|
|
case 'p':
|
|
object obj9 = CmdLineOptionParser.IsBooleanOption(option, "print");
|
|
if (obj9 != null)
|
|
{
|
|
this.currentTarget.fPrint = (bool) obj9;
|
|
this.currentTarget.fPrintSetExplicitly = (bool) obj9;
|
|
continue;
|
|
}
|
|
break;
|
|
case 'R':
|
|
case 'r':
|
|
object fileList = (object) CmdLineOptionParser.IsArgumentOption(option, "r", "reference");
|
|
if (fileList != null)
|
|
{
|
|
StringEnumerator stringEnumerator = ((string) fileList).Length != 0 ? this.GetAllReferences((string) fileList).GetEnumerator() : throw new CmdLineException(CmdLineError.NoFileName, args[options], JScriptCompiler.GetCultureInfo());
|
|
try
|
|
{
|
|
while (stringEnumerator.MoveNext())
|
|
{
|
|
string current = stringEnumerator.Current;
|
|
bool flag = false;
|
|
foreach (string importFileName in this.currentTarget.ImportFileNames)
|
|
{
|
|
if (string.Compare(importFileName, current, true, CultureInfo.InvariantCulture) == 0)
|
|
{
|
|
flag = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!flag)
|
|
this.currentTarget.ImportFileNames.Add((object) current);
|
|
}
|
|
continue;
|
|
}
|
|
finally
|
|
{
|
|
if (stringEnumerator is IDisposable disposable)
|
|
disposable.Dispose();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
object resinfo = (object) CmdLineOptionParser.IsArgumentOption(option, "res", "resource");
|
|
if (resinfo != null)
|
|
{
|
|
this.AddResourceFile(new ResInfo((string) resinfo, false));
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
case 'T':
|
|
case 't':
|
|
object obj10 = (object) CmdLineOptionParser.IsArgumentOption(option, "t", "target");
|
|
if (obj10 != null)
|
|
{
|
|
if (this.currentTarget.fTargetSpecified)
|
|
throw new CmdLineException(CmdLineError.MultipleTargets, JScriptCompiler.GetCultureInfo());
|
|
if (string.Compare((string) obj10, "exe", true, CultureInfo.InvariantCulture) == 0)
|
|
{
|
|
this.currentTarget.fTargetSpecified = true;
|
|
this.currentTarget.PEFileKind = PEFileKinds.ConsoleApplication;
|
|
continue;
|
|
}
|
|
if (string.Compare((string) obj10, "winexe", true, CultureInfo.InvariantCulture) == 0)
|
|
{
|
|
this.currentTarget.fTargetSpecified = true;
|
|
this.currentTarget.PEFileKind = PEFileKinds.WindowApplication;
|
|
this.currentTarget.fPrint = this.currentTarget.fPrintSetExplicitly;
|
|
continue;
|
|
}
|
|
if (string.Compare((string) obj10, "library", true, CultureInfo.InvariantCulture) != 0)
|
|
throw new CmdLineException(CmdLineError.InvalidTarget, (string) obj10, JScriptCompiler.GetCultureInfo());
|
|
this.currentTarget.fTargetSpecified = true;
|
|
this.currentTarget.PEFileKind = PEFileKinds.Dll;
|
|
continue;
|
|
}
|
|
break;
|
|
case 'U':
|
|
case 'u':
|
|
object obj11 = CmdLineOptionParser.IsBooleanOption(option, "utf8output");
|
|
if (obj11 != null)
|
|
{
|
|
this.fUtf8Output = (bool) obj11;
|
|
continue;
|
|
}
|
|
break;
|
|
case 'V':
|
|
case 'v':
|
|
object obj12 = CmdLineOptionParser.IsBooleanOption(option, "VersionSafe");
|
|
if (obj12 != null)
|
|
{
|
|
this.currentTarget.fVersionSafe = (bool) obj12;
|
|
continue;
|
|
}
|
|
break;
|
|
case 'W':
|
|
case 'w':
|
|
object obj13 = (object) CmdLineOptionParser.IsArgumentOption(option, "w", "warn");
|
|
if (obj13 != null)
|
|
{
|
|
if (((string) obj13).Length == 0)
|
|
throw new CmdLineException(CmdLineError.NoWarningLevel, args[options], JScriptCompiler.GetCultureInfo());
|
|
if (1 == ((string) obj13).Length)
|
|
{
|
|
switch (((string) obj13)[0])
|
|
{
|
|
case '0':
|
|
this.currentTarget.nWarningLevel = 0;
|
|
continue;
|
|
case '1':
|
|
this.currentTarget.nWarningLevel = 1;
|
|
continue;
|
|
case '2':
|
|
this.currentTarget.nWarningLevel = 2;
|
|
continue;
|
|
case '3':
|
|
this.currentTarget.nWarningLevel = 3;
|
|
continue;
|
|
case '4':
|
|
this.currentTarget.nWarningLevel = 4;
|
|
continue;
|
|
}
|
|
}
|
|
throw new CmdLineException(CmdLineError.InvalidWarningLevel, args[options], JScriptCompiler.GetCultureInfo());
|
|
}
|
|
object obj14 = CmdLineOptionParser.IsBooleanOption(option, "warnaserror");
|
|
if (obj14 != null)
|
|
{
|
|
this.currentTarget.fTreatWarningsAsErrors = (bool) obj14;
|
|
continue;
|
|
}
|
|
object obj15 = (object) CmdLineOptionParser.IsArgumentOption(option, "win32res");
|
|
if (obj15 != null)
|
|
{
|
|
string path2 = (string) obj15;
|
|
if (path2.Length == 0)
|
|
throw new CmdLineException(CmdLineError.NoFileName, args[options], JScriptCompiler.GetCultureInfo());
|
|
if (!File.Exists(path2))
|
|
throw new CmdLineException(CmdLineError.ResourceNotFound, args[options], JScriptCompiler.GetCultureInfo());
|
|
this.currentTarget.Win32Resource = this.currentTarget.Win32Resource == null ? path2 : throw new CmdLineException(CmdLineError.MultipleWin32Resources, JScriptCompiler.GetCultureInfo());
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
throw new CmdLineException(CmdLineError.UnknownOption, args[options], JScriptCompiler.GetCultureInfo());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return options;
|
|
}
|
|
|
|
private int ParseSources(string[] args, int start)
|
|
{
|
|
int sources;
|
|
for (sources = start; sources < args.Length; ++sources)
|
|
{
|
|
if (args[sources].Length != 0)
|
|
{
|
|
if ('-' != args[sources][0])
|
|
{
|
|
if ('/' != args[sources][0])
|
|
{
|
|
try
|
|
{
|
|
if (Path.GetFileName(args[sources]) == "")
|
|
throw new CmdLineException(CmdLineError.InvalidSourceFile, args[sources], JScriptCompiler.GetCultureInfo());
|
|
}
|
|
catch (ArgumentException ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.InvalidSourceFile, args[sources], JScriptCompiler.GetCultureInfo());
|
|
}
|
|
foreach (string importFileName in this.currentTarget.ImportFileNames)
|
|
{
|
|
if (string.Compare(importFileName, args[sources], true, CultureInfo.InvariantCulture) == 0)
|
|
throw new CmdLineException(CmdLineError.DuplicateFileAsSourceAndAssembly, args[sources], JScriptCompiler.GetCultureInfo());
|
|
}
|
|
foreach (string sourceFileName in this.currentTarget.SourceFileNames)
|
|
{
|
|
if (string.Compare(sourceFileName, args[sources], true, CultureInfo.InvariantCulture) == 0)
|
|
throw new CmdLineException(CmdLineError.DuplicateSourceFile, args[sources], JScriptCompiler.GetCultureInfo());
|
|
}
|
|
this.currentTarget.SourceFileNames.Add((object) args[sources]);
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
return sources;
|
|
}
|
|
|
|
private bool Compile(CompilerOptions options)
|
|
{
|
|
if (this.fPrintTargets)
|
|
Console.WriteLine(JScriptCompiler.Localize("Compiling", options.strOutputFileName));
|
|
VsaEngine engine = new VsaEngine();
|
|
if (engine == null)
|
|
throw new CmdLineException(CmdLineError.CannotCreateEngine, JScriptCompiler.GetCultureInfo());
|
|
engine.InitVsaEngine("JSC://Microsoft.JScript.Vsa.VsaEngine", (IVsaSite) new EngineSite(options));
|
|
((BaseVsaEngine) engine).LCID = JScriptCompiler.LCID;
|
|
((BaseVsaEngine) engine).GenerateDebugInfo = options.fDebug;
|
|
((BaseVsaEngine) engine).SetOption("AutoRef", (object) options.autoRef);
|
|
((BaseVsaEngine) engine).SetOption("fast", (object) options.fFast);
|
|
((BaseVsaEngine) engine).SetOption("output", (object) options.strOutputFileName);
|
|
((BaseVsaEngine) engine).SetOption("PEFileKind", (object) options.PEFileKind);
|
|
((BaseVsaEngine) engine).SetOption("print", (object) options.fPrint);
|
|
((BaseVsaEngine) engine).SetOption("libpath", (object) options.libpath);
|
|
if (options.versionInfo != (Version) null)
|
|
((BaseVsaEngine) engine).SetOption("version", (object) options.versionInfo);
|
|
((BaseVsaEngine) engine).SetOption("VersionSafe", (object) options.fVersionSafe);
|
|
((BaseVsaEngine) engine).SetOption("defines", (object) options.Defines);
|
|
((BaseVsaEngine) engine).SetOption("warnaserror", (object) options.fTreatWarningsAsErrors);
|
|
((BaseVsaEngine) engine).SetOption("WarningLevel", (object) options.nWarningLevel);
|
|
if (options.Win32Resource != null)
|
|
((BaseVsaEngine) engine).SetOption("win32resource", (object) options.Win32Resource);
|
|
if (options.ManagedResources.Count > 0)
|
|
((BaseVsaEngine) engine).SetOption("managedResources", (object) options.ManagedResources.Values);
|
|
bool flag1 = false;
|
|
bool flag2 = false;
|
|
foreach (string importFileName in options.ImportFileNames)
|
|
{
|
|
this.AddAssemblyReference((IVsaEngine) engine, importFileName);
|
|
string fileName = Path.GetFileName(importFileName);
|
|
if (string.Compare(fileName, "mscorlib.dll", true, CultureInfo.InvariantCulture) == 0)
|
|
flag1 = true;
|
|
else if (string.Compare(fileName, "System.Windows.Forms.dll", true, CultureInfo.InvariantCulture) == 0)
|
|
flag2 = true;
|
|
}
|
|
if (!options.fNoStdlib && !flag1)
|
|
this.AddAssemblyReference((IVsaEngine) engine, "mscorlib.dll");
|
|
if (options.PEFileKind == PEFileKinds.WindowApplication && !options.fNoStdlib && !flag2)
|
|
this.AddAssemblyReference((IVsaEngine) engine, "System.Windows.Forms.dll");
|
|
for (int index = 0; index < options.SourceFileNames.Count; ++index)
|
|
this.AddSourceFile((IVsaEngine) engine, (string) options.SourceFileNames[index], options.codepage, options.fForceCodepage);
|
|
try
|
|
{
|
|
return ((BaseVsaEngine) engine).Compile();
|
|
}
|
|
catch (VsaException ex)
|
|
{
|
|
if (ex.ErrorCode == -2146226172)
|
|
{
|
|
if (((Exception) ex).InnerException != null && ((Exception) ex).InnerException is BadImageFormatException)
|
|
Console.WriteLine(new CmdLineException(CmdLineError.InvalidAssembly, ((Exception) ex).Message, JScriptCompiler.GetCultureInfo()).Message);
|
|
else if (((Exception) ex).InnerException != null && (((Exception) ex).InnerException is FileNotFoundException || ((Exception) ex).InnerException is FileLoadException))
|
|
Console.WriteLine(new CmdLineException(CmdLineError.AssemblyNotFound, ((Exception) ex).Message, JScriptCompiler.GetCultureInfo()).Message);
|
|
else
|
|
Console.WriteLine(new CmdLineException(CmdLineError.InvalidAssembly, JScriptCompiler.GetCultureInfo()).Message);
|
|
}
|
|
else if (ex.ErrorCode == -2146226123)
|
|
Console.WriteLine(new CmdLineException(CmdLineError.ErrorSavingCompiledState, ((Exception) ex).Message, JScriptCompiler.GetCultureInfo()).Message);
|
|
else if (ex.ErrorCode == -2146226171 && ((Exception) ex).InnerException != null)
|
|
{
|
|
Console.WriteLine(new CmdLineException(CmdLineError.InvalidCharacters, ((Exception) ex).Message, JScriptCompiler.GetCultureInfo()).Message);
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine(JScriptCompiler.Localize("INTERNAL COMPILER ERROR"));
|
|
Console.WriteLine((object) ex);
|
|
}
|
|
return false;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(JScriptCompiler.Localize("INTERNAL COMPILER ERROR"));
|
|
Console.WriteLine((object) ex);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private void AddAssemblyReference(IVsaEngine engine, string fileName) => ((IVsaReferenceItem) engine.Items.CreateItem(fileName, (VsaItemType) 0, (VsaItemFlag) 0)).AssemblyName = fileName;
|
|
|
|
private void AddSourceFile(
|
|
IVsaEngine engine,
|
|
string fileName,
|
|
int codepage,
|
|
bool fForceCodepage)
|
|
{
|
|
string str = "$SourceFile_" + (object) this.codeItemCounter++;
|
|
IVsaCodeItem ivsaCodeItem = (IVsaCodeItem) engine.Items.CreateItem(str, (VsaItemType) 2, (VsaItemFlag) 0);
|
|
((IVsaItem) ivsaCodeItem).SetOption("codebase", (object) fileName);
|
|
ivsaCodeItem.SourceText = this.ReadFile(fileName, codepage, fForceCodepage);
|
|
}
|
|
|
|
private void AddResourceFile(ResInfo resinfo)
|
|
{
|
|
if (!File.Exists(resinfo.fullpath))
|
|
throw new CmdLineException(CmdLineError.ManagedResourceNotFound, resinfo.filename, JScriptCompiler.GetCultureInfo());
|
|
if (this.currentTarget.ManagedResourceFileNames[(object) resinfo.fullpath] != null)
|
|
throw new CmdLineException(CmdLineError.DuplicateResourceFile, resinfo.filename, JScriptCompiler.GetCultureInfo());
|
|
if (this.currentTarget.ManagedResources[(object) resinfo.name] != null)
|
|
throw new CmdLineException(CmdLineError.DuplicateResourceName, resinfo.name, JScriptCompiler.GetCultureInfo());
|
|
this.currentTarget.ManagedResources[(object) resinfo.name] = (object) resinfo;
|
|
this.currentTarget.ManagedResourceFileNames[(object) resinfo.fullpath] = (object) resinfo;
|
|
}
|
|
|
|
internal void PrintBanner() => this.PrintBanner((CultureInfo) null);
|
|
|
|
internal void PrintBanner(CultureInfo culture)
|
|
{
|
|
if (this.fBannerPrinted || !this.fPrintBanner)
|
|
return;
|
|
string str1 = 7.ToString() + "." + 10.ToString((IFormatProvider) CultureInfo.InvariantCulture).PadLeft(2, '0') + "." + 3052.ToString((IFormatProvider) CultureInfo.InvariantCulture).PadLeft(4, '0');
|
|
Version version = Environment.Version;
|
|
object[] objArray1 = new object[5]
|
|
{
|
|
(object) version.Major,
|
|
(object) ".",
|
|
null,
|
|
null,
|
|
null
|
|
};
|
|
object[] objArray2 = objArray1;
|
|
int num = version.Minor;
|
|
string str2 = num.ToString((IFormatProvider) CultureInfo.InvariantCulture);
|
|
objArray2[2] = (object) str2;
|
|
objArray1[3] = (object) ".";
|
|
object[] objArray3 = objArray1;
|
|
num = version.Build;
|
|
string str3 = num.ToString((IFormatProvider) CultureInfo.InvariantCulture).PadLeft(4, '0');
|
|
objArray3[4] = (object) str3;
|
|
string str4 = string.Concat(objArray1);
|
|
this.fBannerPrinted = true;
|
|
Console.WriteLine(string.Format(JScriptCompiler.Localize("Banner line 1", culture), (object) str1));
|
|
Console.WriteLine(string.Format(JScriptCompiler.Localize("Banner line 2", culture), (object) str4));
|
|
Console.WriteLine(JScriptCompiler.Localize("Banner line 3", culture) + "\r\n");
|
|
}
|
|
|
|
internal void PrintUsage()
|
|
{
|
|
CultureInfo cultureInfo = JScriptCompiler.GetCultureInfo();
|
|
this.PrintBanner(cultureInfo);
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage format", cultureInfo));
|
|
Console.WriteLine();
|
|
Console.Write(" ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage options", cultureInfo));
|
|
Console.WriteLine("");
|
|
Console.Write(" ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Output Files", cultureInfo));
|
|
Console.Write(" /out:<file> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /out", cultureInfo));
|
|
Console.Write(" /t[arget]:exe ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /t:exe", cultureInfo));
|
|
Console.Write(" /t[arget]:winexe ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /t:winexe", cultureInfo));
|
|
Console.Write(" /t[arget]:library ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /t:library", cultureInfo));
|
|
Console.WriteLine();
|
|
Console.Write(" ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Input Files", cultureInfo));
|
|
Console.Write(" /autoref[+|-] ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /autoref", cultureInfo));
|
|
Console.Write(" /lib:<path> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /lib", cultureInfo));
|
|
Console.Write(" /r[eference]:<file list> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /reference", cultureInfo));
|
|
Console.Write(" ");
|
|
Console.WriteLine("<file list>: <assembly name>[;<assembly name>...]");
|
|
Console.WriteLine();
|
|
Console.Write(" ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Resources", cultureInfo));
|
|
Console.Write(" /win32res:<file> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /win32res", cultureInfo));
|
|
Console.Write(" /res[ource]:<info> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /resource", cultureInfo));
|
|
Console.WriteLine(" <info>: <filename>[,<name>[,public|private]]");
|
|
Console.Write(" /linkres[ource]:<info> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /linkresource", cultureInfo));
|
|
Console.WriteLine(" <info>: <filename>[,<name>[,public|private]]");
|
|
Console.WriteLine();
|
|
Console.Write(" ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Code Generation", cultureInfo));
|
|
Console.Write(" /debug[+|-] ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /debug", cultureInfo));
|
|
Console.Write(" /fast[+|-] ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /fast", cultureInfo));
|
|
Console.Write(" /warnaserror[+|-] ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /warnaserror", cultureInfo));
|
|
Console.Write(" /w[arn]:<level> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /warn", cultureInfo));
|
|
Console.WriteLine();
|
|
Console.Write(" ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Miscellaneous", cultureInfo));
|
|
Console.Write(" @<filename> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage @file", cultureInfo));
|
|
Console.Write(" /? ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /?", cultureInfo));
|
|
Console.Write(" /help ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /?", cultureInfo));
|
|
Console.Write(" /d[efine]:<symbols> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /define", cultureInfo));
|
|
Console.Write(" /nologo ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /nologo", cultureInfo));
|
|
Console.Write(" /print[+|-] ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /print", cultureInfo));
|
|
Console.WriteLine();
|
|
Console.Write(" ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Advanced", cultureInfo));
|
|
Console.Write(" /codepage:<id> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /codepage", cultureInfo));
|
|
Console.Write(" /lcid:<id> ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /lcid", cultureInfo));
|
|
Console.Write(" /nostdlib[+|-] ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /nostdlib", cultureInfo));
|
|
Console.Write(" /utf8output[+|-] ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /utf8output", cultureInfo));
|
|
Console.Write(" /versionsafe[+|-] ");
|
|
Console.WriteLine(JScriptCompiler.Localize("Usage /versionsafe", cultureInfo));
|
|
Console.WriteLine();
|
|
}
|
|
|
|
internal static void PrintError(
|
|
string sourceFile,
|
|
int line,
|
|
int column,
|
|
bool fIsWarning,
|
|
int number,
|
|
string message)
|
|
{
|
|
string str = (10000 + (number & (int) ushort.MaxValue)).ToString((IFormatProvider) CultureInfo.InvariantCulture).Substring(1);
|
|
if (string.Compare(sourceFile, "no source") != 0)
|
|
Console.Write(sourceFile + "(" + (object) line + "," + (object) column + ") : ");
|
|
Console.WriteLine((fIsWarning ? "warning JS" : "error JS") + str + ": " + message);
|
|
}
|
|
|
|
private int GetArgumentSeparatorIndex(string argList, int startIndex)
|
|
{
|
|
int num1 = argList.IndexOf(",", startIndex);
|
|
int num2 = argList.IndexOf(";", startIndex);
|
|
return num1 == -1 || num2 != -1 && num1 >= num2 ? num2 : num1;
|
|
}
|
|
|
|
private Hashtable GetAllDefines(string definitionList)
|
|
{
|
|
Hashtable definitions = new Hashtable();
|
|
int startIndex = 0;
|
|
int argumentSeparatorIndex;
|
|
do
|
|
{
|
|
argumentSeparatorIndex = this.GetArgumentSeparatorIndex(definitionList, startIndex);
|
|
this.AddDefinition(argumentSeparatorIndex != -1 ? definitionList.Substring(startIndex, argumentSeparatorIndex - startIndex) : definitionList.Substring(startIndex), definitions);
|
|
startIndex = argumentSeparatorIndex + 1;
|
|
}
|
|
while (argumentSeparatorIndex > -1);
|
|
return definitions;
|
|
}
|
|
|
|
private StringCollection GetAllReferences(string fileList)
|
|
{
|
|
StringCollection allReferences = new StringCollection();
|
|
int startIndex = 0;
|
|
int argumentSeparatorIndex;
|
|
do
|
|
{
|
|
argumentSeparatorIndex = this.GetArgumentSeparatorIndex(fileList, startIndex);
|
|
string str = argumentSeparatorIndex != -1 ? fileList.Substring(startIndex, argumentSeparatorIndex - startIndex).Trim() : fileList.Substring(startIndex).Trim();
|
|
if (str.Length == 0)
|
|
throw new CmdLineException(CmdLineError.MissingReference, fileList, JScriptCompiler.GetCultureInfo());
|
|
allReferences.Add(str);
|
|
startIndex = argumentSeparatorIndex + 1;
|
|
}
|
|
while (argumentSeparatorIndex > -1);
|
|
return allReferences;
|
|
}
|
|
|
|
private void AddDefinition(string def, Hashtable definitions)
|
|
{
|
|
int length = def.IndexOf("=");
|
|
string str1;
|
|
object obj;
|
|
if (length == -1)
|
|
{
|
|
str1 = def.Trim();
|
|
obj = (object) true;
|
|
}
|
|
else
|
|
{
|
|
str1 = def.Substring(0, length).Trim();
|
|
string str2 = def.Substring(length + 1).Trim();
|
|
if (string.Compare(str2, "true", true, CultureInfo.InvariantCulture) == 0)
|
|
obj = (object) true;
|
|
else if (string.Compare(str2, "false", true, CultureInfo.InvariantCulture) == 0)
|
|
{
|
|
obj = (object) false;
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
obj = (object) int.Parse(str2, (IFormatProvider) CultureInfo.InvariantCulture);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.InvalidDefinition, str1, JScriptCompiler.GetCultureInfo());
|
|
}
|
|
}
|
|
}
|
|
if (str1.Length == 0)
|
|
throw new CmdLineException(CmdLineError.MissingDefineArgument, JScriptCompiler.GetCultureInfo());
|
|
if (str1[0] == '_' && (str1.CompareTo("_debug") == 0 || str1.CompareTo("_fast") == 0 || str1.CompareTo("_jscript") == 0 || str1.CompareTo("_jscript_build") == 0 || str1.CompareTo("_jscript_version") == 0 || str1.CompareTo("_microsoft") == 0 || str1.CompareTo("_win32") == 0 || str1.CompareTo("_x86") == 0))
|
|
throw new CmdLineException(CmdLineError.CompilerConstant, str1, JScriptCompiler.GetCultureInfo());
|
|
definitions[(object) str1] = obj;
|
|
}
|
|
|
|
internal string ReadFile(string fileName, int codepage, bool fForceCodepage)
|
|
{
|
|
FileStream fileStream;
|
|
try
|
|
{
|
|
fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
}
|
|
catch (ArgumentException ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.InvalidCharacters, fileName, JScriptCompiler.GetCultureInfo());
|
|
}
|
|
catch (DirectoryNotFoundException ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.SourceNotFound, fileName, JScriptCompiler.GetCultureInfo());
|
|
}
|
|
catch (FileNotFoundException ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.SourceNotFound, fileName, JScriptCompiler.GetCultureInfo());
|
|
}
|
|
long length = fileStream.Length;
|
|
if (length == 0L)
|
|
return "";
|
|
Encoding encoding;
|
|
try
|
|
{
|
|
encoding = Encoding.GetEncoding(codepage);
|
|
}
|
|
catch (ArgumentException ex)
|
|
{
|
|
throw new CmdLineException(CmdLineError.InvalidCodePage, codepage.ToString((IFormatProvider) CultureInfo.InvariantCulture), JScriptCompiler.GetCultureInfo());
|
|
}
|
|
StreamReader streamReader = new StreamReader((Stream) fileStream, encoding, true);
|
|
if (length > (long) int.MaxValue)
|
|
throw new CmdLineException(CmdLineError.SourceFileTooBig, JScriptCompiler.GetCultureInfo());
|
|
return streamReader.ReadToEnd();
|
|
}
|
|
|
|
private string[] ReadResponseFile(string strFileName)
|
|
{
|
|
FileStream fileStream = new FileStream(strFileName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
if (fileStream.Length == 0L)
|
|
return (string[]) null;
|
|
StreamReader streamReader = new StreamReader((Stream) fileStream);
|
|
string input = streamReader.ReadLine();
|
|
Regex regex = new Regex("\\s*([^\\s\\\"]|(\\\"[^\\\"\\n]*\\\"))+");
|
|
StringCollection stringCollection = new StringCollection();
|
|
for (; input != null; input = streamReader.ReadLine())
|
|
{
|
|
if (!input.Trim().StartsWith("#"))
|
|
{
|
|
MatchCollection matchCollection = regex.Matches(input);
|
|
if (matchCollection != null && matchCollection.Count != 0)
|
|
{
|
|
foreach (Capture capture in matchCollection)
|
|
{
|
|
string str = capture.ToString().Trim();
|
|
int startIndex = 0;
|
|
while ((startIndex = str.IndexOf("\"", startIndex)) != -1)
|
|
{
|
|
if (startIndex == 0)
|
|
str = str.Substring(1);
|
|
else if (str[startIndex - 1] == '\\')
|
|
++startIndex;
|
|
else
|
|
str = str.Remove(startIndex, 1);
|
|
}
|
|
stringCollection.Add(str);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (stringCollection.Count == 0)
|
|
return (string[]) null;
|
|
string[] array = new string[stringCollection.Count];
|
|
stringCollection.CopyTo(array, 0);
|
|
return array;
|
|
}
|
|
|
|
internal static string Localize(string s) => JScriptCompiler.Localize(s, (string) null, (CultureInfo) null);
|
|
|
|
internal static string Localize(string s, string context) => JScriptCompiler.Localize(s, context, (CultureInfo) null);
|
|
|
|
internal static string Localize(string s, CultureInfo culture) => JScriptCompiler.Localize(s, (string) null, culture);
|
|
|
|
internal static string Localize(string s, string context, CultureInfo culture)
|
|
{
|
|
try
|
|
{
|
|
if (culture == null)
|
|
culture = JScriptCompiler.GetCultureInfo();
|
|
string str = JScriptCompiler.resourceManager.GetString(s, culture);
|
|
if (str != null)
|
|
{
|
|
int length = str.IndexOf(JScriptCompiler.ContextStringDelimiter);
|
|
if (length == -1)
|
|
return str;
|
|
return context != null ? string.Format(str.Substring(length + 2), (object) context) : str.Substring(0, length);
|
|
}
|
|
}
|
|
catch (MissingManifestResourceException ex)
|
|
{
|
|
}
|
|
return s;
|
|
}
|
|
|
|
internal static CultureInfo GetCultureInfo()
|
|
{
|
|
CultureInfo cultureInfo = (CultureInfo) null;
|
|
try
|
|
{
|
|
cultureInfo = new CultureInfo(JScriptCompiler.LCID);
|
|
}
|
|
catch (ArgumentException ex)
|
|
{
|
|
}
|
|
return cultureInfo ?? CultureInfo.CurrentUICulture;
|
|
}
|
|
}
|