public SLBLOCK(BlockDataDTO blockData) { this.BlockData = blockData; var type = blockData.Data[0]; var clevel = blockData.Data[1]; this.EntryCount = BitConverter.ToUInt16(blockData.Data, 2); this.Entries = new List<SLENTRY>(); for(int i= 0;i < EntryCount;i++) Entries.Add(new SLENTRY(blockData.Data.RangeSubset(8 + 24*i, 24))); }
public SIBLOCK(BlockDataDTO dataBlock) { this.DataBlock = dataBlock; var type = dataBlock.Data[0]; var cLevel = dataBlock.Data[1]; this.EntryCount = BitConverter.ToUInt16(dataBlock.Data, 2); this.Entries = new List<SIENTRY>(); for(int i =0;i < EntryCount;i++) this.Entries.Add(new SIENTRY(dataBlock.Data.RangeSubset(8 + 16*i, 16))); }
public XBLOCK(BlockDataDTO block) { this.Block = block; this.BlockType = block.Data[0]; this.HeaderLevel = block.Data[1]; this.BIDEntryCount = BitConverter.ToUInt16(block.Data, 2); this.TotalBytes = BitConverter.ToUInt32(block.Data, 4); this.BIDEntries = new ulong[BIDEntryCount]; for (int i = 0; i < BIDEntryCount; i++) BIDEntries[i] = BitConverter.ToUInt64(block.Data, 8 + i*8); }
public XXBLOCK(BlockDataDTO block) { this.Block = block; this.Type = block.Data[0]; this.CLevel = block.Data[1]; this.TotalChildren = BitConverter.ToUInt16(block.Data, 2); this.TotalBytes = BitConverter.ToUInt32(block.Data, 4); this.XBlockBIDs = new ulong[this.TotalChildren]; for (var i = 0; i < TotalChildren; i++) this.XBlockBIDs[i] = BitConverter.ToUInt64(block.Data, 8 + 8*i); }
public SLBLOCK(BlockDataDTO blockData) { this.BlockData = blockData; var type = blockData.Data[0]; var clevel = blockData.Data[1]; this.EntryCount = BitConverter.ToUInt16(blockData.Data, 2); this.Entries = new List <SLENTRY>(); for (int i = 0; i < EntryCount; i++) { Entries.Add(new SLENTRY(blockData.Data.RangeSubset(8 + 24 * i, 24))); } }
public XBLOCK(BlockDataDTO block) { this.Block = block; this.BlockType = block.Data[0]; this.HeaderLevel = block.Data[1]; this.BIDEntryCount = BitConverter.ToUInt16(block.Data, 2); this.TotalBytes = BitConverter.ToUInt32(block.Data, 4); this.BIDEntries = new ulong[BIDEntryCount]; for (int i = 0; i < BIDEntryCount; i++) { BIDEntries[i] = BitConverter.ToUInt64(block.Data, 8 + i * 8); } }
public SIBLOCK(BlockDataDTO dataBlock) { this.DataBlock = dataBlock; var type = dataBlock.Data[0]; var cLevel = dataBlock.Data[1]; this.EntryCount = BitConverter.ToUInt16(dataBlock.Data, 2); this.Entries = new List <SIENTRY>(); for (int i = 0; i < EntryCount; i++) { this.Entries.Add(new SIENTRY(dataBlock.Data.RangeSubset(8 + 16 * i, 16))); } }
public XXBLOCK(BlockDataDTO block) { this.Block = block; this.Type = block.Data[0]; this.CLevel = block.Data[1]; this.TotalChildren = BitConverter.ToUInt16(block.Data, 2); this.TotalBytes = BitConverter.ToUInt32(block.Data, 4); this.XBlockBIDs = new ulong[this.TotalChildren]; for (var i = 0; i < TotalChildren; i++) { this.XBlockBIDs[i] = BitConverter.ToUInt64(block.Data, 8 + 8 * i); } }
public XXBLOCK(bool unicode, BlockDataDTO block) { Block = block; Type = block.Data[0]; CLevel = block.Data[1]; TotalChildren = BitConverter.ToUInt16(block.Data, 2); TotalBytes = BitConverter.ToUInt32(block.Data, 4); XBlockBIDs = new ulong[this.TotalChildren]; for (var i = 0; i < TotalChildren; i++) { XBlockBIDs[i] = unicode ? BitConverter.ToUInt64(block.Data, 8 + 8 * i) : BitConverter.ToUInt32(block.Data, 8 + 4 * i); } }
public SLBLOCK(bool unicode, BlockDataDTO blockData) { BlockData = blockData; var type = blockData.Data[0]; var clevel = blockData.Data[1]; EntryCount = BitConverter.ToUInt16(blockData.Data, 2); Entries = new List <SLENTRY>(); for (int i = 0; i < EntryCount; i++) { Entries.Add(unicode ? new SLENTRY(unicode, blockData.Data.RangeSubset(8 + 24 * i, 24)) : new SLENTRY(unicode, blockData.Data.RangeSubset(4 + 12 * i, 12))); } }
public XBLOCK(bool unicode, BlockDataDTO block) { Block = block; BlockType = block.Data[0]; HeaderLevel = block.Data[1]; BIDEntryCount = BitConverter.ToUInt16(block.Data, 2); TotalBytes = BitConverter.ToUInt32(block.Data, 4); BIDEntries = new ulong[BIDEntryCount]; for (int i = 0; i < BIDEntryCount; i++) { BIDEntries[i] = unicode ? BitConverter.ToUInt64(block.Data, 8 + i * 8) : BitConverter.ToUInt32(block.Data, 8 + i * 4); } }
public SIBLOCK(bool unicode, BlockDataDTO dataBlock) { DataBlock = dataBlock; var type = dataBlock.Data[0]; var cLevel = dataBlock.Data[1]; EntryCount = BitConverter.ToUInt16(dataBlock.Data, 2); Entries = new List <SIENTRY>(); for (int i = 0; i < EntryCount; i++) { Entries.Add(unicode ? new SIENTRY(unicode, dataBlock.Data.RangeSubset(8 + 16 * i, 16)) : new SIENTRY(unicode, dataBlock.Data.RangeSubset(8 + 8 * i, 8))); } }
public HNBlock(int blockIndex, BlockDataDTO bytes) { this._bytes = bytes; this.PageMapOffset = BitConverter.ToUInt16(this._bytes.Data, 0); this.PageMap = new HNPAGEMAP(this._bytes.Data, this.PageMapOffset); if (blockIndex == 0) { this.Header = new HNHDR(this._bytes.Data); } else if (blockIndex % 128 == 8) { this.BitMapPageHeader = new HNBITMAPHDR(ref this._bytes.Data); } else { this.PageHeader = new HNPAGEHDR(ref this._bytes.Data); } }
//for a given bbt entry, retrieve the raw bytes associated with the BID //this includes retrieving data trees via xblocks public static List <BlockDataDTO> GetBBTEntryData(BBTENTRY entry, PSTFile pst) { int blockTrailerLen = pst.Header.isUnicode ? 16 : 12; var dataSize = entry.BlockByteCount; var blockSize = entry.BlockByteCount + blockTrailerLen; if (blockSize % 64 != 0) { blockSize += 64 - (blockSize % 64); } List <BlockDataDTO> dataBlocks; /*if (isSubNode) * { * using (var viewer = PSTFile.PSTMMF.CreateViewAccessor((long)entry.BREF.IB, blockSize)) * { * var blockBytes = new byte[dataSize]; * viewer.ReadArray(0, blockBytes, 0, dataSize); * dataBlocks = new List<BlockDataDTO> * {new BlockDataDTO {Data = blockBytes, PstOffset = entry.BREF.IB, BBTEntry = entry}}; * return dataBlocks; * } * } else */ if (entry.Internal) { using (var viewer = pst.PSTMMF.CreateViewAccessor((long)entry.BREF.IB, blockSize)) { var blockBytes = new byte[dataSize]; viewer.ReadArray(0, blockBytes, 0, dataSize); var trailerBytes = new byte[blockTrailerLen]; viewer.ReadArray(blockSize - blockTrailerLen, trailerBytes, 0, blockTrailerLen); var trailer = new BlockTrailer(pst.Header.isUnicode, trailerBytes, 0); var dataBlockDTO = new BlockDataDTO { Data = blockBytes, PstOffset = entry.BREF.IB, CRCOffset = (uint)((long)entry.BREF.IB + (blockSize - (pst.Header.isUnicode ? 12 : 4))), BBTEntry = entry }; var type = blockBytes[0]; var level = blockBytes[1]; if (type == 2) //si or sl entry { return(new List <BlockDataDTO> { dataBlockDTO }); } else if (type == 1) { if (blockBytes[1] == 0x01) //XBLOCK { var xblock = new XBLOCK(pst.Header.isUnicode, dataBlockDTO); return(BlockBO.GetXBlockData(xblock, pst)); } else //XXBLOCK { var xxblock = new XXBLOCK(pst.Header.isUnicode, dataBlockDTO); return(BlockBO.GetXXBlockData(xxblock, pst)); } } else { throw new NotImplementedException(); } } } else { using (var viewer = pst.PSTMMF.CreateViewAccessor((long)entry.BREF.IB, blockSize)) { var dataBytes = new byte[dataSize]; viewer.ReadArray(0, dataBytes, 0, dataSize); var trailerBytes = new byte[blockTrailerLen]; viewer.ReadArray(blockSize - blockTrailerLen, trailerBytes, 0, blockTrailerLen); var trailer = new BlockTrailer(pst.Header.isUnicode, trailerBytes, 0); dataBlocks = new List <BlockDataDTO> { new BlockDataDTO { Data = dataBytes, PstOffset = entry.BREF.IB, CRC32 = trailer.CRC, CRCOffset = (uint)(blockSize - (pst.Header.isUnicode ? 12 : 4)), BBTEntry = entry } }; } } for (int i = 0; i < dataBlocks.Count; i++) { var temp = dataBlocks[i].Data; DataEncoder.CryptPermute(temp, temp.Length, false, pst); } return(dataBlocks); }
//for a given bbt entry, retrieve the raw bytes associated with the BID //this includes retrieving data trees via xblocks public static List<BlockDataDTO> GetBBTEntryData(BBTENTRY entry, PSTFile pst) { var dataSize = entry.BlockByteCount; var blockSize = entry.BlockByteCount + 16; if (blockSize % 64 != 0) blockSize += 64 - (blockSize%64); List<BlockDataDTO> dataBlocks; /*if (isSubNode) { using (var viewer = PSTFile.PSTMMF.CreateViewAccessor((long)entry.BREF.IB, blockSize)) { var blockBytes = new byte[dataSize]; viewer.ReadArray(0, blockBytes, 0, dataSize); dataBlocks = new List<BlockDataDTO> {new BlockDataDTO {Data = blockBytes, PstOffset = entry.BREF.IB, BBTEntry = entry}}; return dataBlocks; } } else */ if (entry.Internal) { using(var viewer = pst.PSTMMF.CreateViewAccessor((long)entry.BREF.IB,blockSize)) { var blockBytes = new byte[dataSize]; viewer.ReadArray(0, blockBytes, 0, dataSize); var trailerBytes = new byte[16]; viewer.ReadArray(blockSize-16, trailerBytes, 0, 16); var trailer = new BlockTrailer(trailerBytes, 0); var dataBlockDTO = new BlockDataDTO { Data = blockBytes, PstOffset = entry.BREF.IB, CRCOffset = (uint)((long)entry.BREF.IB + (blockSize - 12)), BBTEntry = entry }; var type = blockBytes[0]; var level = blockBytes[1]; if (type == 2) //si or sl entry { return new List<BlockDataDTO> {dataBlockDTO}; } else if (type == 1) { if (blockBytes[1] == 0x01) //XBLOCK { var xblock = new XBLOCK(dataBlockDTO); return BlockBO.GetXBlockData(xblock, pst); } else //XXBLOCK { var xxblock = new XXBLOCK(dataBlockDTO); return BlockBO.GetXXBlockData(xxblock, pst); } } else { throw new NotImplementedException(); } } } else { using(var viewer = pst.PSTMMF.CreateViewAccessor((long)entry.BREF.IB,blockSize)) { var dataBytes = new byte[dataSize]; viewer.ReadArray(0, dataBytes, 0, dataSize); var trailerBytes = new byte[16]; viewer.ReadArray(blockSize-16, trailerBytes, 0, 16); var trailer = new BlockTrailer(trailerBytes, 0); dataBlocks = new List<BlockDataDTO> { new BlockDataDTO { Data = dataBytes, PstOffset = entry.BREF.IB, CRC32 = trailer.CRC, CRCOffset = (uint) (blockSize -12), BBTEntry = entry } }; } } for (int i = 0; i < dataBlocks.Count; i++) { var temp = dataBlocks[i].Data; DatatEncoder.CryptPermute(temp, temp.Length, false, pst); } return dataBlocks; }