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); }