Ejemplo n.º 1
0
 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)));
 }
Ejemplo n.º 2
0
 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)));
 }
Ejemplo n.º 3
0
 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);
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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)));
            }
        }
Ejemplo n.º 6
0
 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);
     }
 }
Ejemplo n.º 7
0
        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)));
            }
        }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
 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);
     }
 }
Ejemplo n.º 10
0
        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)));
            }
        }
Ejemplo n.º 11
0
 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);
     }
 }
Ejemplo n.º 12
0
        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)));
            }
        }
Ejemplo n.º 13
0
        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);
            }
        }
Ejemplo n.º 14
0
        //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);
        }
Ejemplo n.º 15
0
        //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;
        }