Abstract class to represent a row of the Meta Data Tables
コード例 #1
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] methDefs)
 {
     MethodDef prevDef = null;
     prevDef = new MethodDef(buff);
     methDefs[0] = prevDef;
     for (int i=1; i < methDefs.Length; i++) {
         prevDef.Row = (uint)i;
         MethodDef methDef = new MethodDef(buff);
         prevDef.numPars = methDef.parIx - prevDef.parIx;
         prevDef = methDef;
         methDefs[i] = methDef;
     }
     prevDef.Row = (uint)methDefs.Length;
     prevDef.numPars = (buff.GetTableSize(MDTable.Param)+1) - prevDef.parIx;
 }
コード例 #2
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] table, PEFile pefile)
 {
     for (int i=0; i < table.Length; i++) {
         HashAlgorithmType hAlg = (HashAlgorithmType)buff.ReadUInt32();
         ushort majVer = buff.ReadUInt16();
         ushort minVer = buff.ReadUInt16();
         ushort bldNo = buff.ReadUInt16();
         ushort revNo = buff.ReadUInt16();
         uint flags = buff.ReadUInt32();
         byte[] pKey =  buff.GetBlob();
         string name = buff.GetString();
         string cult = buff.GetString();
         table[i] = new Assembly(name,hAlg,majVer,minVer,bldNo,revNo,flags,pKey,cult,pefile);
     }
 }
コード例 #3
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal InterfaceImpl(ClassDef theClass, TableRow theInterface)
 {
     this.theClass = theClass;
     this.theInterface = (Class)theInterface;
     tabIx = MDTable.InterfaceImpl;
 }
コード例 #4
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] layouts)
 {
     for (int i=0; i < layouts.Length; i++)
         layouts[i] = new FieldLayout(buff);
 }
コード例 #5
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] fRVAs)
 {
     for (int i=0; i < fRVAs.Length; i++)
         fRVAs[i] = new FieldRVA(buff);
 }
コード例 #6
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] attrs)
 {
     for (int i=0; i < attrs.Length; i++) {
         attrs[i] = new CustomAttribute(buff);
     }
 }
コード例 #7
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] events)
 {
     for (int i=0; i < events.Length; i++)
         events[i] = new Event(buff);
 }
コード例 #8
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] props)
 {
     for (int i=0; i < props.Length; i++)
         props[i] = new Property(buff);
 }
コード例 #9
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] sigs)
 {
     for (int i=0; i < sigs.Length; i++) {
         uint sigIx = buff.GetBlobIx();
         uint tag = buff.FirstBlobByte(sigIx);
         if (tag == LocalSig.LocalSigByte)
             sigs[i] = new LocalSig(sigIx);
         else if (tag == Field.FieldTag)
             sigs[i] = new Signature(sigIx);
         else
             sigs[i] = new CalliSig(sigIx);
         sigs[i].Row = (uint)i+1;
     }
 }
コード例 #10
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] mods, bool resolve)
 {
     for (int i=0; i < mods.Length; i++) {
         string name = buff.GetString();
         ModuleRef mRef = new ModuleRef(name);
         if (resolve) mRef.modFile = buff.GetFileDesc(name);
         mods[i] = mRef;
     }
 }
コード例 #11
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] pars)
 {
     for (int i=0; i < pars.Length; i++)
         pars[i] = new Param(buff);
 }
コード例 #12
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] specs)
 {
     for (int i=0; i < specs.Length; i++)
         specs[i] = new MethodSpec(buff);
 }
コード例 #13
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] methSems)
 {
     for (int i=0; i < methSems.Length; i++)
         methSems[i] = new MethodSemantics(buff);
 }
コード例 #14
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] table)
 {
     for (int i=0; i < table.Length; i++)
         table[i] = Read(buff);
 }
コード例 #15
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] typeDefs, bool isMSCorLib)
 {
     ClassDef prevDef = null;
     prevDef = new ClassDef(buff,1,isMSCorLib);
     typeDefs[0] = prevDef;
     for (int i=1; i < typeDefs.Length; i++) {
         ClassDef typeDef = new ClassDef(buff,(uint)i+1,isMSCorLib);
         prevDef.fieldEndIx = typeDef.fieldIx;
         prevDef.methodEndIx = typeDef.methodIx;
         prevDef = typeDef;
         typeDefs[i] = typeDef;
     }
     prevDef.fieldEndIx = buff.GetTableSize(MDTable.Field)+1;
     prevDef.methodEndIx = buff.GetTableSize(MDTable.Method)+1;
 }
