Example #1
0
        private static bool TryLocateMpqHeader(
            Stream sourceStream,
#if NETCOREAPP3_0
            [NotNullWhen(true)]
#endif
            out MpqHeader?mpqHeader,
            out long headerOffset)
        {
            sourceStream.Seek(0, SeekOrigin.Begin);
            using (var reader = new BinaryReader(sourceStream, new UTF8Encoding(), true))
            {
                for (headerOffset = 0; headerOffset < sourceStream.Length - MpqHeader.Size; headerOffset += PreArchiveAlignBytes)
                {
                    if (reader.ReadUInt32() == MpqHeader.MpqId)
                    {
                        sourceStream.Seek(-4, SeekOrigin.Current);
                        mpqHeader = MpqHeader.FromReader(reader);
                        mpqHeader.HeaderOffset = (uint)headerOffset;
                        return(true);
                    }

                    sourceStream.Seek(PreArchiveAlignBytes - 4, SeekOrigin.Current);
                }
            }

            mpqHeader    = null;
            headerOffset = -1;
            return(false);
        }
Example #2
0
        private static long LocateMpqHeader(Stream sourceStream, out MpqHeader mpqHeader)
        {
            using (var reader = new BinaryReader(sourceStream, new UTF8Encoding(), true))
            {
                for (long i = 0; i < sourceStream.Length - MpqHeader.Size; i += PreArchiveAlignBytes)
                {
                    sourceStream.Seek(i, SeekOrigin.Begin);
                    mpqHeader = MpqHeader.FromReader(reader);

                    if (mpqHeader?.SetHeaderOffset(i) ?? false)
                    {
                        return(i);
                    }
                }
            }

            mpqHeader = null;
            return(-1);
        }