2016-07-08 6 views
0

Wie erkennen Sie, ob IMAGE_COR_ILMETHOD_SECT_EH Small oder Fat verwenden muss? Auch ich interessiere mich für andere interne CLR Struktur/Opcode Details. Die Antwort unten beantwortet diese und viele andere Fragen.CLR haben Fett oder kleine Ausnahmerahmen?

/*RVA:0*/ typedef union IMAGE_COR_ILMETHOD{ 
IMAGE_COR_ILMETHOD_TINY  Tiny; 
IMAGE_COR_ILMETHOD_FAT  Fat;} IMAGE_COR_ILMETHOD; 
/*PC = RVA + sizeof(IMAGE_COR_ILMETHOD) = 12 or 4 byte*/ ... Code 
/*EH = PC+CodeSize */typedef union IMAGE_COR_ILMETHOD_SECT_EH{ 
    IMAGE_COR_ILMETHOD_SECT_EH_SMALL Small; 
    IMAGE_COR_ILMETHOD_SECT_EH_FAT Fat; 
} IMAGE_COR_ILMETHOD_SECT_EH; 

https://github.com/dotnet/coreclr/blob/master/src/inc/corhdr.h

zum Beispiel

public static Main(string args[]){ 
    int i=0; 
    try{ 
    Console.Write("OK"); 
    } catch(Exception){ 
    i++ 
    } 
0000 4D 5A 90 00 MZ-header 
0250 2A 02 17 8C 06 00 00 01 51 2a 00 
RVA: 1B 30 02 00 // IMAGE_COR_ILMETHOD_FAT 
    1D 00 00 00 CodeSize= 29 
    01 00 00 11 Locals = 11000001 
PC0: 00 16 0A    i=0 
PC3 00 72 01 00 00 70  try{ 
    28 04 00 00 0A  call Console.Write 
    00 00 DE 09 
PC12:26 00 06 17 58 0A 00 DE 00 00 2A (2A is ret command)  

    00 00 00 01 10 00 // IMAGE_COR_ILMETHOD_SECT_EH ??? 1=count 

    00 00  CorExceptionFlag Flags 
    03 00  TryOffset 
    0F   TryLength 
    12 00  HandlerOffset 
    09   HandlerLength 
    08 00 00 01 ClassToken 

In diesem Fall haben wir kleinen EH-Rahmen. Wie erkennen wir einen kleinen oder dicken Rahmen?

struct IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_SMALL{ 
     CorExceptionFlag Flags   : 16; 
     unsigned   TryOffset  : 16; 
     unsigned   TryLength  : 8; // relative to start of try block 
     unsigned   HandlerOffset : 16; 
     unsigned   HandlerLength : 8; // relative to start of handler 
     union { 
     DWORD  ClassToken; 
     DWORD  FilterOffset; 
     }; 
    } IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_SMALL; 

typedef struct IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_FAT 
{ 
    CorExceptionFlag Flags; 
    DWORD    TryOffset; 
    DWORD    TryLength;  // relative to start of try block 
    DWORD    HandlerOffset; 
    DWORD    HandlerLength; // relative to start of handler 
    union { 
    DWORD   ClassToken;  // use for type-based exception handlers 
    DWORD   FilterOffset; // use for filter-based exception handlers (COR_ILEXCEPTION_FILTER is set) 
}; 
} IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_FAT; 

Antwort

1

Dies ist in Abschnitt II Abschnitt 25.4.5 von ECMA-335 abgedeckt.

Wenn CorILMethod_Sect_FatFormat Bit (0x40) im Feld Kind (das erste Byte der Struktur) festgelegt ist, sollten Sie Fett verwenden, ansonsten klein. Das Kind Feld kann über Small.SectSmall.Kind oder Fat.SectFat.Kind zugegriffen werden, sollte entweder funktionieren.