コード例 #16
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] specs)
 {
     for (int i=0; i < specs.Length; i++) {
         specs[i] = new UnresolvedTypeSpec(buff,i);
         //specs[i] = buff.GetBlobType(null,null,buff.GetBlobIx());
         //if (specs[i] is GenericParam) {
         //  Console.WriteLine("GenericParam in TypeSpec table at pos " + i);
         //}
     }
 }
コード例 #17
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] typeRefs, bool resolve)
 {
     for (uint i=0; i < typeRefs.Length; i++) {
         uint resScopeIx = buff.GetCodedIndex(CIx.ResolutionScope);
         string name = buff.GetString();
         string nameSpace = buff.GetString();
         if (buff.CodedTable(CIx.ResolutionScope,resScopeIx) == MDTable.TypeRef)
             typeRefs[i] = new NestedClassRef(resScopeIx,nameSpace,name);
         else
             typeRefs[i] = new ClassRef(resScopeIx,nameSpace,name);
         typeRefs[i].Row = i+1;
     }
     if (resolve) {
         for (int i=0; i < typeRefs.Length; i++) {
             ((ClassRef)typeRefs[i]).ResolveParent(buff,false);
         }
     }
 }
コード例 #18
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] consts)
 {
     for (int i=0; i < consts.Length; i++)
         consts[i] = new ConstantElem(buff);
 }
コード例 #19
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] secs)
 {
     for (int i=0; i < secs.Length; i++)
         secs[i] = new DeclSecurity(buff);
 }
コード例 #20
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void GetClassRefs(PEReader buff, TableRow[] eClasses)
 {
     for (uint i=0; i < eClasses.Length; i++) {
         uint junk = buff.ReadUInt32();
         junk = buff.ReadUInt32();
         string name = buff.GetString();
         string nameSpace = buff.GetString();
         uint implIx = buff.GetCodedIndex(CIx.Implementation);
         eClasses[i] = new ClassRef(implIx,nameSpace,name);
         eClasses[i].Row = i+1;
     }
 }
コード例 #21
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] fields)
 {
     for (int i=0; i < fields.Length; i++)
         fields[i] = new FieldDef(buff);
 }
コード例 #22
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] eClasses)
 {
     for (int i=0; i < eClasses.Length; i++)
         eClasses[i] = new ExternClass(buff);
 }
コード例 #23
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] fMarshal)
 {
     for (int i=0; i < fMarshal.Length; i++)
         fMarshal[i] = new FieldMarshal(buff);
 }
コード例 #24
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal MetaDataTables(TableRow[][] tabs)
 {
     tables = tabs;
 }
コード例 #25
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] files)
 {
     for (int i=0; i < files.Length; i++) {
         uint flags = buff.ReadUInt32();
         if (flags == HasMetaData)
             files[i] = new ModuleFile(buff.GetString(),buff.GetBlob());
         else
             files[i] = new ResourceFile(buff.GetString(),buff.GetBlob());
     }
 }
コード例 #26
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 private void ReadTildeStreamStart()
 {
     if (Diag.DiagOn) Console.WriteLine("Reading meta data tables at offset = " + Hex.Int((int)BaseStream.Position));
     // pre:  at beginning of tilde stream
     ReadZeros(4);  // reserved
     verInfo.tsMajVer = ReadByte();  // check
     verInfo.tsMinVer = ReadByte();  // check
     byte heapSizes = ReadByte();
     if (heapSizes != 0) {
         md.largeStrings = (heapSizes & 0x01) != 0;
         md.largeGUID = (heapSizes & 0x02) != 0;
         md.largeBlob = (heapSizes & 0x04) != 0;
     }
     if (Diag.DiagOn) {
         if (md.largeStrings) Console.WriteLine("LARGE strings index");
         if (md.largeGUID) Console.WriteLine("LARGE GUID index");
         if (md.largeBlob) Console.WriteLine("LARGE blob index");
     }
     int res = ReadByte(); // check if 1
     ulong valid = ReadUInt64();
     ulong sorted = this.ReadUInt64();
     if (Diag.DiagOn) Console.WriteLine("Valid = " + Hex.Long(valid));
     for (int i=0; i < MetaData.NumMetaDataTables; i++) {
         if ((valid & FileImage.bitmasks[i]) != 0) {
             tableLengths[i] = ReadUInt32();
             tables[i] = new TableRow[tableLengths[i]];
             md.largeIx[i] = tableLengths[i] > MetaData.maxSmlIxSize;
             if (Diag.DiagOn)
                 Console.WriteLine("Table Ix " + Hex.Short(i) + " has length " + tableLengths[i]);
         }
         else tableLengths[i] = 0;
     }
     if (tableLengths[0] != 1) this.MetaDataError("Module table has more than one entry");
     for (int i=0; i < MetaData.CIxTables.Length; i++) {
         for (int j=0; j < MetaData.CIxTables[i].Length; j++) {
             if (Diag.DiagOn) Console.WriteLine("CIxTables " + i + " " + j + " tableLength = " + tableLengths[MetaData.CIxTables[i][j]] + "  Max = " + MetaData.CIxMaxMap[i]);
             md.lgeCIx[i] = md.lgeCIx[i] ||
                 (tableLengths[MetaData.CIxTables[i][j]] > MetaData.CIxMaxMap[i]);
         }
         if (Diag.DiagOn) if (md.lgeCIx[i]) Console.WriteLine("LARGE CIx " + i );
     }
 }
