ここにクラスの説明を書きます。
コード例 #1
0
 /// <summary>
 /// コンストラクタです。
 /// </summary>
 public MethodData(PEData data, MemberRefTable m)
 {
     MethodData.Initialize();
     this.Parse(data, m);
 }
コード例 #2
0
        private void Parse(PEData data, TableBase m)
        {
            this.data           = data;
            this.table          = m;
            this.Flags          = this.Size = this.MaxStack = this.CodeSize = this.LocalVarSigTok = 0;
            this.ilCodes        = null;
            this.ilAddr         = 0;
            this.LocalVarSigTok = 0;
            this.LocalVarSig    = null;
            this.LocalVars      = null;
            this.ImplMap        = null;
            this.Kind           = this.DataSize = 0;
            this.EHTable        = null;
            this.ReadSignature();
            int ad = this.RVA;

            if (ad == 0)
            {
                return;
            }
            int h = this.data.data[ad];

            if ((h & 3) == (int)CorILMethod.TinyFormat)
            {
                this.CodeSize = h >> 2;
                ad++;
            }
            else
            {
                h                   = Util.GetInt16(this.data.data, ad);
                this.Flags          = h & 0xfff;
                this.Size           = (h >> 12) * 4;
                ad                 += 2;
                this.MaxStack       = Util.GetInt16(this.data.data, ad);
                ad                 += 2;
                this.CodeSize       = Util.GetInt32(this.data.data, ad);
                ad                 += 4;
                this.LocalVarSigTok = Util.GetInt32(this.data.data, ad);
                ad                 += 4;
                this.ReadLocalVars();
            }
            this.ilAddr = ad;
            ad         += this.CodeSize;
            if ((this.Flags & (int)CorILMethod.MoreSects) == 0)
            {
                return;
            }
            /// More Sections
            int pad = 4 - (ad & 3);

            if (pad < 4)
            {
                ad += pad;
            }
            int end = ad;

            this.Kind = this.data.data[ad++];
            bool isFat = (this.Kind & (int)CorILMethod_Sect.FatFormat) != 0;

            if (!isFat)
            {
                this.DataSize = this.data.data[ad];
            }
            else
            {
                this.DataSize = Util.GetInt24(this.data.data, ad);
            }
            ad          += 3;
            end         += this.DataSize;
            this.EHTable = new ArrayList();
            while (ad < end)
            {
                ExceptionHandlingClauses ex = new ExceptionHandlingClauses();
                if (!isFat)
                {
                    ex.Flags         = Util.GetInt16(data.data, ad);
                    ad              += 2;
                    ex.TryOffset     = Util.GetInt16(data.data, ad);
                    ad              += 2;
                    ex.TryLength     = data.data[ad++];
                    ex.HandlerOffset = Util.GetInt16(data.data, ad);
                    ad              += 2;
                    ex.HandlerLength = data.data[ad++];
                }
                else
                {
                    ex.Flags         = Util.GetInt32(data.data, ad);
                    ad              += 4;
                    ex.TryOffset     = Util.GetInt32(data.data, ad);
                    ad              += 4;
                    ex.TryLength     = Util.GetInt32(data.data, ad);
                    ad              += 4;
                    ex.HandlerOffset = Util.GetInt32(data.data, ad);
                    ad              += 4;
                    ex.HandlerLength = Util.GetInt32(data.data, ad);
                    ad              += 4;
                }
                if (ex.Flags == (int)COR_ILEXCEPTION_CLAUSE.EXCEPTION)
                {
                    ex.ClassToken = Util.GetInt32(data.data, ad);
                }
                else
                {
                    ex.FilterOffset = Util.GetInt32(data.data, ad);
                }
                ad += 4;
                this.EHTable.Add(ex);
            }
        }
