예제 #1
0
        public void Update(IB regionOffset, Func <TType, TType> processRegion)
        {
            var originalPosition = stream.Position;

            try
            {
                stream.Position = regionOffset;

                var rawRegion = new byte[typeSize];

                stream.Read(rawRegion, 0, typeSize);

                var type = typeDecoder.Decode(BinaryData.OfValue(rawRegion));

                var updatedType = processRegion(type);

                stream.Position = regionOffset;

                var encodedType = typeEncoder.Encode(updatedType);

                stream.Write(encodedType.Value, 0, encodedType.Value.Length);
            }
            finally
            {
                stream.Position = originalPosition;
            }
        }
예제 #2
0
        private BinaryData Process(BinaryData blockData, BID blockId)
        {
            var stream = new MemoryStream();

            var dwKey = (int)(blockId.Value & 0x0000FFFF);

            var w = (short)(dwKey ^ (dwKey >> 16));

            for (var i = 0; i < blockData.Length; i++)
            {
                var b = (byte)(blockData.Value[i] + (byte)w);
                b = Constants.mpbbCrypt[b];
                b = (byte)(b + (byte)(w >> 8));
                b = Constants.mpbbCrypt[b + 256];
                b = (byte)(b - (byte)(w >> 8));
                b = Constants.mpbbCrypt[b + 512];
                b = (byte)(b - (byte)w);

                stream.WriteByte(b);

                w++;
            }

            return(BinaryData.OfValue(stream.ToArray()));
        }
예제 #3
0
        public IB Reserve(AllocationInfo allocationInfo)
        {
            amapRegionUpdater.Update(
                allocationInfo.MapOffset,
                map =>
            {
                var bits = map.Data.Value.ToBits();

                for (var i = allocationInfo.BitStartIndex; i <= allocationInfo.BitEndIndex; i++)
                {
                    bits[i] = 1;
                }

                var bytes = bits.ToBytes();

                return
                (new AMap(
                     BinaryData.OfValue(bytes),
                     new PageTrailer(
                         Constants.ptypeAMap,
                         Constants.ptypeAMap,
                         0x0000,
                         Crc32.ComputeCrc32(bytes),
                         BID.OfValue(allocationInfo.MapOffset))));
            });

            var allocateSize = (allocationInfo.BitEndIndex - allocationInfo.BitStartIndex + 1) * 64;

            headerUsageProvider.Use(header => header.SetRoot(header.Root.SetFreeSpaceInAllAMaps(header.Root.AMapFree - allocateSize)));

            return(IB.OfValue(allocationInfo.MapOffset + allocationInfo.BitStartIndex * 64));
        }
예제 #4
0
        public BinaryData Read(long offset, int count)
        {
            var buffer = new byte[count];

            stream.Seek(offset, SeekOrigin.Begin);

            stream.Read(buffer, 0, count);

            return(BinaryData.OfValue(buffer));
        }
예제 #5
0
        private BinaryData Process(BinaryData data, bool encrypt)
        {
            var decodedData = new byte[data.Length];

            var baseIndex = encrypt ? 0 : 512;

            for (var i = 0; i < data.Length; i++)
            {
                decodedData[i] = Constants.mpbbCrypt[baseIndex + data.Value[i]];
            }

            return(BinaryData.OfValue(decodedData));
        }
예제 #6
0
        private BinaryData GetFillLevels(
            ExternalDataBlockForHeapOnNode[] blocks,
            int startIndex,
            int endIndex)
        {
            var stream = new MemoryStream();

            for (var i = startIndex; i < endIndex; i += 2)
            {
                var value = blocks[i].FillLevel & blocks[i + 1].FillLevel << 4;
                stream.WriteByte((byte)value);
            }

            return(BinaryData.OfValue(stream.ToArray()));
        }
예제 #7
0
        public BinaryData Encode(string value)
        {
            var header = headerReader.GetHeader();

            if (header.Version == 14 || header.Version == 15)
            {
                return(BinaryData.OfValue(Encoding.Unicode.GetBytes(value)));
            }

            if (header.Version == 23)
            {
                return(BinaryData.OfValue(Encoding.ASCII.GetBytes(value)));
            }

            throw new Exception($"Unsupported PST file encoding {header.Version}");
        }
예제 #8
0
        private AMap CreateAMap(long mapOffset, params byte[] defaultAllocations)
        {
            var data = new byte[496];

            for (var i = 0; i < defaultAllocations.Length; i++)
            {
                data[i] = defaultAllocations[i];
            }

            return
                (new AMap(
                     BinaryData.OfValue(data),
                     new PageTrailer(
                         Constants.ptypeAMap,
                         Constants.ptypeAMap,
                         0x0000,
                         (int)Crc32.ComputeCrc32(data),
                         BID.OfValue(mapOffset))));
        }
예제 #9
0
파일: Folder.cs 프로젝트: phx255/PST
        public Folder NewFolder(string displayName)
        {
            var childFolderNodePath = objectPath.Add(nodeIdAllocator.Allocate(Constants.NID_TYPE_NORMAL_FOLDER));

            objectTracker.TrackObject(
                childFolderNodePath,
                ObjectTypes.Folder,
                ObjectStates.New);

            objectTracker.SetProperty(
                childFolderNodePath,
                MAPIProperties.PidTagDisplayName,
                new PropertyValue(stringEncoder.Encode(displayName)));

            objectTracker.SetProperty(
                childFolderNodePath,
                MAPIProperties.PidTagContentCount,
                new PropertyValue(BinaryData.OfValue(0)));

            objectTracker.SetProperty(
                childFolderNodePath,
                MAPIProperties.PidTagContentUnreadCount,
                new PropertyValue(BinaryData.OfValue(0)));

            objectTracker.SetProperty(
                childFolderNodePath,
                MAPIProperties.PidTagSubfolders,
                new PropertyValue(BinaryData.OfValue(false)));

            return
                (new Folder(
                     childFolderNodePath,
                     objectTracker,
                     recipientTracker,
                     stringEncoder,
                     propertyNameToIdMap,
                     propertyContextBasedPropertyReader,
                     nodeEntryFinder,
                     rowIndexReader,
                     tableContextBasedPropertyReader,
                     nodeIdAllocator));
        }
예제 #10
0
파일: IBEncoder.cs 프로젝트: phx255/PST
 public BinaryData Encode(IB value)
 {
     return(BinaryData.OfValue(BitConverter.GetBytes(value.Value)));
 }