コード例 #1
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);
     }
 }
コード例 #2
0
ファイル: MethodData.cs プロジェクト: higepon/mona
 private int GetInfo(StringBuilder sb, ExceptionHandlingClauses ex, int ad, bool isFat)
 {
     sb.Append("  *** Exception Handling Clauses ***\r\n\r\n");
     sb.AppendFormat("{0:X8}:", ad);
     string f = string.Format(isFat ? "{0:X8} " : "{0:X4} ", ex.Flags);
     f += string.Format("({0})",(COR_ILEXCEPTION_CLAUSE) ex.Flags);
     sb.AppendFormat("{0,-16} {1}\r\n", f, "Flags: Flags, see below.");
     ad += isFat ? 4:
     2;
     sb.AppendFormat("{0:X8}:", ad);
     sb.AppendFormat(isFat ? "{0,-16:X8} " : "{0,-16:X4} ", ex.TryOffset);
     sb.Append("TryOffset: Offset in bytes of try block from start of the header.\r\n");
     ad += isFat ? 4:
     2;
     sb.AppendFormat("{0:X8}:", ad);
     sb.AppendFormat(isFat ? "{0,-16:X8} " : "{0,-16:X2} ", ex.TryLength);
     sb.Append("TryLength: Length in bytes of the try block\r\n");
     ad += isFat ? 4:
     1;
     sb.AppendFormat("{0:X8}:", ad);
     sb.AppendFormat(isFat ? "{0,-16:X8} " : "{0,-16:X4} ", ex.HandlerOffset);
     sb.Append("HandlerOffset: Location of the handler for this try block\r\n");
     ad += isFat ? 4:
     2;
     sb.AppendFormat("{0:X8}:", ad);
     sb.AppendFormat(isFat ? "{0,-16:X8} " : "{0,-16:X2} ", ex.HandlerLength);
     sb.Append("HandlerLength: Size of the handler code in bytes\r\n");
     ad += isFat ? 4:
     1;
     sb.AppendFormat("{0:X8}:", ad);
     if (ex.Flags ==(int) COR_ILEXCEPTION_CLAUSE.EXCEPTION)
     {
         string ct;
         if (ex.ClassToken == 0)
         {
             ct = string.Format("{0:X8} (null)", ex.ClassToken);
         }
         else
         {
             TableBase tb = this.data.idxm.GetTable(ex.ClassToken);
             ct = string.Format("{0:X8} ({1})", ex.ClassToken, tb.GetTitle());
         }
         sb.AppendFormat("{0,-16:X8} {1}\r\n", ct, "ClassToken: Meta data token for a type-based exception handler");
     }
     else
     {
         sb.AppendFormat("{0,-16:X8} {1}\r\n", ex.FilterOffset, "FilterOffset: Offset in method body for filter-based exception handler");
     }
     ad += 4;
     return ad;
 }