コード例 #3
0
ファイル: IndexManager.cs プロジェクト: GeGuNa/mona-os
        public void MakeTree(PEData data)
        {
            ArrayList listType = this.Tables[(int)MetadataTables.TypeDef];
            int       len      = listType.Count;

            for (int i = 0; i < len; i++)
            {
                this.MakeTree(listType[i] as TypeDefTable, i + 1 < len ? listType[i + 1] as TypeDefTable : null);
            }
            foreach (object obj in this.Tables[(int)MetadataTables.AssemblyRef])
            {
                (obj as TableBase).Children = new ArrayList[]
                {
                    new ArrayList()
                }
                ;
            }
            foreach (object obj in this.Tables[(int)MetadataTables.TypeRef])
            {
                (obj as TableBase).Children = new ArrayList[]
                {
                    new ArrayList(), new ArrayList(), new ArrayList()
                }
                ;
            }
            foreach (object obj in this.Tables[(int)MetadataTables.TypeRef])
            {
                TypeRefTable t = obj as TypeRefTable;
                if (t.ResolutionScope == 0)
                {
                    continue;
                }
                t.ParentTable = this.GetTable(this.GetToken(CodedIndices.ResolutionScope, t.ResolutionScope));
                t.ParentTable.Children[(int)Children.RefNested].Add(t);
            }
            foreach (object obj in this.Tables[(int)MetadataTables.MethodDef])
            {
                MethodDefTable m = obj as MethodDefTable;
                m.Tag = new MethodData(data, m);
            }
            foreach (object obj in this.Tables[(int)MetadataTables.MemberRef])
            {
                MemberRefTable m  = obj as MemberRefTable;
                MethodData     md = new MethodData(data, m);
                m.Tag = md;
                if (m.Class == 0)
                {
                    continue;
                }
                m.ParentTable = this.GetTable(this.GetToken(CodedIndices.MemberRefParent, m.Class));
                if (md.IsField)
                {
                    m.ParentTable.Children[(int)Children.RefField].Add(m);
                }
                else
                {
                    m.ParentTable.Children[(int)Children.RefMethod].Add(m);
                }
            }
            foreach (object obj in this.Tables[(int)MetadataTables.ImplMap])
            {
                ImplMapTable   im = obj as ImplMapTable;
                MethodDefTable m  = this.GetTable(this.GetToken(CodedIndices.MemberForwarded, im.MemberForwarded)) as MethodDefTable;
                if (m != null)
                {
                    (m.Tag as MethodData).ImplMap = im;
                }
            }
            foreach (object obj in this.Tables[(int)MetadataTables.NestedClass])
            {
                NestedClassTable nc  = obj as NestedClassTable;
                TypeDefTable     nst = listType[nc.NestedClass - 1] as TypeDefTable;
                TypeDefTable     enc = listType[nc.EnclosingClass - 1] as TypeDefTable;
                nst.ParentTable = enc;
                enc.Children[(int)Children.DefNested].Add(nst);
            }
        }
コード例 #4
0
ファイル: IL2Asm16.cs プロジェクト: higepon/mona
 public bool ReadPE(string fn)
 {
     try
     {
         FileStream fs = new FileStream(fn, FileMode.Open);
         int len = (int)fs.Length;
         this.data = new byte[len];
         fs.Read(this.data, 0, len);
         fs.Close();
     }
     catch
     {
         System.Console.WriteLine("Can not open: {0}", fn);
         return false;
     }
     this.pedata = new PEData(this.data);
     if (this.pedata.cli == null)
     {
         System.Console.WriteLine("Not CIL assembly: {0}", fn);
         return false;
     }
     return true;
 }
コード例 #5
0
ファイル: IndexManager.cs プロジェクト: higepon/mona
 public void MakeTree(PEData data)
 {
     ArrayList listType = this.Tables[(int) MetadataTables.TypeDef];
     int len = listType.Count;
     for (int i = 0; i < len; i++)
     {
         this.MakeTree(listType[i] as TypeDefTable, i + 1 < len ? listType[i + 1] as TypeDefTable : null);
     }
     foreach (object obj in this.Tables[(int) MetadataTables.AssemblyRef])
     {
         (obj as TableBase).Children = new ArrayList[]
         {
             new ArrayList()
         }
         ;
     }
     foreach (object obj in this.Tables[(int) MetadataTables.TypeRef])
     {
         (obj as TableBase).Children = new ArrayList[]
         {
             new ArrayList(), new ArrayList(), new ArrayList()
         }
         ;
     }
     foreach (object obj in this.Tables[(int) MetadataTables.TypeRef])
     {
         TypeRefTable t = obj as TypeRefTable;
         if (t.ResolutionScope == 0) continue;
         t.ParentTable = this.GetTable(this.GetToken(CodedIndices.ResolutionScope, t.ResolutionScope));
         t.ParentTable.Children[(int) Children.RefNested].Add(t);
     }
     foreach (object obj in this.Tables[(int) MetadataTables.MethodDef])
     {
         MethodDefTable m = obj as MethodDefTable;
         m.Tag = new MethodData(data, m);
     }
     foreach (object obj in this.Tables[(int) MetadataTables.MemberRef])
     {
         MemberRefTable m = obj as MemberRefTable;
         MethodData md = new MethodData(data, m);
         m.Tag = md;
         if (m.Class == 0) continue;
         m.ParentTable = this.GetTable(this.GetToken(CodedIndices.MemberRefParent, m.Class));
         if (md.IsField)
         {
             m.ParentTable.Children[(int) Children.RefField].Add(m);
         }
         else
         {
             m.ParentTable.Children[(int) Children.RefMethod].Add(m);
         }
     }
     foreach (object obj in this.Tables[(int) MetadataTables.ImplMap])
     {
         ImplMapTable im = obj as ImplMapTable;
         MethodDefTable m = this.GetTable(this.GetToken(CodedIndices.MemberForwarded, im.MemberForwarded)) as MethodDefTable;
         if (m != null) (m.Tag as MethodData).ImplMap = im;
     }
     foreach (object obj in this.Tables[(int) MetadataTables.NestedClass])
     {
         NestedClassTable nc = obj as NestedClassTable;
         TypeDefTable nst = listType[nc.NestedClass - 1] as TypeDefTable;
         TypeDefTable enc = listType[nc.EnclosingClass - 1] as TypeDefTable;
         nst.ParentTable = enc;
         enc.Children[(int) Children.DefNested].Add(nst);
     }
 }
