PERWAPI.PEReader.ReadMetaData C# (CSharp) Méthode

ReadMetaData() private méthode

private ReadMetaData ( ) : void
Résultat void
        private void ReadMetaData()
        {
            if (Diag.DiagOn) Console.WriteLine("MetaData at RVA = " + Hex.Int(metaDataRVA) + " and offset = " + Hex.Int(GetOffset(metaDataRVA)));
            BaseStream.Seek(GetOffset(metaDataRVA),SeekOrigin.Begin);
            uint sig = ReadUInt32();              // check
            verInfo.mdMajVer = ReadUInt16();           // check
            verInfo.mdMinVer = ReadUInt16();           // check
            ReadZeros(4);
            int verStrLen = ReadInt32();
            int end = -1;
            char[] verString = new char[verStrLen+1];
            for (int i=0; i < verStrLen; i++) {
                verString[i] = (char)ReadByte();
                if ((verString[i] == 0) && (end == -1)) end = i;
            }
            verString[verStrLen] = (char)0; // check
            if (end == -1) end = verStrLen;
            verInfo.netVerString = new string(verString,0,end);
            verInfo.SetVersionFromString();
            GenericParam.extraField = verInfo.netVerString.CompareTo(MetaData.versions[1]) <= 0; // after version 2.0.40607
            if (Diag.DiagOn && GenericParam.extraField) {
                Console.WriteLine("Version = " + verInfo.netVerString + " has extra field for GenericParam");
            }
            int alignNum = 0;
            if ((verStrLen % 4) != 0) alignNum = 4 - (verStrLen % 4);
            ReadZeros(alignNum);
            flags = ReadUInt16(); // check
            int numStreams = ReadUInt16();
            streamOffsets = new uint[numStreams];
            streamSizes = new uint[numStreams];
            streamNames = new String[numStreams];
            if (Diag.DiagOn)
                Console.WriteLine("MetaData Streams");
            for (int i=0; i < numStreams; i++) {
                streamOffsets[i] = ReadUInt32();
                streamSizes[i] = ReadUInt32();
                streamNames[i] = ReadStreamName();
                if (Diag.DiagOn)
                    Console.WriteLine("  " + streamNames[i] + "  Offset = " + Hex.Int(streamOffsets[i]) + "  Size = " + Hex.Int(streamSizes[i]));
            }
            uint tildeIx = 0;
            for (uint i=0; i < numStreams; i++) {
                String nam = streamNames[i];
                if (MetaData.tildeName.CompareTo(nam) == 0) tildeIx = i;
                else {
                    uint streamoff = GetOffset(metaDataRVA + streamOffsets[i]);
                    if (Diag.DiagOn) Console.WriteLine("getting stream bytes at offset " + Hex.Int(streamoff));
                    BaseStream.Seek(GetOffset(metaDataRVA+streamOffsets[i]),SeekOrigin.Begin);
                    long streamStart = BaseStream.Position;
                    byte[] strBytes = ReadBytes((int)streamSizes[i]);
                    if (MetaData.stringsName.CompareTo(nam) == 0) {
                        strings = new MetaDataInStream(strBytes);
                    } else if (MetaData.userstringName.CompareTo(nam) == 0) {
                        userstring = new MetaDataStringStream(strBytes);
                    } else if (MetaData.blobName.CompareTo(nam) == 0) {
                        blobStreamStartOffset = streamStart;
                        blob = new MetaDataInStream(strBytes);
                    } else if (MetaData.guidName.CompareTo(nam) == 0) {
                        guid = new MetaDataInStream(strBytes);
                    } else if (nam.CompareTo("#-") == 0) {
                        tildeIx = i;
                        //throw new Exception("Illegal uncompressed data stream #-");
                    } else {
                        Console.WriteLine("Unknown stream - " + nam);
                    }
                }
            }
            // go to beginning of tilde stream
            BaseStream.Seek(GetOffset(metaDataRVA+streamOffsets[tildeIx]),SeekOrigin.Begin);
            ReadTildeStreamStart();
        }