Exemplo n.º 1
0
        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;
 }
Exemplo n.º 3
0
 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();
 }
Exemplo n.º 4
0
        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;
                }
            }
        }