public StreamHeaderRef(MemoryMappedViewAccessor accessor) { Accessor = accessor; Buffer = accessor.GetSafeBuffer(); byte *temp = null; Buffer.AcquirePointer(ref temp); Ptr = (StreamHeader *)temp; }
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; }
public StreamHeaderRef(MemoryMappedViewAccessor accessor) { Accessor = accessor; Buffer = accessor.GetSafeBuffer(); byte* temp = null; Buffer.AcquirePointer(ref temp); Ptr = (StreamHeader*)temp; }
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); }