Example #1
0
        public PSTHeader(PSTFile pst)
        {
            var tempBytes = new byte[684];

            using (var mmfView = pst.PSTMMF.CreateViewAccessor(0, tempBytes.Length))
            {
                mmfView.ReadArray(0, tempBytes, 0, tempBytes.Length);
                DWMagic = Encoding.ASCII.GetString(tempBytes, 0, 4);

                var ver = BitConverter.ToUInt16(tempBytes, 10);

                bool ansi = (ver == 14 || ver == 15);
                isUnicode = !ansi;

                //root.PSTSize = ByteReverse.ReverseULong(root.PSTSize);
                var sentinel = tempBytes[isUnicode ? 512 : 460];
                EncodingAlgotihm = (BlockEncoding)tempBytes[isUnicode ? 513 : 461];

                var nbt_bref = new BREF(isUnicode, tempBytes, isUnicode ? 216 : 184);
                var bbt_bref = new BREF(isUnicode, tempBytes, isUnicode ? 232 : 192);

                NodeBT  = new NDB.PSTBTree(isUnicode, nbt_bref, pst);
                BlockBT = new NDB.PSTBTree(isUnicode, bbt_bref, pst);
            }
        }
Example #2
0
 public LBBTEntry(BREF blockReference, int byteCountOfRawDataInReferencedBlockExcludingTrailerAndAlignmentPadding, int numberOfReferencesToThisBlock, BinaryData padding)
 {
     BlockReference = blockReference;
     ByteCountOfRawDataInReferencedBlockExcludingTrailerAndAlignmentPadding = byteCountOfRawDataInReferencedBlockExcludingTrailerAndAlignmentPadding;
     NumberOfReferencesToThisBlock = numberOfReferencesToThisBlock;
     Padding = padding;
 }
Example #3
0
 public PSTBTree(BREF bref, PSTFile pst)
 {
     using (var viewer = pst.PSTMMF.CreateViewAccessor((long)bref.IB, 512))
     {
         var data = new byte[512];
         viewer.ReadArray(0, data, 0, 512);
         Root = new BTPage(data, bref, pst);
     }
 }
Example #4
0
        public BID Allocate(IB blockOffset, int rawDataSize, bool internalBlock)
        {
            var bidIndex = headerUsageProvider.GetHeader().NextBID;

            headerUsageProvider.Use(header => header.IncrementBIDIndexForDataBlocks());

            var blockId = internalBlock ? BID.ForInternalBlock(bidIndex) : BID.ForExternalBlock(bidIndex);

            allocatedBlockBTreeEntries.Add(
                new LBBTEntry(
                    BREF.OfValue(blockId, blockOffset),
                    rawDataSize,
                    numberOfReferencesToThisBlock: 2,
                    padding: BinaryData.OfSize(4)));

            return(blockId);
        }
Example #5
0
        public PSTHeader(PSTFile pst)
        {
            using (var mmfView = pst.PSTMMF.CreateViewAccessor(0, 684))
            {
                var dwMagicBuffer = new byte[4];
                mmfView.ReadArray(0, dwMagicBuffer, 0, 4);
                DWMagic = Encoding.Default.GetString(dwMagicBuffer);

                var ver = mmfView.ReadInt16(10);


                IsANSI    = ver == 14 || ver == 15;
                IsUNICODE = ver == 23;

                if (IsUNICODE)
                {
                    var fileSizeBuffer = new byte[8];
                    mmfView.ReadArray(184, fileSizeBuffer, 0, 8);
                    var fileSizeBytes = BitConverter.ToUInt64(fileSizeBuffer, 0);
                    Root = new PSTRoot(fileSizeBytes);

                    var sentinel    = mmfView.ReadByte(512);
                    var cryptMethod = (uint)mmfView.ReadByte(513);

                    EncodingAlgotihm = (BlockEncoding)cryptMethod;

                    var bytes = new byte[16];
                    mmfView.ReadArray(216, bytes, 0, 16);
                    var nbt_bref = new BREF(bytes);

                    mmfView.ReadArray(232, bytes, 0, 16);
                    var bbt_bref = new BREF(bytes);

                    NodeBT  = new NodeDatabaseLayer.PSTBTree(nbt_bref, pst);
                    BlockBT = new NodeDatabaseLayer.PSTBTree(bbt_bref, pst);
                }
            }
        }
