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