Skip to content

CollapseLauncher/InnoSetupLogParser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Inno Setup Log Parser.

The goal of this project is to port to C# the InnoSetup uninstall logs mechanism. This project was initially created by preseverence and has been modified to work with ApplyUpdate app used for managing installation and update for Collapse Launcher project with additional features being added.

Main features

  • Read InnoSetup unins000.dat file
  • Decoding all records, flags and data

Added features since the initial implementation

  • Modify and Save the changes back to InnoSetup unins000.dat file
  • Adding CRC check mechanism (However, this check can be skipped)

Limitations

  • Compiled code sections will be skipped

Basic Usage Examples

Printing Uninstall Paths

using Hi3Helper.EncTool.Parser.InnoUninstallerLog;
using LibISULR;
using LibISULR.Records;
using System;

string innoFile = "path_to_unins000.dat";

// The CRC check can be skipped by setting the skipCrcCheck argument to true
using (InnoUninstLog innoLog = InnoUninstLog.Load(innoFile, skipCrcCheck: false))
{
    foreach (BaseRecord baseRecord in innoLog.Records)
    {
        switch (baseRecord.Type)
        {
            case RecordType.DeleteDirOrFiles:
                DeleteDirOrFilesRecord deleteDirOrFilesRecord = (DeleteDirOrFilesRecord)baseRecord;
                Console.WriteLine(deleteDirOrFilesRecord.Paths[0]);
                break;
            case RecordType.DeleteFile:
                DeleteFileRecord deleteFileRecord = (DeleteFileRecord)baseRecord;
                Console.WriteLine(deleteFileRecord.Paths[0]);
                break;
        }
    }
}

Modify the base paths in DeleteDirOrFiles and DeleteFile records

using Hi3Helper.EncTool.Parser.InnoUninstallerLog;
using LibISULR;
using LibISULR.Flags;
using LibISULR.Records;
using System;
using System.IO;

namespace Test
{
    internal class Program
    {
        private static void ChangeBasePath<TFlags>(BaseRecord record, string from, string to)
            where TFlags : Enum
        {
            // Cast the base record to BasePathListRecord<TFlags>
            BasePathListRecord<TFlags> listPathRecord = (BasePathListRecord<TFlags>)record;

            // Find the start index of the searched path from "from" argument
            int indexOf = listPathRecord.Paths[0].IndexOf(from, StringComparison.InvariantCultureIgnoreCase);

            // If the indexOf is > -1 (found), then try slicing the start of the path based on "from" argument
            if (indexOf > -1)
            {
                // Slice the string to get the relative path (and trim \\ if necessary)
                string sliced = listPathRecord.Paths[0].Substring(indexOf + from.Length).TrimStart('\\');

                // Combine the sliced relative path with base path from "to" argument
                listPathRecord.Paths[0] = Path.Combine(to, sliced);
            }
        }

        static void Main(string[] args)
        {
            string innoFile = @"C:\Program Files\Collapse Launcher\unins000.dat";

            // The CRC check can be skipped by setting the skipCrcCheck argument to true
            using (InnoUninstLog innoLog = InnoUninstLog.Load(innoFile))
            {
                // Enumerate the record as BaseRecord
                foreach (BaseRecord baseRecord in innoLog.Records)
                {
                    switch (baseRecord.Type)
                    {
                        // Replace the base path for DeleteDirOrFiles type record
                        case RecordType.DeleteDirOrFiles:
                            // Use DeleteDirOrFilesFlags as TEnum for ChangeBasePath() method
                            ChangeBasePath<DeleteDirOrFilesFlags>(baseRecord, @"C:\Program Files", @"D:\Program Files");
                            break;
                        // Replace the base path for DeleteFile type record
                        case RecordType.DeleteFile:
                            // Use DeleteFileFlags as TEnum for ChangeBasePath() method
                            ChangeBasePath<DeleteFileFlags>(baseRecord, @"C:\Program Files", @"D:\Program Files");
                            break;
                    }
                }

                // Save the record
                innoLog.Save(innoFile);
            }
        }
    }
}

License

The initial license is using The WTFPL License.

About

Parse and modify the Inno Setup Log file (unins000.dat)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages