示例#1
0
        private List <CompoundDocumentItem> ReadDirectories(List <byte[]> sectors, DocWriteInfo dwi)
        {
            var dir        = new List <CompoundDocumentItem>();
            var nextSector = _firstDirectorySectorLocation;

            while (nextSector != END_OF_CHAIN)
            {
                ReadDirectory(sectors, nextSector, dir);
                nextSector = dwi.FAT[nextSector];
            }
            return(dir);
        }
示例#2
0
        private List <int> ReadFAT(List <byte[]> sectors, DocWriteInfo dwi)
        {
            var l = new List <int>();

            foreach (var i in dwi.DIFAT)
            {
                var br = new BinaryReader(new MemoryStream(sectors[i]));
                while (br.BaseStream.Position < _sectorSize)
                {
                    var d = br.ReadInt32();
                    l.Add(d);
                }
            }
            return(l);
        }
示例#3
0
        private List <int> ReadMiniFAT(List <byte[]> sectors, DocWriteInfo dwi)
        {
            var l          = new List <int>();
            var nextSector = _firstMiniFATSectorLocation;

            while (nextSector != END_OF_CHAIN)
            {
                var br = new BinaryReader(new MemoryStream(sectors[nextSector]));
                while (br.BaseStream.Position < _sectorSize)
                {
                    var d = br.ReadInt32();
                    l.Add(d);
                }
                nextSector = dwi.FAT[nextSector];
            }
            return(l);
        }
示例#4
0
        private List <int> ReadFAT(List <byte[]> sectors, DocWriteInfo dwi)
        {
            var l = new List <int>();

            foreach (var i in dwi.DIFAT)
            {
                using (var ms = RecyclableMemory.GetStream(sectors[i]))
                {
                    var br = new BinaryReader(ms);
                    while (ms.Position < _sectorSize)
                    {
                        var d = br.ReadInt32();
                        l.Add(d);
                    }
                }
            }
            return(l);
        }
示例#5
0
        private void LoadDIFATSectors(DocWriteInfo dwi)
        {
            var nextSector = _firstDIFATSectorLocation;

            while (nextSector > 0)
            {
                var brDI = new BinaryReader(new MemoryStream(_sectors[nextSector]));
                var sect = -1;
                while (brDI.BaseStream.Position < _sectorSize)
                {
                    if (sect > 0)
                    {
                        dwi.DIFAT.Add(sect);
                    }
                    sect = brDI.ReadInt32();
                }
                nextSector = sect;
            }
        }
示例#6
0
        private List <int> ReadMiniFAT(List <byte[]> sectors, DocWriteInfo dwi)
        {
            var l          = new List <int>();
            var nextSector = _firstMiniFATSectorLocation;

            while (nextSector != END_OF_CHAIN)
            {
                using (var ms = RecyclableMemory.GetStream(sectors[nextSector]))
                {
                    var br = new BinaryReader(ms);
                    while (ms.Position < _sectorSize)
                    {
                        var d = br.ReadInt32();
                        l.Add(d);
                    }
                    nextSector = dwi.FAT[nextSector];
                }
            }
            return(l);
        }
示例#7
0
        private void LoadDIFATSectors(DocWriteInfo dwi)
        {
            var nextSector = _firstDIFATSectorLocation;

            while (nextSector > 0)
            {
                using (var ms = RecyclableMemory.GetStream(_sectors[nextSector]))
                {
                    var brDI = new BinaryReader(ms);
                    var sect = -1;
                    while (ms.Position < _sectorSize)
                    {
                        if (sect > 0)
                        {
                            dwi.DIFAT.Add(sect);
                        }
                        sect = brDI.ReadInt32();
                    }
                    nextSector = sect;
                }
            }
        }
示例#8
0
 private void CreateFATStreams(CompoundDocumentItem item, BinaryWriter bw, BinaryWriter bwMini, DocWriteInfo dwi)
 {
     if (item.ObjectType != 5)   //Root, we must have the miniStream first.
     {
         if (item.StreamSize > 0)
         {
             item.StreamSize = item.Stream.Length;
             if (item.StreamSize < _miniStreamCutoffSize)
             {
                 item.StartingSectorLocation = WriteStream(bwMini, dwi.miniFAT, item.Stream, miniFATSectorSize);
             }
             else
             {
                 item.StartingSectorLocation = WriteStream(bw, dwi.FAT, item.Stream, FATSectorSizeV3);
             }
         }
     }
     foreach (var c in item.Children)
     {
         CreateFATStreams(c, bw, bwMini, dwi);
     }
 }
示例#9
0
 private void LoadMinSectors(ref DocWriteInfo dwi, List <CompoundDocumentItem> dir)
 {
     dwi.miniFAT   = ReadMiniFAT(_sectors, dwi);
     dir[0].Stream = GetStream(dir[0].StartingSectorLocation, dir[0].StreamSize, dwi.FAT, _sectors);
     GetMiniSectors(dir[0].Stream);
 }