Example #6
0
File: Root.cs Project: phx255/PST
 public Root(
     int reserved,
     long fileEOF,
     long amapLast,
     long amapFree,
     long pmapFree,
     BREF nbtRootPage,
     BREF bbtRootPage,
     int amapValid,
     int bReserved,
     int wReserved)
 {
     Reserved    = reserved;
     FileEOF     = fileEOF;
     AMapLast    = amapLast;
     AMapFree    = amapFree;
     PMapFree    = pmapFree;
     NBTRootPage = nbtRootPage;
     BBTRootPage = bbtRootPage;
     AMapValid   = amapValid;
     BReserved   = bReserved;
     WReserved   = wReserved;
 }
Example #7
0
        public PSTHeader(PSTFile pst)
        {
            using (var mmfView = pst.PSTMMF.CreateViewAccessor(0, 684))
            {
                var dwMagicBuffer = new byte[4];
                mmfView.ReadArray(0, dwMagicBuffer, 0, 4);
                DWMagic = Encoding.Default.GetString(dwMagicBuffer);

                var ver = mmfView.ReadInt16(10);
                Version = ver == 23 ? PstVersion.UNICODE : PstVersion.ANSI;
                if (Version == PstVersion.ANSI)
                {
                    throw new Exception("ANSI encoded PST not supported");
                }

                var rootBuffer = new byte[72];
                mmfView.ReadArray(180, rootBuffer, 0, rootBuffer.Length);

                Root = new PSTRoot(rootBuffer);

                var sentinel    = mmfView.ReadByte(512);
                var cryptMethod = (uint)mmfView.ReadByte(513);

                EncodingAlgotihm = (BlockEncoding)cryptMethod;

                var bytes = new byte[16];
                mmfView.ReadArray(216, bytes, 0, 16);
                var nbt_bref = new BREF(bytes);

                mmfView.ReadArray(232, bytes, 0, 16);
                var bbt_bref = new BREF(bytes);

                NodeBT  = new PSTBTree(nbt_bref, pst);
                BlockBT = new PSTBTree(bbt_bref, pst);
            }
        }
Example #8
0
        public PSTHeader(PSTFile pst)
        {
            using (var mmfView = pst.PSTMMF.CreateViewAccessor(0, 684))
            {
                var temp = new byte[4];
                mmfView.ReadArray(0, temp, 0, 4);
                this.DWMagic = Encoding.Default.GetString(temp);

                var ver = mmfView.ReadInt16(10);


                this.IsANSI = ver == 14 || ver == 15 ? true : (ver == 23 ? (bool?)false : null);

                if (this.IsANSI != null && this.IsANSI.Value)
                {
                }
                else if (this.IsUNICODE != null && this.IsUNICODE.Value)
                {
                    //root.PSTSize = ByteReverse.ReverseULong(root.PSTSize);
                    var sentinel    = mmfView.ReadByte(512);
                    var cryptMethod = (uint)mmfView.ReadByte(513);

                    this.EncodingAlgotihm = (BlockEncoding)cryptMethod;

                    var bytes = new byte[16];
                    mmfView.ReadArray(216, bytes, 0, 16);
                    var nbt_bref = new BREF(bytes);

                    mmfView.ReadArray(232, bytes, 0, 16);
                    var bbt_bref = new BREF(bytes);

                    this.NodeBT  = new NDB.PSTBTree(nbt_bref, pst);
                    this.BlockBT = new NDB.PSTBTree(bbt_bref, pst);
                }
            }
        }
Example #9
0
 public NodeBTree(BREF root)
 {
     this.RootLocation = root;
 }
Example #10
0
 public static IBBTEntry OfValue(BID bid, BREF bref)
 => new IBBTEntry(bid, bref);
Example #11
0
 private IBBTEntry(BID key, BREF childPageBlockReference)
 {
     Key = key;
     ChildPageBlockReference = childPageBlockReference;
 }
Example #12
0
 public NodeBTree(BREF root)
 {
     this.RootLocation = root;
 }
Example #13
0
 public static INBTEntry OfValue(NID nid, BREF bref)
 => new INBTEntry(nid, bref);