Пример #1
0
        public StreamHeaderRef(MemoryMappedViewAccessor accessor)
        {
            Accessor = accessor;
            Buffer   = accessor.GetSafeBuffer();

            byte *temp = null;

            Buffer.AcquirePointer(ref temp);

            Ptr = (StreamHeader *)temp;
        }
Пример #2
0
        public bool Verify(uint maxSize, out StreamHeader * [] streams)
        {
            streams = new StreamHeader *[(int)StreamID.NUMBER_OF_STREAMS];

            //Validate the magic number.
            if (Signature != 0x424A5342) {
                return false;
            }

            //The reserved DWORD should be zero.
            if (Reserved != 0) {
                return false;
            }

            if (Length > 256 || (Length % 4) != 0) {
                return false;
            }

            try {
                if (checked(Length + MinSize + sizeof(ushort) * 2) > maxSize)
                {
                    return false;
                }
            }
            catch (OverflowException) {
                return false;
            }

            if (!VerifyVersion()) {
                return false;
            }

            if (Flags != 0) {
                return false;
            }

            if (NumberOfStreams < 1 || NumberOfStreams > 5) {
                return false;
            }

            var pStream = FirstStreamHeader;
            
            fixed (MetadataRoot* pThis = &this) {
                for (var i = 0; i < NumberOfStreams; ++i) {
                    if (checked((byte*) pStream - (byte*) pThis > maxSize - StreamHeader.MinSize)) {
                        return false;
                    }
                    uint maxLength;
                    try {
                        maxLength = checked(maxSize - StreamHeader.MinSize - 4u - (uint) ((byte*) pStream - (byte*) pThis));
                    }
                    catch (OverflowException) {
                        return false;
                    }
                    var streamName = pStream->GetNameAsString(maxLength);
                    StreamID streamID;
                    if (! StreamHeader.StreamNames.TryGetValue(streamName, out streamID)) {
                        return false;
                    }
                    if (streams[(int)streamID] != null) {
                        return false;
                    }
                    streams[(int) streamID] = pStream;
                    try {
                        pStream = (StreamHeader *)checked((byte*) pStream + 8 + checked((uint)streamName.Length + 1).Pad(4));
                    }
                    catch (OverflowException) {
                        return false;
                    }
                }
            }
            return true;
        }
Пример #3
0
        public StreamHeaderRef(MemoryMappedViewAccessor accessor)
        {
            Accessor = accessor;
            Buffer = accessor.GetSafeBuffer();

            byte* temp = null;
            Buffer.AcquirePointer(ref temp);

            Ptr = (StreamHeader*)temp;
        }
Пример #4
0
        public bool Verify(uint maxSize, out StreamHeader * [] streams)
        {
            streams = new StreamHeader *[(int)StreamID.NUMBER_OF_STREAMS];

            //Validate the magic number.
            if (Signature != 0x424A5342)
            {
                return(false);
            }

            //The reserved DWORD should be zero.
            if (Reserved != 0)
            {
                return(false);
            }

            if (Length > 256 || (Length % 4) != 0)
            {
                return(false);
            }

            try {
                if (checked (Length + MinSize + sizeof(ushort) * 2) > maxSize)
                {
                    return(false);
                }
            }
            catch (OverflowException) {
                return(false);
            }

            if (!VerifyVersion())
            {
                return(false);
            }

            if (Flags != 0)
            {
                return(false);
            }

            if (NumberOfStreams < 1 || NumberOfStreams > 5)
            {
                return(false);
            }

            var pStream = FirstStreamHeader;

            fixed(MetadataRoot *pThis = &this)
            {
                for (var i = 0; i < NumberOfStreams; ++i)
                {
                    if (checked ((byte *)pStream - (byte *)pThis > maxSize - StreamHeader.MinSize))
                    {
                        return(false);
                    }
                    uint maxLength;
                    try {
                        maxLength = checked (maxSize - StreamHeader.MinSize - 4u - (uint)((byte *)pStream - (byte *)pThis));
                    }
                    catch (OverflowException) {
                        return(false);
                    }
                    var      streamName = pStream->GetNameAsString(maxLength);
                    StreamID streamID;
                    if (!StreamHeader.StreamNames.TryGetValue(streamName, out streamID))
                    {
                        return(false);
                    }
                    if (streams[(int)streamID] != null)
                    {
                        return(false);
                    }
                    streams[(int)streamID] = pStream;
                    try {
                        pStream = (StreamHeader *)checked ((byte *)pStream + 8 + checked ((uint)streamName.Length + 1).Pad(4));
                    }
                    catch (OverflowException) {
                        return(false);
                    }
                }
            }

            return(true);
        }