示例#10
0
        internal void Read(BinaryReader br)
        {
            br.ReadBytes(8);    //Read header
            br.ReadBytes(16);   //Header CLSID (16 bytes): Reserved and unused class ID that MUST be set to all zeroes (CLSID_NULL).
            minorVersion = br.ReadInt16();
            majorVersion = br.ReadInt16();
            br.ReadInt16(); //Byte order
            sectorShif     = br.ReadInt16();
            minSectorShift = br.ReadInt16();

            _sectorSize     = 1 << sectorShif;
            _miniSectorSize = 1 << minSectorShift;
            _sectorSizeInt  = _sectorSize / 4;
            br.ReadBytes(6);    //Reserved
            numberOfDirectorySector       = br.ReadInt32();
            _numberOfFATSectors           = br.ReadInt32();
            _firstDirectorySectorLocation = br.ReadInt32();
            _transactionSignatureNumber   = br.ReadInt32();
            _miniStreamCutoffSize         = br.ReadInt32();
            _firstMiniFATSectorLocation   = br.ReadInt32();
            _numberofMiniFATSectors       = br.ReadInt32();
            _firstDIFATSectorLocation     = br.ReadInt32();
            _numberofDIFATSectors         = br.ReadInt32();
            var dwi = new DocWriteInfo()
            {
                DIFAT = new List <int>(), FAT = new List <int>(), miniFAT = new List <int>()
            };

            for (int i = 0; i < 109; i++)
            {
                var d = br.ReadInt32();
                if (d >= 0)
                {
                    dwi.DIFAT.Add(d);
                }
            }

            LoadSectors(br);
            if (_firstDIFATSectorLocation > 0)
            {
                LoadDIFATSectors(dwi);
            }

            dwi.FAT = ReadFAT(_sectors, dwi);
            //var t = new BinaryWriter(new MemoryStream());
            //foreach(var j in dwi.FAT)
            //{
            //    t.Write(j);
            //}
            //File.WriteAllBytes(@"c:\temp\fat.bin", ((MemoryStream)t.BaseStream).ToArray());
            var dir = ReadDirectories(_sectors, dwi);

            //foreach(var d in dir)
            //{
            //    File.AppendAllText(@"c:\temp\dirs.txt", d.Name + ";" + d.ChildID + ";" + d.LeftSibling + ";" + d.RightSibling + ";" + d.ColorFlag  + "\r\n" );
            //}

            LoadMinSectors(ref dwi, dir);
            foreach (var d in dir)
            {
                if (d.Stream == null && d.StreamSize > 0)
                {
                    if (d.StreamSize < _miniStreamCutoffSize)
                    {
                        d.Stream = GetStream(d.StartingSectorLocation, d.StreamSize, dwi.miniFAT, _miniSectors);
                    }
                    else
                    {
                        d.Stream = GetStream(d.StartingSectorLocation, d.StreamSize, dwi.FAT, _sectors);
                        //File.WriteAllBytes(@"c:\temp\"+DateTime.Now.ToString("HHmmss")+".bin",d.Stream.ToArray());
                    }
                }
            }
            AddChildTree(dir[0], dir);
        }
示例#11
0
        internal void Read(BinaryReader br)
        {
            br.ReadBytes(8);    //Read header
            br.ReadBytes(16);   //Header CLSID (16 bytes): Reserved and unused class ID that MUST be set to all zeroes (CLSID_NULL).
            minorVersion = br.ReadInt16();
            majorVersion = br.ReadInt16();
            br.ReadInt16(); //Byte order
            sectorShif     = br.ReadInt16();
            minSectorShift = br.ReadInt16();

            _sectorSize     = 1 << sectorShif;
            _miniSectorSize = 1 << minSectorShift;
            _sectorSizeInt  = _sectorSize / 4;
            br.ReadBytes(6);    //Reserved
            numberOfDirectorySector       = br.ReadInt32();
            _numberOfFATSectors           = br.ReadInt32();
            _firstDirectorySectorLocation = br.ReadInt32();
            _transactionSignatureNumber   = br.ReadInt32();
            _miniStreamCutoffSize         = br.ReadInt32();
            _firstMiniFATSectorLocation   = br.ReadInt32();
            _numberofMiniFATSectors       = br.ReadInt32();
            _firstDIFATSectorLocation     = br.ReadInt32();
            _numberofDIFATSectors         = br.ReadInt32();
            var dwi = new DocWriteInfo()
            {
                DIFAT = new List <int>(), FAT = new List <int>(), miniFAT = new List <int>()
            };

            for (int i = 0; i < 109; i++)
            {
                var d = br.ReadInt32();
                if (d >= 0)
                {
                    dwi.DIFAT.Add(d);
                }
            }

            LoadSectors(br);
            if (_firstDIFATSectorLocation > 0)
            {
                LoadDIFATSectors(dwi);
            }

            dwi.FAT = ReadFAT(_sectors, dwi);
            var dir = ReadDirectories(_sectors, dwi);

            LoadMinSectors(ref dwi, dir);
            foreach (var d in dir)
            {
                if (d.Stream == null && d.StreamSize > 0)
                {
                    if (d.StreamSize < _miniStreamCutoffSize)
                    {
                        d.Stream = GetStream(d.StartingSectorLocation, d.StreamSize, dwi.miniFAT, _miniSectors);
                    }
                    else
                    {
                        d.Stream = GetStream(d.StartingSectorLocation, d.StreamSize, dwi.FAT, _sectors);
                    }
                }
            }
            AddChildTree(dir[0], dir);
        }