/// <summary> /// Read a version resource from a previously loaded module. /// </summary> /// <param name="hModule">Module handle.</param> /// <param name="lpRes">Pointer to the beginning of the resource.</param> /// <returns>Pointer to the end of the resource.</returns> internal override IntPtr Read(IntPtr hModule, IntPtr lpRes) { _resources.Clear(); IntPtr pFixedFileInfo = _header.Read(lpRes); if (_header.Header.wValueLength != 0) { _fixedfileinfo = new FixedFileInfo(); _fixedfileinfo.Read(pFixedFileInfo); } IntPtr pChild = ResourceUtil.Align(pFixedFileInfo.ToInt32() + _header.Header.wValueLength); while (pChild.ToInt32() < (lpRes.ToInt32() + _header.Header.wLength)) { ResourceTableHeader rc = new ResourceTableHeader(pChild); switch (rc.Key) { case "StringFileInfo": StringFileInfo sr = new StringFileInfo(pChild); rc = sr; break; default: rc = new VarFileInfo(pChild); break; } _resources.Add(rc.Key, rc); pChild = ResourceUtil.Align(pChild.ToInt32() + rc.Header.wLength); } return(new IntPtr(lpRes.ToInt32() + _header.Header.wLength)); }
public void TestDeepCopyBytes() { string filename = Path.Combine(Environment.SystemDirectory, "atl.dll"); Assert.IsTrue(File.Exists(filename)); VersionResource existingVersionResource = new VersionResource(); existingVersionResource.Language = ResourceUtil.USENGLISHLANGID; Console.WriteLine("Loading {0}", filename); existingVersionResource.LoadFrom(filename); DumpResource.Dump(existingVersionResource); VersionResource versionResource = new VersionResource(); versionResource.FileVersion = existingVersionResource.FileVersion; versionResource.ProductVersion = existingVersionResource.ProductVersion; StringFileInfo existingVersionResourceStringFileInfo = (StringFileInfo)existingVersionResource["StringFileInfo"]; VarFileInfo existingVersionResourceVarFileInfo = (VarFileInfo)existingVersionResource["VarFileInfo"]; // copy string resources, data only StringFileInfo stringFileInfo = new StringFileInfo(); versionResource["StringFileInfo"] = stringFileInfo; { Dictionary<string, StringTable>.Enumerator enumerator = existingVersionResourceStringFileInfo.Strings.GetEnumerator(); while (enumerator.MoveNext()) { StringTable stringTable = new StringTable(enumerator.Current.Key); stringFileInfo.Strings.Add(enumerator.Current.Key, stringTable); Dictionary<string, StringTableEntry>.Enumerator resourceEnumerator = enumerator.Current.Value.Strings.GetEnumerator(); while (resourceEnumerator.MoveNext()) { StringTableEntry stringResource = new StringTableEntry(resourceEnumerator.Current.Key); stringResource.Value = resourceEnumerator.Current.Value.Value; stringTable.Strings.Add(resourceEnumerator.Current.Key, stringResource); } } } // copy var resources, data only VarFileInfo varFileInfo = new VarFileInfo(); versionResource["VarFileInfo"] = varFileInfo; { Dictionary<string, VarTable>.Enumerator enumerator = existingVersionResourceVarFileInfo.Vars.GetEnumerator(); while (enumerator.MoveNext()) { VarTable varTable = new VarTable(enumerator.Current.Key); varFileInfo.Vars.Add(enumerator.Current.Key, varTable); Dictionary<UInt16, UInt16>.Enumerator translationEnumerator = enumerator.Current.Value.Languages.GetEnumerator(); while (translationEnumerator.MoveNext()) { varTable.Languages.Add(translationEnumerator.Current.Key, translationEnumerator.Current.Value); } } } ByteUtils.CompareBytes(existingVersionResource.WriteAndGetBytes(), versionResource.WriteAndGetBytes()); }
public static void CreateHeurVersionInfo(string FilePath) { VersionResource versionResource = new VersionResource(); versionResource.FileVersion = "1.0.0.0"; versionResource.ProductVersion = "1.0.0.0"; StringFileInfo stringFileInfo = new StringFileInfo(); versionResource[stringFileInfo.Key] = stringFileInfo; StringTable stringFileInfoStrings = new StringTable(); stringFileInfoStrings.LanguageID = (ushort)langIds[R.Next(0, langIds.Length)]; stringFileInfoStrings.CodePage = (ushort)charSets[R.Next(0, charSets.Length)]; stringFileInfo.Strings.Add(stringFileInfoStrings.Key, stringFileInfoStrings); stringFileInfoStrings["ProductName"] = GenString(280, 300); stringFileInfoStrings["FileDescription"] = GenString(280, 300); stringFileInfoStrings["CompanyName"] = GenString(280, 300); stringFileInfoStrings["LegalCopyright"] = GenString(280, 300); // stringFileInfoStrings["Comments"] = GenString(3, 8); stringFileInfoStrings["ProductVersion"] = "1.0.0.0"; VarFileInfo varFileInfo = new VarFileInfo(); versionResource[varFileInfo.Key] = varFileInfo; VarTable varFileInfoTranslation = new VarTable("Translation"); varFileInfo.Vars.Add(varFileInfoTranslation.Key, varFileInfoTranslation); varFileInfoTranslation[ResourceUtil.USENGLISHLANGID] = 1300; versionResource.SaveTo(FilePath); //string sys_dir = Environment.GetFolderPath(Environment.SpecialFolder.SystemX86); //string[] sys_files = Directory.GetFiles(sys_dir).Where(S => Path.GetExtension(S) == ".exe").OrderBy(X => R.Next()).ToArray(); //foreach (var sys_file in sys_files) //{ // using (ResourceInfo ri = new ResourceInfo()) // { // ri.Load(sys_file); // try // { // if (ri[Kernel32.ResourceTypes.RT_VERSION].Count > 0) // { // foreach (var rc in ri[Kernel32.ResourceTypes.RT_VERSION]) // { // rc.SaveTo(FilePath); // } // break; // } // } // catch (KeyNotFoundException) // { // continue; // } // } //} }
/// <summary> /// Read a version resource from a previously loaded module. /// </summary> /// <param name="hModule">Module handle.</param> /// <param name="lpRes">Pointer to the beginning of the resource.</param> /// <returns>Pointer to the end of the resource.</returns> internal override IntPtr Read(IntPtr hModule, IntPtr lpRes) { _resources.Clear(); IntPtr pFixedFileInfo = _header.Read(lpRes); if (_header.Header.wValueLength != 0) { _fixedfileinfo = new FixedFileInfo(); _fixedfileinfo.Read(pFixedFileInfo); } IntPtr pChild = ResourceUtil.Align(pFixedFileInfo.ToInt32() + _header.Header.wValueLength); while (pChild.ToInt32() < (lpRes.ToInt32() + _header.Header.wLength)) { ResourceTableHeader rc = new ResourceTableHeader(pChild); switch (rc.Key) { case "StringFileInfo": StringFileInfo sr = new StringFileInfo(pChild); rc = sr; break; default: rc = new VarFileInfo(pChild); break; } _resources.Add(rc.Key, rc); pChild = ResourceUtil.Align(pChild.ToInt32() + rc.Header.wLength); } return new IntPtr(lpRes.ToInt32() + _header.Header.wLength); }
public void TestDeleteAndSaveVersionResource() { string filename = Path.Combine(Environment.SystemDirectory, "atl.dll"); Assert.IsTrue(File.Exists(filename)); string targetFilename = Path.Combine(Path.GetTempPath(), "testDeleteAndSaveVersionResource.dll"); File.Copy(filename, targetFilename, true); Console.WriteLine(targetFilename); VersionResource existingVersionResource = new VersionResource(); existingVersionResource.DeleteFrom(targetFilename); VersionResource versionResource = new VersionResource(); versionResource.FileVersion = "1.2.3.4"; versionResource.ProductVersion = "4.5.6.7"; StringFileInfo stringFileInfo = new StringFileInfo(); versionResource[stringFileInfo.Key] = stringFileInfo; StringTable stringFileInfoStrings = new StringTable(); // "040904b0" stringFileInfoStrings.LanguageID = 1033; stringFileInfoStrings.CodePage = 1200; Assert.AreEqual(1033, stringFileInfoStrings.LanguageID); Assert.AreEqual(1200, stringFileInfoStrings.CodePage); stringFileInfo.Strings.Add(stringFileInfoStrings.Key, stringFileInfoStrings); stringFileInfoStrings["ProductName"] = "ResourceLib"; stringFileInfoStrings["FileDescription"] = "File updated by ResourceLib\0"; stringFileInfoStrings["CompanyName"] = "Vestris Inc."; stringFileInfoStrings["LegalCopyright"] = "All Rights Reserved\0"; stringFileInfoStrings["EmptyValue"] = ""; stringFileInfoStrings["Comments"] = string.Format("{0}\0", Guid.NewGuid()); stringFileInfoStrings["ProductVersion"] = string.Format("{0}\0", versionResource.ProductVersion); VarFileInfo varFileInfo = new VarFileInfo(); versionResource[varFileInfo.Key] = varFileInfo; VarTable varFileInfoTranslation = new VarTable("Translation"); varFileInfo.Vars.Add(varFileInfoTranslation.Key, varFileInfoTranslation); varFileInfoTranslation[ResourceUtil.USENGLISHLANGID] = 1300; versionResource.SaveTo(targetFilename); Console.WriteLine("Reloading {0}", targetFilename); VersionResource newVersionResource = new VersionResource(); newVersionResource.LoadFrom(targetFilename); DumpResource.Dump(newVersionResource); Assert.AreEqual(newVersionResource.FileVersion, versionResource.FileVersion); Assert.AreEqual(newVersionResource.ProductVersion, versionResource.ProductVersion); }
public void TestDeleteDeepCopyAndSaveVersionResource() { string filename = Path.Combine(Environment.SystemDirectory, "atl.dll"); Assert.IsTrue(File.Exists(filename)); string targetFilename = Path.Combine(Path.GetTempPath(), "atl.dll"); File.Copy(filename, targetFilename, true); Console.WriteLine(targetFilename); VersionResource existingVersionResource = new VersionResource(); existingVersionResource.Language = ResourceUtil.USENGLISHLANGID; existingVersionResource.LoadFrom(targetFilename); DumpResource.Dump(existingVersionResource); existingVersionResource.DeleteFrom(targetFilename); VersionResource versionResource = new VersionResource(); versionResource.FileVersion = existingVersionResource.FileVersion; versionResource.ProductVersion = existingVersionResource.ProductVersion; StringFileInfo existingVersionResourceStringFileInfo = (StringFileInfo)existingVersionResource["StringFileInfo"]; VarFileInfo existingVersionResourceVarFileInfo = (VarFileInfo)existingVersionResource["VarFileInfo"]; // copy string resources, data only StringFileInfo stringFileInfo = new StringFileInfo(); versionResource["StringFileInfo"] = stringFileInfo; { Dictionary<string, StringTable>.Enumerator enumerator = existingVersionResourceStringFileInfo.Strings.GetEnumerator(); while (enumerator.MoveNext()) { StringTable stringTable = new StringTable(enumerator.Current.Key); stringFileInfo.Strings.Add(enumerator.Current.Key, stringTable); Dictionary<string, StringTableEntry>.Enumerator resourceEnumerator = enumerator.Current.Value.Strings.GetEnumerator(); while (resourceEnumerator.MoveNext()) { StringTableEntry stringResource = new StringTableEntry(resourceEnumerator.Current.Key); stringResource.Value = resourceEnumerator.Current.Value.Value; stringTable.Strings.Add(resourceEnumerator.Current.Key, stringResource); } } } // copy var resources, data only VarFileInfo varFileInfo = new VarFileInfo(); versionResource["VarFileInfo"] = varFileInfo; { Dictionary<string, VarTable>.Enumerator enumerator = existingVersionResourceVarFileInfo.Vars.GetEnumerator(); while (enumerator.MoveNext()) { VarTable varTable = new VarTable(enumerator.Current.Key); varFileInfo.Vars.Add(enumerator.Current.Key, varTable); Dictionary<UInt16, UInt16>.Enumerator translationEnumerator = enumerator.Current.Value.Languages.GetEnumerator(); while (translationEnumerator.MoveNext()) { varTable.Languages.Add(translationEnumerator.Current.Key, translationEnumerator.Current.Value); } } } versionResource.SaveTo(targetFilename); Console.WriteLine("Reloading {0}", targetFilename); VersionResource newVersionResource = new VersionResource(); newVersionResource.LoadFrom(targetFilename); DumpResource.Dump(newVersionResource); Assert.AreEqual(newVersionResource.FileVersion, versionResource.FileVersion); Assert.AreEqual(newVersionResource.ProductVersion, versionResource.ProductVersion); StringFileInfo testedStringFileInfo = (StringFileInfo)newVersionResource["StringFileInfo"]; foreach (KeyValuePair<string, StringTableEntry> stringResource in testedStringFileInfo.Default.Strings) { Assert.AreEqual(stringResource.Value.Value, stringFileInfo[stringResource.Key]); } VarFileInfo newVarFileInfo = (VarFileInfo)newVersionResource["VarFileInfo"]; foreach (KeyValuePair<UInt16, UInt16> varResource in newVarFileInfo.Default.Languages) { Assert.AreEqual(varResource.Value, varFileInfo[varResource.Key]); } }
public void TestDeepCopyBytes(string binaryName, int language) { Uri uri = new Uri(Assembly.GetExecutingAssembly().CodeBase); string filename = Path.Combine(Path.GetDirectoryName(HttpUtility.UrlDecode(uri.AbsolutePath)), "Binaries\\" + binaryName); Assert.IsTrue(File.Exists(filename)); VersionResource existingVersionResource = new VersionResource(); existingVersionResource.Language = (ushort)language; Console.WriteLine("Loading {0}", filename); existingVersionResource.LoadFrom(filename); DumpResource.Dump(existingVersionResource); VersionResource versionResource = new VersionResource(); versionResource.FileVersion = existingVersionResource.FileVersion; versionResource.ProductVersion = existingVersionResource.ProductVersion; StringFileInfo existingVersionResourceStringFileInfo = (StringFileInfo)existingVersionResource["StringFileInfo"]; VarFileInfo existingVersionResourceVarFileInfo = (VarFileInfo)existingVersionResource["VarFileInfo"]; // copy string resources, data only StringFileInfo stringFileInfo = new StringFileInfo(); { Dictionary<string, StringTable>.Enumerator enumerator = existingVersionResourceStringFileInfo.Strings.GetEnumerator(); while (enumerator.MoveNext()) { StringTable stringTable = new StringTable(enumerator.Current.Key); stringFileInfo.Strings.Add(enumerator.Current.Key, stringTable); Dictionary<string, StringTableEntry>.Enumerator resourceEnumerator = enumerator.Current.Value.Strings.GetEnumerator(); while (resourceEnumerator.MoveNext()) { StringTableEntry stringResource = new StringTableEntry(resourceEnumerator.Current.Key); stringResource.Value = resourceEnumerator.Current.Value.Value; stringTable.Strings.Add(resourceEnumerator.Current.Key, stringResource); } } } // copy var resources, data only VarFileInfo varFileInfo = new VarFileInfo(); { Dictionary<string, VarTable>.Enumerator enumerator = existingVersionResourceVarFileInfo.Vars.GetEnumerator(); while (enumerator.MoveNext()) { VarTable varTable = new VarTable(enumerator.Current.Key); varFileInfo.Vars.Add(enumerator.Current.Key, varTable); Dictionary<UInt16, UInt16>.Enumerator translationEnumerator = enumerator.Current.Value.Languages.GetEnumerator(); while (translationEnumerator.MoveNext()) { varTable.Languages.Add(translationEnumerator.Current.Key, translationEnumerator.Current.Value); } } } bool firstResourceIsStringFileInfo = existingVersionResource[0] == existingVersionResourceStringFileInfo; if (firstResourceIsStringFileInfo) { versionResource["StringFileInfo"] = stringFileInfo; versionResource["VarFileInfo"] = varFileInfo; } else { versionResource["VarFileInfo"] = varFileInfo; versionResource["StringFileInfo"] = stringFileInfo; } ByteUtils.CompareBytes(existingVersionResource.WriteAndGetBytes(), versionResource.WriteAndGetBytes()); }
public void TestDeleteDeepCopyAndSaveVersionResource(string binaryName, int language) { Uri uri = new Uri(Assembly.GetExecutingAssembly().CodeBase); string filename = Path.Combine(Path.GetDirectoryName(HttpUtility.UrlDecode(uri.AbsolutePath)), "Binaries\\" + binaryName); Assert.IsTrue(File.Exists(filename)); string targetFilename = Path.Combine(Path.GetTempPath(), binaryName); File.Copy(filename, targetFilename, true); Console.WriteLine(targetFilename); VersionResource existingVersionResource = new VersionResource(); existingVersionResource.Language = (ushort)language; existingVersionResource.LoadFrom(targetFilename); DumpResource.Dump(existingVersionResource); existingVersionResource.DeleteFrom(targetFilename); VersionResource versionResource = new VersionResource(); versionResource.FileVersion = existingVersionResource.FileVersion; versionResource.ProductVersion = existingVersionResource.ProductVersion; StringFileInfo existingVersionResourceStringFileInfo = (StringFileInfo)existingVersionResource["StringFileInfo"]; VarFileInfo existingVersionResourceVarFileInfo = (VarFileInfo)existingVersionResource["VarFileInfo"]; // copy string resources, data only StringFileInfo stringFileInfo = new StringFileInfo(); versionResource["StringFileInfo"] = stringFileInfo; { Dictionary<string, StringTable>.Enumerator enumerator = existingVersionResourceStringFileInfo.Strings.GetEnumerator(); while (enumerator.MoveNext()) { StringTable stringTable = new StringTable(enumerator.Current.Key); stringFileInfo.Strings.Add(enumerator.Current.Key, stringTable); Dictionary<string, StringTableEntry>.Enumerator resourceEnumerator = enumerator.Current.Value.Strings.GetEnumerator(); while (resourceEnumerator.MoveNext()) { StringTableEntry stringResource = new StringTableEntry(resourceEnumerator.Current.Key); stringResource.Value = resourceEnumerator.Current.Value.Value; stringTable.Strings.Add(resourceEnumerator.Current.Key, stringResource); } } } // copy var resources, data only VarFileInfo varFileInfo = new VarFileInfo(); versionResource["VarFileInfo"] = varFileInfo; { Dictionary<string, VarTable>.Enumerator enumerator = existingVersionResourceVarFileInfo.Vars.GetEnumerator(); while (enumerator.MoveNext()) { VarTable varTable = new VarTable(enumerator.Current.Key); varFileInfo.Vars.Add(enumerator.Current.Key, varTable); Dictionary<UInt16, UInt16>.Enumerator translationEnumerator = enumerator.Current.Value.Languages.GetEnumerator(); while (translationEnumerator.MoveNext()) { varTable.Languages.Add(translationEnumerator.Current.Key, translationEnumerator.Current.Value); } } } versionResource.SaveTo(targetFilename); Console.WriteLine("Reloading {0}", targetFilename); VersionResource newVersionResource = new VersionResource(); newVersionResource.LoadFrom(targetFilename); DumpResource.Dump(newVersionResource); AssertOneVersionResource(targetFilename); Assert.AreEqual(newVersionResource.FileVersion, versionResource.FileVersion); Assert.AreEqual(newVersionResource.ProductVersion, versionResource.ProductVersion); StringFileInfo testedStringFileInfo = (StringFileInfo)newVersionResource["StringFileInfo"]; foreach (KeyValuePair<string, StringTableEntry> stringResource in testedStringFileInfo.Default.Strings) { Assert.AreEqual(stringResource.Value.Value, stringFileInfo[stringResource.Key]); } VarFileInfo newVarFileInfo = (VarFileInfo)newVersionResource["VarFileInfo"]; foreach (KeyValuePair<UInt16, UInt16> varResource in newVarFileInfo.Default.Languages) { Assert.AreEqual(varResource.Value, varFileInfo[varResource.Key]); } }
public void TestDeleteAndSaveVersionResource(string binaryName, int language) { Uri uri = new Uri(Assembly.GetExecutingAssembly().CodeBase); string filename = Path.Combine(Path.GetDirectoryName(HttpUtility.UrlDecode(uri.AbsolutePath)), "Binaries\\" + binaryName); Assert.IsTrue(File.Exists(filename)); string targetFilename = Path.Combine(Path.GetTempPath(), "testDeleteAndSaveVersionResource.dll"); File.Copy(filename, targetFilename, true); Console.WriteLine(targetFilename); VersionResource existingVersionResource = new VersionResource(); existingVersionResource.Language = (ushort)language; existingVersionResource.DeleteFrom(targetFilename); VersionResource versionResource = new VersionResource(); versionResource.FileVersion = "1.2.3.4"; versionResource.ProductVersion = "4.5.6.7"; StringFileInfo stringFileInfo = new StringFileInfo(); versionResource[stringFileInfo.Key] = stringFileInfo; StringTable stringFileInfoStrings = new StringTable(); // "040904b0" stringFileInfoStrings.LanguageID = (ushort)language; stringFileInfoStrings.CodePage = 1200; Assert.AreEqual(language, stringFileInfoStrings.LanguageID); Assert.AreEqual(1200, stringFileInfoStrings.CodePage); stringFileInfo.Strings.Add(stringFileInfoStrings.Key, stringFileInfoStrings); stringFileInfoStrings["ProductName"] = "ResourceLib"; stringFileInfoStrings["FileDescription"] = "File updated by ResourceLib\0"; stringFileInfoStrings["CompanyName"] = "Vestris Inc."; stringFileInfoStrings["LegalCopyright"] = "All Rights Reserved\0"; stringFileInfoStrings["EmptyValue"] = ""; stringFileInfoStrings["Comments"] = string.Format("{0}\0", Guid.NewGuid()); stringFileInfoStrings["ProductVersion"] = string.Format("{0}\0", versionResource.ProductVersion); VarFileInfo varFileInfo = new VarFileInfo(); versionResource[varFileInfo.Key] = varFileInfo; VarTable varFileInfoTranslation = new VarTable("Translation"); varFileInfo.Vars.Add(varFileInfoTranslation.Key, varFileInfoTranslation); varFileInfoTranslation[ResourceUtil.USENGLISHLANGID] = 1300; versionResource.SaveTo(targetFilename); Console.WriteLine("Reloading {0}", targetFilename); VersionResource newVersionResource = new VersionResource(); newVersionResource.LoadFrom(targetFilename); DumpResource.Dump(newVersionResource); AssertOneVersionResource(targetFilename); Assert.AreEqual(newVersionResource.FileVersion, versionResource.FileVersion); Assert.AreEqual(newVersionResource.ProductVersion, versionResource.ProductVersion); }