コード例 #6
0
ファイル: MethodData.cs プロジェクト: higepon/mona
 /// <summary>
 /// コンストラクタです。
 /// </summary>
 public MethodData(PEData data, MemberRefTable m)
 {
     MethodData.Initialize();
     this.Parse(data, m);
 }
コード例 #7
0
ファイル: MethodData.cs プロジェクト: higepon/mona
 private void Parse(PEData data, TableBase m)
 {
     this.data = data;
     this.table = m;
     this.Flags = this.Size = this.MaxStack = this.CodeSize = this.LocalVarSigTok = 0;
     this.ilCodes = null;
     this.ilAddr = 0;
     this.LocalVarSigTok = 0;
     this.LocalVarSig = null;
     this.LocalVars = null;
     this.ImplMap = null;
     this.Kind = this.DataSize = 0;
     this.EHTable = null;
     this.ReadSignature();
     int ad = this.RVA;
     if (ad == 0) return;
     int h = this.data.data[ad];
     if ((h & 3) ==(int) CorILMethod.TinyFormat)
     {
         this.CodeSize = h >> 2;
         ad++;
     }
     else
     {
         h = Util.GetInt16(this.data.data, ad);
         this.Flags = h & 0xfff;
         this.Size =(h >> 12) * 4;
         ad += 2;
         this.MaxStack = Util.GetInt16(this.data.data, ad);
         ad += 2;
         this.CodeSize = Util.GetInt32(this.data.data, ad);
         ad += 4;
         this.LocalVarSigTok = Util.GetInt32(this.data.data, ad);
         ad += 4;
         this.ReadLocalVars();
     }
     this.ilAddr = ad;
     ad += this.CodeSize;
     if ((this.Flags &(int) CorILMethod.MoreSects) == 0) return;
     /// More Sections
     int pad = 4 -(ad & 3);
     if (pad < 4) ad += pad;
     int end = ad;
     this.Kind = this.data.data[ad++];
     bool isFat =(this.Kind &(int) CorILMethod_Sect.FatFormat) != 0;
     if (!isFat)
     {
         this.DataSize = this.data.data[ad];
     }
     else
     {
         this.DataSize = Util.GetInt24(this.data.data, ad);
     }
     ad += 3;
     end += this.DataSize;
     this.EHTable = new ArrayList();
     while (ad < end)
     {
         ExceptionHandlingClauses ex = new ExceptionHandlingClauses();
         if (!isFat)
         {
             ex.Flags = Util.GetInt16(data.data, ad);
             ad += 2;
             ex.TryOffset = Util.GetInt16(data.data, ad);
             ad += 2;
             ex.TryLength = data.data[ad++];
             ex.HandlerOffset = Util.GetInt16(data.data, ad);
             ad += 2;
             ex.HandlerLength = data.data[ad++];
         }
         else
         {
             ex.Flags = Util.GetInt32(data.data, ad);
             ad += 4;
             ex.TryOffset = Util.GetInt32(data.data, ad);
             ad += 4;
             ex.TryLength = Util.GetInt32(data.data, ad);
             ad += 4;
             ex.HandlerOffset = Util.GetInt32(data.data, ad);
             ad += 4;
             ex.HandlerLength = Util.GetInt32(data.data, ad);
             ad += 4;
         }
         if (ex.Flags ==(int) COR_ILEXCEPTION_CLAUSE.EXCEPTION)
         {
             ex.ClassToken = Util.GetInt32(data.data, ad);
         }
         else
         {
             ex.FilterOffset = Util.GetInt32(data.data, ad);
         }
         ad += 4;
         this.EHTable.Add(ex);
     }
 }