public InstallShieldCABCompression(Stream header, Dictionary <int, Stream> volumes) { this.volumes = volumes; if (header.ReadUInt32() != 0x28635349) { throw new InvalidDataException("Not an Installshield CAB package"); } header.Position += 8; var cabDescriptorOffset = header.ReadUInt32(); header.Position = cabDescriptorOffset + 12; var cabDescriptor = new CabDescriptor(header); header.Position += 14; var fileGroupOffsets = new uint[MaxFileGroupCount]; for (var i = 0; i < MaxFileGroupCount; i++) { fileGroupOffsets[i] = header.ReadUInt32(); } header.Position = cabDescriptorOffset + cabDescriptor.FileTableOffset; var directories = new DirectoryDescriptor[cabDescriptor.DirectoryCount]; for (var i = 0; i < directories.Length; i++) { directories[i] = new DirectoryDescriptor(header, cabDescriptorOffset + cabDescriptor.FileTableOffset); } var fileGroups = new List <FileGroup>(); foreach (var offset in fileGroupOffsets) { var nextOffset = offset; while (nextOffset != 0) { header.Position = cabDescriptorOffset + (long)nextOffset + 4; var descriptorOffset = header.ReadUInt32(); nextOffset = header.ReadUInt32(); header.Position = cabDescriptorOffset + descriptorOffset; fileGroups.Add(new FileGroup(header, cabDescriptorOffset)); } } header.Position = cabDescriptorOffset + cabDescriptor.FileTableOffset + cabDescriptor.FileTableOffset2; foreach (var fileGroup in fileGroups) { for (var i = fileGroup.FirstFile; i <= fileGroup.LastFile; i++) { header.Position = cabDescriptorOffset + cabDescriptor.FileTableOffset + cabDescriptor.FileTableOffset2 + i * 0x57; var file = new FileDescriptor(header, i, cabDescriptorOffset + cabDescriptor.FileTableOffset); var path = "{0}\\{1}\\{2}".F(fileGroup.Name, directories[file.DirectoryIndex].Name, file.Filename); index[path] = file; } } }
public DriveDescriptor(string name, long size, long freeSpace, DirectoryDescriptor root) { Name = name; Size = new ByteSize(size); FreeSpace = new ByteSize(freeSpace); Root = root; }
public DiscEntityViewModel(DirectoryDescriptor directoryDescriptor) { Name = directoryDescriptor.Name; IsAcessible = directoryDescriptor.IsAcessible; Size = null; Children = directoryDescriptor.Directories.Select(d => new DiscEntityViewModel(d)).Concat( directoryDescriptor.Files.Select(d => new DiscEntityViewModel(d)) ).ToArray(); }
public InstallShieldCABCompression(Stream header, Dictionary<int, Stream> volumes) { this.volumes = volumes; if (header.ReadUInt32() != 0x28635349) throw new InvalidDataException("Not an Installshield CAB package"); header.Position += 8; var cabDescriptorOffset = header.ReadUInt32(); header.Position = cabDescriptorOffset + 12; var cabDescriptor = new CabDescriptor(header); header.Position += 14; var fileGroupOffsets = new uint[MaxFileGroupCount]; for (var i = 0; i < MaxFileGroupCount; i++) fileGroupOffsets[i] = header.ReadUInt32(); header.Position = cabDescriptorOffset + cabDescriptor.FileTableOffset; var directories = new DirectoryDescriptor[cabDescriptor.DirectoryCount]; for (var i = 0; i < directories.Length; i++) directories[i] = new DirectoryDescriptor(header, cabDescriptorOffset + cabDescriptor.FileTableOffset); var fileGroups = new List<FileGroup>(); foreach (var offset in fileGroupOffsets) { var nextOffset = offset; while (nextOffset != 0) { header.Position = cabDescriptorOffset + (long)nextOffset + 4; var descriptorOffset = header.ReadUInt32(); nextOffset = header.ReadUInt32(); header.Position = cabDescriptorOffset + descriptorOffset; fileGroups.Add(new FileGroup(header, cabDescriptorOffset)); } } header.Position = cabDescriptorOffset + cabDescriptor.FileTableOffset + cabDescriptor.FileTableOffset2; foreach (var fileGroup in fileGroups) { for (var i = fileGroup.FirstFile; i <= fileGroup.LastFile; i++) { header.Position = cabDescriptorOffset + cabDescriptor.FileTableOffset + cabDescriptor.FileTableOffset2 + i * 0x57; var file = new FileDescriptor(header, i, cabDescriptorOffset + cabDescriptor.FileTableOffset); var path = "{0}\\{1}\\{2}".F(fileGroup.Name, directories[file.DirectoryIndex].Name, file.Filename); index[path] = file; } } }