void ILWriter::FixSEHSections()

in src/profiler/src/ILWriter.cpp [299:349]


void ILWriter::FixSEHSections(BYTE* codeBuffer, ULONG offset)
{
    COR_ILMETHOD_FAT* fatMethod = (COR_ILMETHOD_FAT*)codeBuffer;

    const COR_ILMETHOD_SECT* sections = fatMethod->GetSect();

    while (sections)
    {
        if (sections->Kind() == CorILMethod_Sect_EHTable)
        {
            COR_ILMETHOD_SECT_EH* eh = (COR_ILMETHOD_SECT_EH*)sections;

            if (eh->IsFat())
            {
                COR_ILMETHOD_SECT_EH_FAT* EHFat = (COR_ILMETHOD_SECT_EH_FAT*)eh;

                for (UINT i = 0; i < eh->EHCount(); i++)
                {
                    IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_FAT* clause = &EHFat->Clauses[i];

                    if (clause->Flags & COR_ILEXCEPTION_CLAUSE_FILTER)
                    {
                        clause->FilterOffset += offset;
                    }

                    clause->TryOffset += offset;
                    clause->HandlerOffset += offset;
                }
            }
            else
            {
                COR_ILMETHOD_SECT_EH_SMALL* EHSmall = (COR_ILMETHOD_SECT_EH_SMALL*)eh;

                for (UINT i = 0; i < eh->EHCount(); i++)
                {
                    IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_SMALL* clause = &EHSmall->Clauses[i];

                    if (clause->Flags & COR_ILEXCEPTION_CLAUSE_FILTER)
                    {
                        clause->FilterOffset += offset;
                    }

                    clause->TryOffset += offset;
                    clause->HandlerOffset += offset;
                }
            }
        }

        sections = sections->Next();
    }
}