コード例 #27
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] gpars)
 {
     for (int i=0; i < gpars.Length; i++)
         gpars[i] = new GenericParamConstraint(buff);
 }
コード例 #28
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void GetClassRefs(PEReader buff, TableRow[] typeRefs, ReferenceScope paren, uint[] parIxs)
 {
     int num = typeRefs.Length;
     uint[] fieldStart = new uint[num+1], methStart = new uint[num+1], extends = new uint[num+1];
     for (int i=0; i < num; i++) {
         uint flags = buff.ReadUInt32();
         string name = buff.GetString();
         string nameSpace = buff.GetString();
         extends[i] = buff.GetCodedIndex(CIx.TypeDefOrRef);
         fieldStart[i] = buff.GetIndex(MDTable.Field);
         methStart[i] = buff.GetIndex(MDTable.Method);
         //Console.WriteLine("flags = " + Hex.Int(flags));
         if (i == 0) // ASSERT first entry is always <Module>
             typeRefs[i] = paren.GetDefaultClass();
         else if (isPublic(flags)) {
             if (parIxs[i] != 0) {
                 typeRefs[i] = new NestedClassRef(paren,nameSpace,name);
             } else {
                 typeRefs[i] = paren.GetExistingClass(nameSpace,name);
                 if (typeRefs[i] == null) {
                     typeRefs[i] = new ClassRef(paren,nameSpace,name);
                     paren.AddToClassList((ClassRef)typeRefs[i]);
                 }
             }
         }
     }
     fieldStart[num] = buff.GetTableSize(MDTable.Field)+1;
     methStart[num] = buff.GetTableSize(MDTable.Method)+1;
     // Find Nested Classes
     for (int i=0; i < typeRefs.Length; i++) {
         if ((typeRefs[i] != null) && (typeRefs[i] is NestedClassRef)) {
             NestedClassRef nRef = (NestedClassRef)typeRefs[i];
             ClassRef nPar = (ClassRef)typeRefs[parIxs[i]-1];
             if (nPar == null) {  // parent is private, so ignore
                 typeRefs[i] = null;
             } else {
                 nRef.SetParent(nPar);
                 nPar.AddToClassList(nRef);
             }
         }
         if (typeRefs[i] != null) {
             if (buff.GetCodedElement(CIx.TypeDefOrRef,extends[i]) == MSCorLib.mscorlib.ValueType())
                 ((ClassRef)typeRefs[i]).MakeValueClass();
             buff.SetElementPosition(MDTable.Field,fieldStart[i]);
             FieldDef.GetFieldRefs(buff,fieldStart[i+1]-fieldStart[i],(ClassRef)typeRefs[i]);
             buff.SetElementPosition(MDTable.Method,methStart[i]);
             MethodDef.GetMethodRefs(buff,methStart[i+1]-methStart[i],(ClassRef)typeRefs[i]);
         }
     }
 }
コード例 #29
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void Read(PEReader buff, TableRow[] impls)
 {
     for (int i=0; i < impls.Length; i++)
         impls[i] = new InterfaceImpl(buff);
 }
コード例 #30
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal static void ReadMember(PEReader buff, TableRow[] members)
 {
     for (int i=0; i < members.Length; i++) {
         uint parenIx = buff.GetCodedIndex(CIx.MemberRefParent);
         string memName = buff.GetString();
         uint sigIx = buff.GetBlobIx();
         if (buff.FirstBlobByte(sigIx) == Field.FieldTag) // got a field
             members[i] = new FieldRef(parenIx,memName,sigIx);
         else
             members[i] = new MethodRef(parenIx,memName,sigIx);
     }
 }