static void pex64_get_unwind_info (bfd *abfd, struct pex64_unwind_info *ui, void *data) { struct external_pex64_unwind_info *ex_ui = (struct external_pex64_unwind_info *) data; bfd_byte *ex_dta = (bfd_byte *) data; memset (ui, 0, sizeof (struct pex64_unwind_info)); ui->Version = PEX64_UWI_VERSION (ex_ui->Version_Flags); ui->Flags = PEX64_UWI_FLAGS (ex_ui->Version_Flags); ui->SizeOfPrologue = (bfd_vma) ex_ui->SizeOfPrologue; ui->CountOfCodes = (bfd_vma) ex_ui->CountOfCodes; ui->FrameRegister = PEX64_UWI_FRAMEREG (ex_ui->FrameRegisterOffset); ui->FrameOffset = PEX64_UWI_FRAMEOFF (ex_ui->FrameRegisterOffset); ui->sizeofUnwindCodes = PEX64_UWI_SIZEOF_UWCODE_ARRAY (ui->CountOfCodes); ui->SizeOfBlock = ui->sizeofUnwindCodes + 4; ui->rawUnwindCodes = &ex_dta[4]; ex_dta += ui->SizeOfBlock; switch (ui->Flags) { case UNW_FLAG_EHANDLER: ui->rva_ExceptionHandler = bfd_get_32 (abfd, ex_dta); break; case UNW_FLAG_UHANDLER: ui->rva_TerminationHandler = bfd_get_32 (abfd, ex_dta); break; case UNW_FLAG_FHANDLER: ui->rva_FrameHandler = bfd_get_32 (abfd, ex_dta); ui->FrameHandlerArgument = bfd_get_32 (abfd, ex_dta + 4); ui->SizeOfBlock += 8; return; case UNW_FLAG_CHAININFO: ui->rva_FunctionEntry = bfd_get_32 (abfd, ex_dta); ui->SizeOfBlock += 4; return; default: return; } ex_dta += 4; ui->SizeOfBlock += 8; ui->CountOfScopes = bfd_get_32 (abfd, ex_dta); ex_dta += 4; ui->rawScopeEntries = ex_dta; ui->SizeOfBlock += (ui->CountOfScopes * PEX64_SCOPE_ENTRY_SIZE); }
static void pex64_get_unwind_info (bfd *abfd, struct pex64_unwind_info *ui, void *data) { struct external_pex64_unwind_info *ex_ui = (struct external_pex64_unwind_info *) data; bfd_byte *ex_dta = (bfd_byte *) data; memset (ui, 0, sizeof (struct pex64_unwind_info)); ui->Version = PEX64_UWI_VERSION (ex_ui->Version_Flags); ui->Flags = PEX64_UWI_FLAGS (ex_ui->Version_Flags); ui->SizeOfPrologue = (bfd_vma) ex_ui->SizeOfPrologue; ui->CountOfCodes = (bfd_vma) ex_ui->CountOfCodes; ui->FrameRegister = PEX64_UWI_FRAMEREG (ex_ui->FrameRegisterOffset); ui->FrameOffset = PEX64_UWI_FRAMEOFF (ex_ui->FrameRegisterOffset); ui->sizeofUnwindCodes = PEX64_UWI_SIZEOF_UWCODE_ARRAY (ui->CountOfCodes); ui->SizeOfBlock = ui->sizeofUnwindCodes + 4; ui->rawUnwindCodes = &ex_dta[4]; ex_dta += ui->SizeOfBlock; switch (ui->Flags) { case UNW_FLAG_CHAININFO: ui->rva_BeginAddress = bfd_get_32 (abfd, ex_dta + 0); ui->rva_EndAddress = bfd_get_32 (abfd, ex_dta + 4); ui->rva_UnwindData = bfd_get_32 (abfd, ex_dta + 8); ui->SizeOfBlock += 12; return; case UNW_FLAG_EHANDLER: case UNW_FLAG_UHANDLER: case UNW_FLAG_FHANDLER: ui->rva_ExceptionHandler = bfd_get_32 (abfd, ex_dta); ui->SizeOfBlock += 4; return; default: return; } }