Exemple #1
0
        public AppxPsfViewModel(string installFolder, PsfApplicationDescriptor definition)
        {
            this.definition = definition;

            if (this.definition.Tracing != null)
            {
                this.Tracing = new TracingPsfViewModel(this.definition.Tracing);
            }

            if (this.definition.Scripts != null)
            {
                this.Scripts = new List <AppxPsfScriptViewModel>(definition.Scripts.Select(s => new AppxPsfScriptViewModel(installFolder, s)));
            }
        }
        public PsfApplicationDescriptor Read(string applicationId, string originalEntryPoint, IAppxFileReader fileReader)
        {
            if (
                string.Equals(originalEntryPoint, @"AI_STUBS\AiStub.exe", StringComparison.OrdinalIgnoreCase) ||
                string.Equals(originalEntryPoint, @"AI_STUBS\AiStubElevated.exe", StringComparison.OrdinalIgnoreCase))
            {
                if (fileReader.FileExists(@"AI_STUBS\AiStub.exe") || fileReader.FileExists(@"AI_STUBS\AiStubElevated.exe"))
                {
                    // This is an old Advanced Installer stuff
                    if (fileReader.FileExists("Registry.dat"))
                    {
                        RegistryHiveOnDemand reg;
                        using (var stream = fileReader.GetFile("Registry.dat"))
                        {
                            if (stream is FileStream fileStream)
                            {
                                reg = new RegistryHiveOnDemand(fileStream.Name);
                            }
                            else
                            {
                                using var memoryStream = new MemoryStream();
                                stream.CopyTo(memoryStream);
                                memoryStream.Flush();
                                reg = new RegistryHiveOnDemand(memoryStream.ToArray(), "Registry.dat");
                            }
                        }

                        var key = reg.GetKey(@"root\registry\machine\software\caphyon\advanced installer\" + applicationId);
                        if (key?.Values != null)
                        {
                            var psfDef = new PsfApplicationDescriptor();

                            foreach (var item in key.Values.Where(item => item.ValueName != null))
                            {
                                switch (item.ValueName.ToLowerInvariant())
                                {
                                case "path":
                                    psfDef.Executable = (item.ValueData ?? string.Empty).Replace("[{AppVPackageRoot}]\\", string.Empty);
                                    break;

                                case "pathai":
                                    psfDef.Executable = (item.ValueData ?? string.Empty).Replace("[{AppVPackageRoot}]\\", string.Empty);
                                    break;

                                case "workingdirectory":
                                    psfDef.WorkingDirectory = (item.ValueData ?? string.Empty).Replace("[{AppVPackageRoot}]\\", string.Empty);
                                    break;

                                case "workingdirectoryai":
                                    psfDef.WorkingDirectory = (item.ValueData ?? string.Empty).Replace("[{AppVPackageRoot}]\\", string.Empty);
                                    break;

                                case "args":
                                    psfDef.Arguments = item.ValueData;
                                    break;
                                }
                            }

                            if (string.IsNullOrWhiteSpace(psfDef.Executable))
                            {
                                psfDef.Executable = null;
                            }
                            else if (psfDef.Executable.StartsWith("[{", StringComparison.OrdinalIgnoreCase))
                            {
                                var indexOfClosing = psfDef.Executable.IndexOf("}]", StringComparison.OrdinalIgnoreCase);
                                if (indexOfClosing != -1)
                                {
                                    var middlePart = psfDef.Executable.Substring(2, indexOfClosing - 2);
                                    var testedPath = "VFS\\" + middlePart + psfDef.Executable.Substring(indexOfClosing + 2);

                                    if (fileReader.FileExists(testedPath))
                                    {
                                        // this is to make sure that a path like [{ProgramFilesX86}]\test is replaced to VFS\ProgramFilesX86\test if present
                                        psfDef.Executable = testedPath;
                                    }
                                }
                            }

                            if (string.IsNullOrWhiteSpace(psfDef.WorkingDirectory))
                            {
                                psfDef.WorkingDirectory = null;
                            }

                            if (string.IsNullOrWhiteSpace(psfDef.Arguments))
                            {
                                psfDef.Arguments = null;
                            }

                            return(psfDef);
                        }
                    }
                }
            }

            var    dir = Path.GetDirectoryName(originalEntryPoint);
            string configJson;

            if (string.IsNullOrEmpty(dir))
            {
                configJson = "config.json";
            }
            else
            {
                configJson = Path.Combine(dir, "config.json");
            }

            if (fileReader.FileExists(configJson))
            {
                using (var stream = fileReader.GetFile(configJson))
                {
                    using (var streamReader = new StreamReader(stream))
                    {
                        return(this.Read(applicationId, originalEntryPoint, streamReader));
                    }
                }
            }

            return(null);
        }
        private PsfApplicationDescriptor Read(string applicationId, string originalEntryPoint, TextReader configJson)
        {
            var jsonSerializer = new PsfConfigSerializer();
            var config         = jsonSerializer.Deserialize(configJson.ReadToEnd());

            string executable       = null;
            string workingDirectory = null;
            string arguments        = null;
            var    scripts          = new List <PsfScriptDescriptor>();

            foreach (var item in config.Applications ?? Enumerable.Empty <PsfApplication>())
            {
                var id = item.Id;
                if (id != applicationId)
                {
                    continue;
                }

                executable       = item.Executable;
                workingDirectory = item.WorkingDirectory;
                arguments        = item.Arguments;

                if (item.StartScript != null)
                {
                    scripts.Add(new PsfScriptDescriptor(item.StartScript, PsfScriptDescriptorTiming.Start));
                }

                if (item.EndScript != null)
                {
                    scripts.Add(new PsfScriptDescriptor(item.EndScript, PsfScriptDescriptorTiming.Finish));
                }

                break;
            }

            if (executable == null)
            {
                return(null);
            }

            var psfDef = new PsfApplicationDescriptor
            {
                Executable       = executable,
                Arguments        = arguments,
                WorkingDirectory = workingDirectory,
                OtherFixups      = new List <string>(),
                FileRedirections = new List <PsfFolderRedirectionDescriptor>(),
                Tracing          = null,
                Scripts          = scripts
            };

            foreach (var p in config.Processes ?? Enumerable.Empty <PsfProcess>())
            {
                var exe = p.Executable;
                if (string.IsNullOrEmpty(exe))
                {
                    continue;
                }

                Regex regex;
                try
                {
                    regex = new Regex(exe);
                }
                catch (Exception)
                {
                    continue;
                }

                var indexOf = executable.LastIndexOfAny(new[] { '\\', '/' });
                if (indexOf != -1)
                {
                    executable = executable.Substring(indexOf + 1);
                }

                if (!regex.IsMatch(executable))
                {
                    executable = Path.GetFileNameWithoutExtension(executable);

                    if (!regex.IsMatch(executable))
                    {
                        continue;
                    }
                }

                foreach (var fixup in p.Fixups ?? Enumerable.Empty <PsfFixup>())
                {
                    var dll = fixup.Dll;
                    if (dll == null)
                    {
                        continue;
                    }

                    switch (dll.ToLower())
                    {
                    case "tracefixup64.dll":
                    {
                        if (fixup.Config is PsfTraceFixupConfig psfFixupConfig)
                        {
                            psfDef.Tracing = new PsfTracingRedirectionDescriptor(psfFixupConfig ?? new PsfTraceFixupConfig(), PsfBitness.x64);
                        }

                        break;
                    }

                    case "electronfixup.dll":
                    {
                        psfDef.Electron = new PsfElectronDescriptor();
                        break;
                    }

                    case "tracefixup32.dll":
                    {
                        if (fixup.Config is PsfTraceFixupConfig psfFixupConfig)
                        {
                            psfDef.Tracing = new PsfTracingRedirectionDescriptor(psfFixupConfig ?? new PsfTraceFixupConfig(), PsfBitness.x86);
                        }
                        break;
                    }

                    case "tracefixup.dll":
                    {
                        if (fixup.Config is PsfTraceFixupConfig psfFixupConfig)
                        {
                            psfDef.Tracing = new PsfTracingRedirectionDescriptor(psfFixupConfig ?? new PsfTraceFixupConfig(), PsfBitness.x64);
                        }
                        break;
                    }

                    case "fileredirectionfixup64.dll":
                    case "fileredirectionfixup32.dll":
                    case "fileredirectionfixup.dll":

                        var redirs = this.GetFolderRedirections(fixup);
                        if (redirs != null)
                        {
                            psfDef.FileRedirections.AddRange(redirs);
                        }

                        break;

                    default:
                        psfDef.OtherFixups.Add(dll);
                        break;
                    }
                }
            }

            return(psfDef);
        }