diff --git a/Include/Library/OcMachoLib.h b/Include/Library/OcMachoLib.h index e0eba825..b513ce6b 100644 --- a/Include/Library/OcMachoLib.h +++ b/Include/Library/OcMachoLib.h @@ -17,6 +17,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include +typedef struct OC_MACHO_CONTEXT_ OC_MACHO_CONTEXT; + /** Returns the size of a Mach-O Context. @@ -40,7 +42,7 @@ BOOLEAN MachoInitializeContext ( IN CONST MACH_HEADER_64 *MachHeader, IN UINTN FileSize, - OUT VOID *Context + OUT OC_MACHO_CONTEXT *Context ); /** @@ -51,7 +53,7 @@ MachoInitializeContext ( **/ UINT64 MachoGetLastAddress64 ( - IN OUT VOID *Context + IN OUT OC_MACHO_CONTEXT *Context ); /** @@ -64,7 +66,7 @@ MachoGetLastAddress64 ( **/ MACH_UUID_COMMAND * MachoGetUuid64 ( - IN OUT VOID *Context + IN OUT OC_MACHO_CONTEXT *Context ); /** @@ -78,8 +80,8 @@ MachoGetUuid64 ( **/ MACH_SEGMENT_COMMAND_64 * MachoGetSegmentByName64 ( - IN OUT VOID *Context, - IN CONST CHAR8 *SegmentName + IN OUT OC_MACHO_CONTEXT *Context, + IN CONST CHAR8 *SegmentName ); /** @@ -94,7 +96,7 @@ MachoGetSegmentByName64 ( **/ MACH_SECTION_64 * MachoGetSectionByName64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_64 *Segment, IN CONST CHAR8 *SectionName ); @@ -111,9 +113,9 @@ MachoGetSectionByName64 ( **/ MACH_SECTION_64 * MachoGetSegmentSectionByName64 ( - IN OUT VOID *Context, - IN CONST CHAR8 *SegmentName, - IN CONST CHAR8 *SectionName + IN OUT OC_MACHO_CONTEXT *Context, + IN CONST CHAR8 *SegmentName, + IN CONST CHAR8 *SectionName ); /** @@ -128,7 +130,7 @@ MachoGetSegmentSectionByName64 ( **/ MACH_SEGMENT_COMMAND_64 * MachoGetNextSegment64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_64 *Segment OPTIONAL ); @@ -158,7 +160,7 @@ MachoGetFirstSection64 ( **/ MACH_SECTION_64 * MachoGetNextSection64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_64 *Segment, IN CONST MACH_SECTION_64 *Section OPTIONAL ); @@ -174,8 +176,8 @@ MachoGetNextSection64 ( **/ MACH_SECTION_64 * MachoGetSectionByIndex64 ( - IN OUT VOID *Context, - IN UINTN Index + IN OUT OC_MACHO_CONTEXT *Context, + IN UINTN Index ); /** @@ -189,8 +191,8 @@ MachoGetSectionByIndex64 ( **/ MACH_SECTION_64 * MachoGetSectionByAddress64 ( - IN OUT VOID *Context, - IN UINT64 Address + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT64 Address ); /** @@ -224,7 +226,7 @@ MachoSymbolIsDefined ( **/ BOOLEAN MachoSymbolIsLocalDefined ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ); @@ -237,7 +239,7 @@ MachoSymbolIsLocalDefined ( **/ MACH_NLIST_64 * MachoGetLocalDefinedSymbolByName ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Name ); @@ -252,8 +254,8 @@ MachoGetLocalDefinedSymbolByName ( **/ MACH_NLIST_64 * MachoGetSymbolByIndex64 ( - IN OUT VOID *Context, - IN UINT32 Index + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT32 Index ); /** @@ -266,7 +268,7 @@ MachoGetSymbolByIndex64 ( **/ BOOLEAN MachoIsSymbolValueSane64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ); @@ -284,9 +286,9 @@ MachoIsSymbolValueSane64 ( **/ BOOLEAN MachoGetSymbolByExternRelocationOffset64 ( - IN OUT VOID *Context, - IN UINT64 Address, - OUT MACH_NLIST_64 **Symbol + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT64 Address, + OUT MACH_NLIST_64 **Symbol ); /** @@ -301,9 +303,9 @@ MachoGetSymbolByExternRelocationOffset64 ( **/ BOOLEAN MachoRelocateSymbol64 ( - IN OUT VOID *Context, - IN UINT64 LinkAddress, - IN OUT MACH_NLIST_64 *Symbol + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT64 LinkAddress, + IN OUT MACH_NLIST_64 *Symbol ); /** @@ -337,7 +339,7 @@ MachoIsSymbolNamePadslot ( **/ BOOLEAN MachoSymbolIsSmcp64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ); @@ -350,7 +352,7 @@ MachoSymbolIsSmcp64 ( **/ BOOLEAN MachoSymbolIsMetaclassPointer64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ); @@ -367,7 +369,7 @@ MachoSymbolIsMetaclassPointer64 ( **/ BOOLEAN MachoGetClassNameFromSuperMetaClassPointer ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *SmcpSymbol, IN UINTN ClassNameSize, OUT CHAR8 *ClassName @@ -414,7 +416,7 @@ MachoGetFunctionPrefixFromClassName ( **/ BOOLEAN MachoGetClassNameFromMetaClassPointer ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *MetaClassPtrSymbol, IN UINTN ClassNameSize, OUT CHAR8 *ClassName @@ -480,7 +482,7 @@ MachoGetFinalSymbolNameFromClassName ( **/ BOOLEAN MachoSymbolIsVtable64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ); @@ -504,8 +506,8 @@ MachoIsSymbolNameCxx ( **/ UINTN MachoVtableGetNumberOfEntries64 ( - IN OUT VOID *Context, - IN CONST UINT64 *VtableData + IN OUT OC_MACHO_CONTEXT *Context, + IN CONST UINT64 *VtableData ); /** @@ -519,7 +521,7 @@ MachoVtableGetNumberOfEntries64 ( **/ MACH_NLIST_64 * MachoGetMetaclassSymbolFromSmcpSymbol64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Smcp ); @@ -535,7 +537,7 @@ MachoGetMetaclassSymbolFromSmcpSymbol64 ( **/ BOOLEAN MachoGetVtableSymbolsFromSmcp64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *SmcpSymbol, OUT CONST MACH_NLIST_64 **Vtable, OUT CONST MACH_NLIST_64 **MetaVtable diff --git a/Library/OcMachoLib/CxxSymbols.c b/Library/OcMachoLib/CxxSymbols.c index 4b71464b..eebb9679 100644 --- a/Library/OcMachoLib/CxxSymbols.c +++ b/Library/OcMachoLib/CxxSymbols.c @@ -79,20 +79,18 @@ MachoIsSymbolNamePadslot ( **/ BOOLEAN MachoSymbolIsSmcp64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ) { - CONST OC_MACHO_CONTEXT *MachoContext; - CONST CHAR8 *Name; + CONST CHAR8 *Name; ASSERT (Context != NULL); ASSERT (Symbol != NULL); - MachoContext = (CONST OC_MACHO_CONTEXT *)Context; - ASSERT (MachoContext->StringTable != NULL); + ASSERT (Context->StringTable != NULL); - Name = (MachoContext->StringTable + Symbol->UnifiedName.StringIndex); + Name = (Context->StringTable + Symbol->UnifiedName.StringIndex); return (AsciiStrStr (Name, SMCP_TOKEN) != NULL); } @@ -105,20 +103,18 @@ MachoSymbolIsSmcp64 ( **/ BOOLEAN MachoSymbolIsMetaclassPointer64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ) { - CONST OC_MACHO_CONTEXT *MachoContext; CONST CHAR8 *Name; ASSERT (Context != NULL); ASSERT (Symbol != NULL); - MachoContext = (CONST OC_MACHO_CONTEXT *)Context; - ASSERT (MachoContext->StringTable != NULL); + ASSERT (Context->StringTable != NULL); - Name = (MachoContext->StringTable + Symbol->UnifiedName.StringIndex); + Name = (Context->StringTable + Symbol->UnifiedName.StringIndex); return (AsciiStrStr (Name, METACLASS_TOKEN) != NULL); } @@ -135,13 +131,12 @@ MachoSymbolIsMetaclassPointer64 ( **/ BOOLEAN MachoGetClassNameFromSuperMetaClassPointer ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *SmcpSymbol, IN UINTN ClassNameSize, OUT CHAR8 *ClassName ) { - CONST OC_MACHO_CONTEXT *MachoContext; BOOLEAN Result; CONST CHAR8 *SmcpName; UINTN StringSize; @@ -154,8 +149,7 @@ MachoGetClassNameFromSuperMetaClassPointer ( ASSERT (ClassNameSize > 0); ASSERT (ClassName != NULL); - MachoContext = (CONST OC_MACHO_CONTEXT *)Context; - ASSERT (MachoContext->StringTable != NULL); + ASSERT (Context->StringTable != NULL); Result = MachoSymbolIsSmcp64 (Context, SmcpSymbol); if (!Result) { @@ -163,7 +157,7 @@ MachoGetClassNameFromSuperMetaClassPointer ( } SmcpName = ( - MachoContext->StringTable + Context->StringTable + SmcpSymbol->UnifiedName.StringIndex ); PrefixSize = (sizeof (OSOBJ_PREFIX) - sizeof (*OSOBJ_PREFIX)); @@ -264,13 +258,12 @@ MachoGetFunctionPrefixFromClassName ( **/ BOOLEAN MachoGetClassNameFromMetaClassPointer ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *MetaClassPtrSymbol, IN UINTN ClassNameSize, OUT CHAR8 *ClassName ) { - CONST OC_MACHO_CONTEXT *MachoContext; BOOLEAN Result; CONST CHAR8 *MetaClassName; UINTN StringSize; @@ -283,8 +276,7 @@ MachoGetClassNameFromMetaClassPointer ( ASSERT (ClassNameSize > 0); ASSERT (ClassName != NULL); - MachoContext = (CONST OC_MACHO_CONTEXT *)Context; - ASSERT (MachoContext->StringTable != NULL); + ASSERT (Context->StringTable != NULL); Result = MachoSymbolIsMetaclassPointer64 (Context, MetaClassPtrSymbol); if (!Result) { @@ -292,7 +284,7 @@ MachoGetClassNameFromMetaClassPointer ( } MetaClassName = ( - MachoContext->StringTable + Context->StringTable + MetaClassPtrSymbol->UnifiedName.StringIndex ); PrefixSize = (sizeof (OSOBJ_PREFIX) - sizeof (*OSOBJ_PREFIX)); @@ -481,20 +473,18 @@ MachoGetFinalSymbolNameFromClassName ( **/ BOOLEAN MachoSymbolIsVtable64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ) { - CONST OC_MACHO_CONTEXT *MachoContext; CONST CHAR8 *Name; ASSERT (Context != NULL); ASSERT (Symbol != NULL); - MachoContext = (CONST OC_MACHO_CONTEXT *)Context; - ASSERT (MachoContext->StringTable != NULL); + ASSERT (Context->StringTable != NULL); - Name = (MachoContext->StringTable + Symbol->UnifiedName.StringIndex); + Name = (Context->StringTable + Symbol->UnifiedName.StringIndex); // // Implicitely checks for METACLASS_VTABLE_PREFIX. // @@ -525,8 +515,8 @@ MachoIsSymbolNameCxx ( **/ UINTN MachoVtableGetNumberOfEntries64 ( - IN OUT VOID *Context, - IN CONST UINT64 *VtableData + IN OUT OC_MACHO_CONTEXT *Context, + IN CONST UINT64 *VtableData ) { UINTN Index; @@ -557,7 +547,7 @@ MachoVtableGetNumberOfEntries64 ( **/ MACH_NLIST_64 * MachoGetMetaclassSymbolFromSmcpSymbol64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Smcp ) { @@ -591,7 +581,7 @@ MachoGetMetaclassSymbolFromSmcpSymbol64 ( **/ BOOLEAN MachoGetVtableSymbolsFromSmcp64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *SmcpSymbol, OUT CONST MACH_NLIST_64 **Vtable, OUT CONST MACH_NLIST_64 **MetaVtable diff --git a/Library/OcMachoLib/Header.c b/Library/OcMachoLib/Header.c index c4738080..264e7497 100644 --- a/Library/OcMachoLib/Header.c +++ b/Library/OcMachoLib/Header.c @@ -48,14 +48,13 @@ BOOLEAN MachoInitializeContext ( IN CONST MACH_HEADER_64 *MachHeader, IN UINTN FileSize, - OUT VOID *Context + OUT OC_MACHO_CONTEXT *Context ) { UINTN TopOfCommands; UINTN Index; CONST MACH_LOAD_COMMAND *Command; UINTN CommandsSize; - OC_MACHO_CONTEXT *MachoContext; ASSERT (MachHeader != NULL); ASSERT (FileSize > 0); @@ -109,9 +108,8 @@ MachoInitializeContext ( return FALSE; } - MachoContext = (OC_MACHO_CONTEXT *)Context; - MachoContext->MachHeader = MachHeader; - MachoContext->FileSize = FileSize; + Context->MachHeader = MachHeader; + Context->FileSize = FileSize; return TRUE; } @@ -124,7 +122,7 @@ MachoInitializeContext ( **/ UINT64 MachoGetLastAddress64 ( - IN OUT VOID *Context + IN OUT OC_MACHO_CONTEXT *Context ) { UINT64 LastAddress; @@ -165,7 +163,7 @@ MachoGetLastAddress64 ( STATIC MACH_LOAD_COMMAND * InternalGetNextCommand64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN MACH_LOAD_COMMAND_TYPE LoadCommandType, IN CONST MACH_LOAD_COMMAND *LoadCommand OPTIONAL ) @@ -215,7 +213,7 @@ InternalGetNextCommand64 ( **/ MACH_UUID_COMMAND * MachoGetUuid64 ( - IN OUT VOID *Context + IN OUT OC_MACHO_CONTEXT *Context ) { MACH_UUID_COMMAND *UuidCommand; @@ -248,8 +246,8 @@ MachoGetUuid64 ( **/ MACH_SEGMENT_COMMAND_64 * MachoGetSegmentByName64 ( - IN OUT VOID *Context, - IN CONST CHAR8 *SegmentName + IN OUT OC_MACHO_CONTEXT *Context, + IN CONST CHAR8 *SegmentName ) { CONST MACH_SEGMENT_COMMAND_64 *Segment; @@ -288,7 +286,7 @@ MachoGetSegmentByName64 ( **/ MACH_SECTION_64 * MachoGetSectionByName64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_64 *Segment, IN CONST CHAR8 *SectionName ) @@ -349,9 +347,9 @@ MachoGetSectionByName64 ( **/ MACH_SECTION_64 * MachoGetSegmentSectionByName64 ( - IN OUT VOID *Context, - IN CONST CHAR8 *SegmentName, - IN CONST CHAR8 *SectionName + IN OUT OC_MACHO_CONTEXT *Context, + IN CONST CHAR8 *SegmentName, + IN CONST CHAR8 *SectionName ) { CONST MACH_SEGMENT_COMMAND_64 *Segment; @@ -381,25 +379,23 @@ MachoGetSegmentSectionByName64 ( **/ MACH_SEGMENT_COMMAND_64 * MachoGetNextSegment64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_64 *Segment OPTIONAL ) { MACH_SEGMENT_COMMAND_64 *NextSegment; - CONST OC_MACHO_CONTEXT *MachoContext; CONST MACH_HEADER_64 *MachHeader; UINTN TopOfCommands; UINTN TopOfSections; ASSERT (Context != NULL); - MachoContext = (CONST OC_MACHO_CONTEXT *)Context; - ASSERT (MachoContext->MachHeader != NULL); - ASSERT (MachoContext->FileSize > 0); + ASSERT (Context->MachHeader != NULL); + ASSERT (Context->FileSize > 0); if (Segment != NULL) { - MachHeader = MachoContext->MachHeader; + MachHeader = Context->MachHeader; TopOfCommands = ((UINTN)MachHeader->Commands + MachHeader->CommandsSize); ASSERT ( ((UINTN)Segment >= (UINTN)&MachHeader->Commands[0]) @@ -417,7 +413,7 @@ MachoGetNextSegment64 ( if ((NextSegment != NULL) && (NextSegment->CommandSize >= sizeof (*NextSegment))) { TopOfSections = (UINTN)&NextSegment[NextSegment->NumSections]; - if (((NextSegment->FileOffset + NextSegment->FileSize) > MachoContext->FileSize) + if (((NextSegment->FileOffset + NextSegment->FileSize) > Context->FileSize) || (((UINTN)NextSegment + NextSegment->CommandSize) < TopOfSections)) { return NULL; } @@ -439,13 +435,11 @@ MachoGetNextSegment64 ( **/ MACH_SECTION_64 * MachoGetNextSection64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_64 *Segment, IN CONST MACH_SECTION_64 *Section OPTIONAL ) { - CONST OC_MACHO_CONTEXT *MachoContext; - ASSERT (Context != NULL); ASSERT (Segment != NULL); @@ -458,11 +452,10 @@ MachoGetNextSection64 ( Section = (MACH_SECTION_64 *)&Segment->Sections[0]; } - MachoContext = (CONST OC_MACHO_CONTEXT *)Context; - ASSERT (MachoContext->FileSize > 0); + ASSERT (Context->FileSize > 0); if (((UINTN)(Section - Segment->Sections) < Segment->NumSections) - && ((Section->Offset + Section->Size) <= MachoContext->FileSize)) { + && ((Section->Offset + Section->Size) <= Context->FileSize)) { return (MACH_SECTION_64 *)Section; } @@ -480,8 +473,8 @@ MachoGetNextSection64 ( **/ MACH_SECTION_64 * MachoGetSectionByIndex64 ( - IN OUT VOID *Context, - IN UINTN Index + IN OUT OC_MACHO_CONTEXT *Context, + IN UINTN Index ) { CONST MACH_SEGMENT_COMMAND_64 *Segment; @@ -517,8 +510,8 @@ MachoGetSectionByIndex64 ( **/ MACH_SECTION_64 * MachoGetSectionByAddress64 ( - IN OUT VOID *Context, - IN UINT64 Address + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT64 Address ) { CONST MACH_SEGMENT_COMMAND_64 *Segment; @@ -553,14 +546,14 @@ MachoGetSectionByAddress64 ( /** Retrieves the SYMTAB command. - @param[in,out] MachoContext Context of the Mach-O. + @param[in,out] Context Context of the Mach-O. @retval NULL NULL is returned on failure. **/ BOOLEAN InternalRetrieveSymtabs64 ( - IN OUT OC_MACHO_CONTEXT *MachoContext + IN OUT OC_MACHO_CONTEXT *Context ) { UINTN MachoAddress; @@ -571,16 +564,16 @@ InternalRetrieveSymtabs64 ( UINTN OffsetTop; UINTN TopOfSymbols; - ASSERT (MachoContext != NULL); - ASSERT (MachoContext->MachHeader != NULL); - ASSERT (MachoContext->FileSize > 0); - ASSERT (MachoContext->SymbolTable == NULL); + ASSERT (Context != NULL); + ASSERT (Context->MachHeader != NULL); + ASSERT (Context->FileSize > 0); + ASSERT (Context->SymbolTable == NULL); // // Retrieve SYMTAB. // Symtab = (MACH_SYMTAB_COMMAND *)( InternalGetNextCommand64 ( - (VOID *)MachoContext, + (VOID *)Context, MACH_LOAD_COMMAND_SYMTAB, NULL ) @@ -589,7 +582,7 @@ InternalRetrieveSymtabs64 ( return FALSE; } - FileSize = MachoContext->FileSize; + FileSize = Context->FileSize; TopOfSymbols = Symtab->SymbolsOffset; TopOfSymbols += (Symtab->NumSymbols * sizeof (MACH_NLIST_64)); @@ -599,7 +592,7 @@ InternalRetrieveSymtabs64 ( return FALSE; } - MachoAddress = (UINTN)MachoContext->MachHeader; + MachoAddress = (UINTN)Context->MachHeader; StringTable = (CONST CHAR8 *)(MachoAddress + Symtab->StringsOffset); if (StringTable[(Symtab->StringsSize / sizeof (*StringTable)) - 1] != '\0') { @@ -610,7 +603,7 @@ InternalRetrieveSymtabs64 ( // DySymtab = (MACH_DYSYMTAB_COMMAND *)( InternalGetNextCommand64 ( - (VOID *)MachoContext, + (VOID *)Context, MACH_LOAD_COMMAND_DYSYMTAB, NULL ) @@ -639,22 +632,22 @@ InternalRetrieveSymtabs64 ( // // Store the symbol information. // - MachoContext->NumSymbols = Symtab->NumSymbols; - MachoContext->SymbolTable = (CONST MACH_NLIST_64 *)( + Context->NumSymbols = Symtab->NumSymbols; + Context->SymbolTable = (CONST MACH_NLIST_64 *)( MachoAddress + Symtab->SymbolsOffset ); - MachoContext->StringsSize = Symtab->StringsSize; - MachoContext->StringTable = StringTable; + Context->StringsSize = Symtab->StringsSize; + Context->StringTable = StringTable; - MachoContext->IndirectSymbolTable = (CONST MACH_NLIST_64 *)( + Context->IndirectSymbolTable = (CONST MACH_NLIST_64 *)( MachoAddress + DySymtab->IndirectSymbolsOffset ); - MachoContext->LocalRelocations = (CONST MACH_RELOCATION_INFO *)( + Context->LocalRelocations = (CONST MACH_RELOCATION_INFO *)( MachoAddress + DySymtab->LocalRelocationsOffset ); - MachoContext->ExternRelocations = (CONST MACH_RELOCATION_INFO *)( + Context->ExternRelocations = (CONST MACH_RELOCATION_INFO *)( MachoAddress + DySymtab->ExternalRelocationsOffset ); diff --git a/Library/OcMachoLib/OcMachoLibInternal.h b/Library/OcMachoLib/OcMachoLibInternal.h index 82721f2d..63e66327 100644 --- a/Library/OcMachoLib/OcMachoLibInternal.h +++ b/Library/OcMachoLib/OcMachoLibInternal.h @@ -20,7 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. /// /// Context used to refer to a Mach-O. /// -typedef struct { +struct OC_MACHO_CONTEXT_ { CONST MACH_HEADER_64 *MachHeader; UINTN FileSize; UINT32 NumSymbols; @@ -31,19 +31,19 @@ typedef struct { CONST MACH_NLIST_64 *IndirectSymbolTable; CONST MACH_RELOCATION_INFO *LocalRelocations; CONST MACH_RELOCATION_INFO *ExternRelocations; -} OC_MACHO_CONTEXT; +}; /** Retrieves the SYMTAB command. - @param[in] MachoContext Context of the Mach-O. + @param[in] Context Context of the Mach-O. @retval NULL NULL is returned on failure. **/ BOOLEAN InternalRetrieveSymtabs64 ( - IN OC_MACHO_CONTEXT *MachoContext + IN OUT OC_MACHO_CONTEXT *Context ); /** @@ -57,8 +57,8 @@ InternalRetrieveSymtabs64 ( **/ MACH_RELOCATION_INFO * InternalGetExternalRelocationByOffset ( - IN OUT VOID *Context, - IN UINT64 Address + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT64 Address ); #endif // OC_MACHO_LIB_INTERNAL_H_ diff --git a/Library/OcMachoLib/Relocations.c b/Library/OcMachoLib/Relocations.c index 8f0767dc..4e368445 100644 --- a/Library/OcMachoLib/Relocations.c +++ b/Library/OcMachoLib/Relocations.c @@ -76,31 +76,28 @@ MachoPreserveRelocationIntel64 ( **/ MACH_RELOCATION_INFO * InternalGetExternalRelocationByOffset ( - IN OUT VOID *Context, - IN UINT64 Address + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT64 Address ) { - OC_MACHO_CONTEXT *MachoContext; UINTN Index; CONST MACH_RELOCATION_INFO *Relocation; ASSERT (Context != NULL); - - MachoContext = (OC_MACHO_CONTEXT *)Context; // // Assumption: 64-bit. // - if ((MachoContext->SymbolTable == NULL) - && !InternalRetrieveSymtabs64 (MachoContext)) { + if ((Context->SymbolTable == NULL) + && !InternalRetrieveSymtabs64 (Context)) { return NULL; } - ASSERT (MachoContext->DySymtab != NULL); - ASSERT (MachoContext->ExternRelocations != NULL); + ASSERT (Context->DySymtab != NULL); + ASSERT (Context->ExternRelocations != NULL); for ( - Index = 0, Relocation = &MachoContext->ExternRelocations[0]; - Index < MachoContext->DySymtab->NumExternalRelocations; + Index = 0, Relocation = &Context->ExternRelocations[0]; + Index < Context->DySymtab->NumExternalRelocations; ++Index, ++Relocation ) { // diff --git a/Library/OcMachoLib/Symbols.c b/Library/OcMachoLib/Symbols.c index ad31ff7a..ea70460b 100644 --- a/Library/OcMachoLib/Symbols.c +++ b/Library/OcMachoLib/Symbols.c @@ -25,22 +25,22 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. STATIC BOOLEAN InternalSymbolIsSane ( - IN OUT OC_MACHO_CONTEXT *MachoContext, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ) { - ASSERT (MachoContext != NULL); + ASSERT (Context != NULL); ASSERT (Symbol != NULL); - ASSERT (MachoContext->SymbolTable != NULL); - ASSERT (MachoContext->NumSymbols > 0); - ASSERT ((Symbol > MachoContext->SymbolTable) - && (Symbol <= &MachoContext->SymbolTable[MachoContext->NumSymbols - 1])); + ASSERT (Context->SymbolTable != NULL); + ASSERT (Context->NumSymbols > 0); + ASSERT ((Symbol > Context->SymbolTable) + && (Symbol <= &Context->SymbolTable[Context->NumSymbols - 1])); // // Symbol->Section is implicitly verified by MachoGetSectionByIndex64() when // passed to it. // - if (Symbol->UnifiedName.StringIndex >= MachoContext->StringsSize) { + if (Symbol->UnifiedName.StringIndex >= Context->StringsSize) { return FALSE; } @@ -57,7 +57,7 @@ InternalSymbolIsSane ( **/ BOOLEAN MachoIsSymbolValueSane64 ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ) { @@ -159,11 +159,10 @@ MachoSymbolIsDefined ( **/ BOOLEAN MachoSymbolIsLocalDefined ( - IN OUT VOID *Context, + IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol ) { - CONST OC_MACHO_CONTEXT *MachoContext; CONST MACH_DYSYMTAB_COMMAND *DySymtab; CONST MACH_NLIST_64 *UndefinedSymbols; CONST MACH_NLIST_64 *UndefinedSymbolsTop; @@ -173,9 +172,8 @@ MachoSymbolIsLocalDefined ( ASSERT (Context != NULL); ASSERT (Symbol != NULL); - MachoContext = (CONST OC_MACHO_CONTEXT *)Context; - DySymtab = MachoContext->DySymtab; - ASSERT (MachoContext->SymbolTable != NULL); + DySymtab = Context->DySymtab; + ASSERT (Context->SymbolTable != NULL); ASSERT (DySymtab != NULL); if (DySymtab->NumUndefinedSymbols == 0) { @@ -186,14 +184,14 @@ MachoSymbolIsLocalDefined ( // no information on whether the symbol has been solved explicitely, check // its storage location for Undefined or Indirect. // - UndefinedSymbols = &MachoContext->SymbolTable[DySymtab->UndefinedSymbolsIndex]; + UndefinedSymbols = &Context->SymbolTable[DySymtab->UndefinedSymbolsIndex]; UndefinedSymbolsTop = &UndefinedSymbols[DySymtab->NumUndefinedSymbols]; if ((Symbol >= UndefinedSymbols) && (Symbol < UndefinedSymbolsTop)) { return FALSE; } - IndirectSymbols = MachoContext->IndirectSymbolTable; + IndirectSymbols = Context->IndirectSymbolTable; IndirectSymbolsTop = &IndirectSymbols[DySymtab->NumIndirectSymbols]; if ((Symbol >= IndirectSymbols) && (Symbol < IndirectSymbolsTop)) { @@ -214,28 +212,25 @@ MachoSymbolIsLocalDefined ( **/ MACH_NLIST_64 * MachoGetSymbolByIndex64 ( - IN OUT VOID *Context, - IN UINT32 Index + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT32 Index ) { - OC_MACHO_CONTEXT *MachoContext; CONST MACH_NLIST_64 *Symbol; ASSERT (Context != NULL); - MachoContext = (OC_MACHO_CONTEXT *)Context; - - if ((MachoContext->SymbolTable == NULL) - && !InternalRetrieveSymtabs64 (MachoContext)) { + if ((Context->SymbolTable == NULL) + && !InternalRetrieveSymtabs64 (Context)) { return NULL; } - ASSERT (MachoContext->SymbolTable != NULL); - ASSERT (MachoContext->NumSymbols > 0); + ASSERT (Context->SymbolTable != NULL); + ASSERT (Context->NumSymbols > 0); - if (Index < MachoContext->NumSymbols) { - Symbol = &MachoContext->SymbolTable[Index]; - if (InternalSymbolIsSane (MachoContext, Symbol)) { + if (Index < Context->NumSymbols) { + Symbol = &Context->SymbolTable[Index]; + if (InternalSymbolIsSane (Context, Symbol)) { return (MACH_NLIST_64 *)Symbol; } } else { @@ -259,25 +254,22 @@ MachoGetSymbolByIndex64 ( **/ BOOLEAN MachoGetSymbolByExternRelocationOffset64 ( - IN OUT VOID *Context, - IN UINT64 Address, - OUT MACH_NLIST_64 **Symbol + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT64 Address, + OUT MACH_NLIST_64 **Symbol ) { CONST MACH_NLIST_64 *Sym; - OC_MACHO_CONTEXT *MachoContext; CONST MACH_RELOCATION_INFO *Relocation; ASSERT (Context != NULL); ASSERT (Symbol != NULL); - MachoContext = (OC_MACHO_CONTEXT *)Context; - Relocation = InternalGetExternalRelocationByOffset (Context, Address); if (Relocation != NULL) { Sym = MachoGetSymbolByIndex64 (Context, Relocation->SymbolNumber); - if ((Sym != NULL) && InternalSymbolIsSane (MachoContext, Sym)) { + if ((Sym != NULL) && InternalSymbolIsSane (Context, Sym)) { *Symbol = (MACH_NLIST_64 *)Sym; } else { *Symbol = NULL; @@ -338,11 +330,10 @@ InternalGetSymbolByName ( **/ MACH_NLIST_64 * MachoGetLocalDefinedSymbolByName ( - IN OUT VOID *Context, - IN CONST CHAR8 *Name + IN OUT OC_MACHO_CONTEXT *Context, + IN CONST CHAR8 *Name ) { - OC_MACHO_CONTEXT *MachoContext; CONST MACH_NLIST_64 *SymbolTable; CONST CHAR8 *StringTable; CONST MACH_DYSYMTAB_COMMAND *DySymtab; @@ -351,16 +342,14 @@ MachoGetLocalDefinedSymbolByName ( ASSERT (Context != NULL); ASSERT (Name != NULL); - MachoContext = (OC_MACHO_CONTEXT *)Context; - - if ((MachoContext->SymbolTable == NULL) - && !InternalRetrieveSymtabs64 (MachoContext)) { + if ((Context->SymbolTable == NULL) + && !InternalRetrieveSymtabs64 (Context)) { return NULL; } - SymbolTable = MachoContext->SymbolTable; - StringTable = MachoContext->StringTable; - DySymtab = MachoContext->DySymtab; + SymbolTable = Context->SymbolTable; + StringTable = Context->StringTable; + DySymtab = Context->DySymtab; ASSERT (SymbolTable != NULL); ASSERT (StringTable != NULL); ASSERT (DySymtab != NULL); @@ -380,7 +369,7 @@ MachoGetLocalDefinedSymbolByName ( ); } - if ((Symbol != NULL) && !InternalSymbolIsSane (MachoContext, Symbol)) { + if ((Symbol != NULL) && !InternalSymbolIsSane (Context, Symbol)) { return NULL; } @@ -399,9 +388,9 @@ MachoGetLocalDefinedSymbolByName ( **/ BOOLEAN MachoRelocateSymbol64 ( - IN OUT VOID *Context, - IN UINT64 LinkAddress, - IN OUT MACH_NLIST_64 *Symbol + IN OUT OC_MACHO_CONTEXT *Context, + IN UINT64 LinkAddress, + IN OUT MACH_NLIST_64 *Symbol ) { CONST MACH_SECTION_64 *Section;