17#include <Library/BaseLib.h>
18#include <Library/BaseMemoryLib.h>
19#include <Library/DebugLib.h>
20#include <Library/MemoryAllocationLib.h>
42 IN CONST CHAR8 *Identifier OPTIONAL,
49 CONST CHAR8 *KextPlistKey;
51 CONST CHAR8 *KextIdentifier;
54 CONST CHAR8 *CompatibleVersion;
60 UINT64 CalculatedSourceSize;
71 KextIdentifier = NULL;
72 BundleLibraries = NULL;
73 BundleLibraries64 = NULL;
74 CompatibleVersion = NULL;
82 Found = Identifier == NULL;
87 if (Prelinked != NULL) {
88 Is32Bit = Prelinked->Is32Bit;
92 for (FieldIndex = 0; FieldIndex < FieldCount; ++FieldIndex) {
94 if (KextPlistKey == NULL) {
104 if (!Found && (AsciiStrCmp (KextIdentifier, Identifier) == 0)) {
112 BundleLibraries = KextPlistValue;
118 BundleLibraries64 = BundleLibraries = KextPlistValue;
125 if (CompatibleVersion == NULL) {
129 if (!
PlistIntegerValue (KextPlistValue, &VirtualBase,
sizeof (VirtualBase), TRUE)) {
133 if (!
PlistIntegerValue (KextPlistValue, &VirtualKmod,
sizeof (VirtualKmod), TRUE)) {
137 if (!
PlistIntegerValue (KextPlistValue, &SourceBase,
sizeof (SourceBase), TRUE)) {
141 if (!
PlistIntegerValue (KextPlistValue, &SourceSize,
sizeof (SourceSize), TRUE)) {
149 if (!
PlistIntegerValue (KextPlistValue, &KxldStateSize,
sizeof (KxldStateSize), TRUE)) {
154 if ( (KextIdentifier != NULL)
155 && (((BundleLibraries64 != NULL) && !Is32Bit) || ((BundleLibraries != NULL) && Is32Bit))
156 && (CompatibleVersion != NULL)
157 && ( (Prelinked == NULL)
158 || ( (Prelinked != NULL)
159 && (VirtualBase != 0)
160 && (VirtualKmod != 0)
164 && (KxldStateSize != 0))))
173 if (!Found || (KextIdentifier == NULL) || (SourceBase < VirtualBase)) {
180 if (Prelinked != NULL) {
181 HasExe = VirtualBase != 0 && SourceBase != 0 && SourceSize != 0 && SourceSize <= MAX_UINT32;
182 IsKpi = VirtualBase == 0 && SourceBase == 0 && SourceSize == 0
183 && KxldState != 0 && KxldStateSize != 0 && !Prelinked->IsKernelCollection;
184 if (!IsKpi && !HasExe) {
189 if ((Prelinked != NULL) && Prelinked->IsKernelCollection) {
190 CalculatedSourceSize =
KcGetKextSize (Prelinked, SourceBase);
191 if ((CalculatedSourceSize < MAX_UINT32) && (CalculatedSourceSize > SourceSize)) {
194 "OCAK: Patching invalid size %Lx with %Lx for %a\n",
196 CalculatedSourceSize,
199 SourceSize = CalculatedSourceSize;
203 if ((Prelinked != NULL) && HasExe) {
204 if (Prelinked->IsKernelCollection) {
207 BaseSegment = Prelinked->PrelinkedTextSegment;
212 || BaseOverflowAddU64 (SourceBase, SourceSize, &SourceEnd)
213 || (SourceEnd > Prelinked->PrelinkedSize))
219 InnerSize = (UINT32)SourceSize;
220 if (Prelinked->IsKernelCollection) {
221 HeaderOffset = (UINT32)SourceBase;
229 SourceSize = Prelinked->PrelinkedSize;
236 NewKext = AllocateZeroPool (
sizeof (*NewKext));
237 if (NewKext == NULL) {
241 if ( (Prelinked != NULL)
261 if ( (Prelinked != NULL)
263 && (KxldStateSize != 0)
264 && (Prelinked->PrelinkedStateKextsAddress != 0)
265 && (Prelinked->PrelinkedStateKextsAddress <= KxldState)
266 && (Prelinked->PrelinkedStateKextsSize >= KxldStateSize))
268 KxldOffset = KxldState - Prelinked->PrelinkedStateKextsAddress;
269 if (KxldOffset <= Prelinked->PrelinkedStateKextsSize - KxldStateSize) {
270 NewKext->
Context.
KxldState = (UINT8 *)Prelinked->PrelinkedStateKexts + KxldOffset;
277 "OCAK: %a got KXLD %p %u\n",
296 if (Kext->Context.KxldState != NULL) {
300 if ((Kext->LinkEditSegment == NULL) && (Kext->NumberOfSymbols == 0)) {
302 Kext->LinkEditSegment = Context->LinkEditSegment;
305 &Kext->Context.MachContext,
312 "OCAK: Requesting __LINKEDIT for %a - %p at %p\n",
314 Kext->LinkEditSegment,
319 if ((Kext->SymbolTable == NULL) && (Kext->NumberOfSymbols == 0)) {
321 &Kext->Context.MachContext,
333 "OCAK: Requesting SymbolTable for %a - %u\n",
335 Kext->NumberOfSymbols
348 BOOLEAN ResolveSymbols;
352 UINT32 NumCxxSymbols;
353 UINT32 NumDiscardedSyms;
362 if (Kext->LinkedSymbolTable != NULL) {
366 SymbolTable = AllocatePool (Kext->NumberOfSymbols * sizeof (*SymbolTable));
367 if (SymbolTable == NULL) {
368 return EFI_OUT_OF_RESOURCES;
372 ASSERT (MachHeader != NULL);
377 NumDiscardedSyms = 0;
379 WalkerBottom = &SymbolTable[0];
380 WalkerTop = &SymbolTable[Kext->NumberOfSymbols - 1];
384 for (Index = 0; Index < Kext->NumberOfSymbols; ++Index) {
385 if (Context->Is32Bit) {
386 Symbol = (
MACH_NLIST_ANY *)&(&Kext->SymbolTable->Symbol32)[Index];
388 Symbol = (
MACH_NLIST_ANY *)&(&Kext->SymbolTable->Symbol64)[Index];
391 SymbolType = Context->Is32Bit ? Symbol->Symbol32.Type : Symbol->Symbol64.Type;
409 if (ResolveSymbols) {
416 FreePool (SymbolTable);
417 return EFI_LOAD_ERROR;
420 CopyMem (&SymbolScratch, Symbol, Context->Is32Bit ? sizeof (SymbolScratch.
Symbol32) : sizeof (SymbolScratch.
Symbol64));
427 if (ResolvedSymbol == NULL) {
428 FreePool (SymbolTable);
429 return EFI_NOT_FOUND;
432 if (Context->Is32Bit) {
433 SymbolScratch.
Symbol32.
Value = (UINT32)ResolvedSymbol->Value;
438 Symbol = &SymbolScratch;
443 WalkerBottom->
Value = Context->Is32Bit ? Symbol->Symbol32.Value : Symbol->Symbol64.Value;
444 WalkerBottom->
Name = Kext->StringTable + (Context->Is32Bit ?
445 Symbol->Symbol32.UnifiedName.StringIndex : Symbol->Symbol64.UnifiedName.StringIndex);
446 WalkerBottom->
Length = (UINT32)AsciiStrLen (WalkerBottom->
Name);
449 WalkerTop->
Value = Context->Is32Bit ? Symbol->Symbol32.Value : Symbol->Symbol64.Value;
450 WalkerTop->
Name = Kext->StringTable + (Context->Is32Bit ?
451 Symbol->Symbol32.UnifiedName.StringIndex : Symbol->Symbol64.UnifiedName.StringIndex);
452 WalkerTop->
Length = (UINT32)AsciiStrLen (WalkerTop->
Name);
463 if (NumDiscardedSyms > 0) {
465 &SymbolTable[Kext->NumberOfSymbols - NumCxxSymbols - NumDiscardedSyms],
466 &SymbolTable[Kext->NumberOfSymbols - NumCxxSymbols],
467 (NumCxxSymbols * sizeof (*SymbolTable))
469 Kext->NumberOfSymbols -= NumDiscardedSyms;
472 Kext->NumberOfCxxSymbols = NumCxxSymbols;
473 Kext->LinkedSymbolTable = SymbolTable;
490 UINT32 NumEntriesTemp;
492 UINT32 VtableMaxSize;
493 UINT32 ResultingSize;
494 CONST VOID *VtableData;
497 if (Kext->LinkedVtables != NULL) {
501 VtableLookups = Context->LinkBuffer;
502 MaxSize = Context->LinkBufferSize;
511 return EFI_UNSUPPORTED;
516 for (Index = 0; Index < NumVtables; ++Index) {
523 &Kext->Context.MachContext,
527 if ((VtableData == NULL) || (Context->Is32Bit ? !BASE_TYPE_ALIGNED (UINT32, VtableData) : !BASE_TYPE_ALIGNED (UINT64, VtableData))) {
528 return EFI_UNSUPPORTED;
538 return EFI_UNSUPPORTED;
541 VtableLookups[Index].
Vtable.
Data = VtableData;
543 if (BaseOverflowAddU32 (NumEntries, NumEntriesTemp, &NumEntries)) {
544 return EFI_OUT_OF_RESOURCES;
548 if ( BaseOverflowMulU32 (NumVtables,
sizeof (*LinkedVtables), &ResultingSize)
549 || BaseOverflowMulAddU32 (NumEntries,
sizeof (*LinkedVtables->
Entries), ResultingSize, &ResultingSize))
551 return EFI_OUT_OF_RESOURCES;
554 LinkedVtables = AllocatePool (ResultingSize);
555 if (LinkedVtables == NULL) {
556 return EFI_OUT_OF_RESOURCES;
567 Kext->NumberOfVtables = NumVtables;
568 Kext->LinkedVtables = LinkedVtables;
587 if (Kext->LinkEditSegment != NULL) {
589 (UINT32)(Kext->Context.Is32Bit ?
590 Kext->LinkEditSegment->Segment32.FileSize : Kext->LinkEditSegment->Segment64.FileSize),
610 if (Context->LinkBuffer == NULL) {
617 Context->LinkBuffer = AllocatePool (Context->LinkBufferSize);
618 if (Context->LinkBuffer == NULL) {
619 return EFI_OUT_OF_RESOURCES;
624 if (Context->LinkBufferSize < BufferSize) {
625 FreePool (Context->LinkBuffer);
627 Context->LinkBufferSize = BufferSize;
628 Context->LinkBuffer = AllocatePool (Context->LinkBufferSize);
629 if (Context->LinkBuffer == NULL) {
630 return EFI_OUT_OF_RESOURCES;
643 IN UINT32 DependencyIndex,
649 if (DependencyIndex >=
ARRAY_SIZE (Kext->Dependencies)) {
650 DEBUG ((DEBUG_INFO,
"OCAK: Kext %a has more than %u or more dependencies!", Kext->Identifier, DependencyIndex));
651 return EFI_OUT_OF_RESOURCES;
655 if (EFI_ERROR (Status)) {
659 Kext->Dependencies[DependencyIndex] = DependencyKext;
673 if (NewKext == NULL) {
686 if (Kext->LinkedSymbolTable != NULL) {
687 FreePool (Kext->LinkedSymbolTable);
688 Kext->LinkedSymbolTable = NULL;
691 if (Kext->LinkedVtables != NULL) {
692 FreePool (Kext->LinkedVtables);
693 Kext->LinkedVtables = NULL;
702 IN CONST CHAR8 *Identifier
714 Kext = GetFirstNode (&Prelinked->PrelinkedKexts);
715 while (!IsNull (&Prelinked->PrelinkedKexts, Kext)) {
720 Kext = GetNextNode (&Prelinked->PrelinkedKexts, Kext);
728 for (Index = 0; Index < KextCount; ++Index) {
731 if (KextPlist == NULL) {
736 if (NewKext != NULL) {
741 if (NewKext == NULL) {
745 InsertTailList (&Prelinked->PrelinkedKexts, &NewKext->
Link);
753 IN CONST CHAR8 *Identifier
764 Link = GetFirstNode (&Prelinked->PrelinkedKexts);
766 while (!IsNull (&Prelinked->PrelinkedKexts, Link)) {
769 if (AsciiStrCmp (Identifier, Kext->
Identifier) == 0) {
774 Link = GetNextNode (&Prelinked->PrelinkedKexts, Link);
778 DEBUG ((DEBUG_INFO,
"OCAK: Found no kext to drop\n"));
779 return EFI_NOT_FOUND;
784 "OCAK: Found kext %a (%p) from link %p to drop\n",
790 RemoveEntryList (Link);
805 UINT64 VirtualAddress;
815 Kext = GetFirstNode (&Prelinked->PrelinkedKexts);
816 if (!IsNull (&Prelinked->PrelinkedKexts, Kext)) {
820 NewKext = AllocateZeroPool (
sizeof (*NewKext));
821 if (NewKext == NULL) {
825 ASSERT (Prelinked->Prelinked != NULL);
826 ASSERT (Prelinked->PrelinkedSize > 0);
830 &Prelinked->PrelinkedMachContext,
838 if (Segment == NULL) {
846 if (VirtualAddress < FileOffset) {
860 if (!Prelinked->IsKernelCollection) {
865 &Prelinked->PrelinkedMachContext,
869 if (Prelinked->PrelinkedStateSegment != NULL) {
871 &Prelinked->PrelinkedMachContext,
872 Prelinked->PrelinkedStateSegment,
876 &Prelinked->PrelinkedMachContext,
877 Prelinked->PrelinkedStateSegment,
881 if ( (Prelinked->PrelinkedStateSectionKernel != NULL)
882 && (Prelinked->PrelinkedStateSectionKexts != NULL))
884 KernelSize = Prelinked->Is32Bit ?
885 Prelinked->PrelinkedStateSectionKernel->Section32.Size :
886 Prelinked->PrelinkedStateSectionKernel->Section64.Size;
887 KextsSize = Prelinked->Is32Bit ?
888 Prelinked->PrelinkedStateSectionKexts->Section32.Size :
889 Prelinked->PrelinkedStateSectionKexts->Section64.Size;
890 KernelOffset = Prelinked->Is32Bit ?
891 Prelinked->PrelinkedStateSectionKernel->Section32.Offset :
892 Prelinked->PrelinkedStateSectionKernel->Section64.Offset;
893 KextsOffset = Prelinked->Is32Bit ?
894 Prelinked->PrelinkedStateSectionKexts->Section32.Offset :
895 Prelinked->PrelinkedStateSectionKexts->Section64.Offset;
897 if ((KernelSize > 0) && (KextsSize > 0)) {
898 Prelinked->PrelinkedStateKernelSize = (UINT32)KernelSize;
899 Prelinked->PrelinkedStateKextsSize = (UINT32)KextsSize;
900 Prelinked->PrelinkedStateKernel = AllocateCopyPool (
901 Prelinked->PrelinkedStateKernelSize,
902 &Prelinked->Prelinked[KernelOffset]
904 Prelinked->PrelinkedStateKexts = AllocateCopyPool (
905 Prelinked->PrelinkedStateKextsSize,
906 &Prelinked->Prelinked[KextsOffset]
908 if ( (Prelinked->PrelinkedStateKernel != NULL)
909 && (Prelinked->PrelinkedStateKexts != NULL))
911 Prelinked->PrelinkedStateKextsAddress = Prelinked->Is32Bit ?
912 Prelinked->PrelinkedStateSectionKexts->Section32.Address :
913 Prelinked->PrelinkedStateSectionKexts->Section64.Address;
919 "OCAK: Ignoring unused PK state __kernel %p __kexts %p\n",
920 Prelinked->PrelinkedStateSectionKernel,
921 Prelinked->PrelinkedStateSectionKexts
923 if (Prelinked->PrelinkedStateKernel != NULL) {
924 FreePool (Prelinked->PrelinkedStateKernel);
927 if (Prelinked->PrelinkedStateKexts != NULL) {
928 FreePool (Prelinked->PrelinkedStateKexts);
931 Prelinked->PrelinkedStateSectionKernel = NULL;
932 Prelinked->PrelinkedStateSectionKexts = NULL;
933 Prelinked->PrelinkedStateSegment = NULL;
940 InsertTailList (&Prelinked->PrelinkedKexts, &NewKext->
Link);
947 IN CONST CHAR8 *DependencyId,
953 ASSERT (DependencyId != NULL);
956 DependencyKext = NULL;
963 if (AsciiStrCmp (DependencyId,
"com.apple.iokit.IOHIDSystem") == 0) {
967 "Dependency %a fallback to %a %a. Please fix your kext!\n",
969 "com.apple.iokit.IOHIDFamily",
970 DependencyKext != NULL ?
"succeeded" :
"failed"
974 return DependencyKext;
981 IN BOOLEAN Dependency
987 UINT32 DependencyIndex;
988 CONST CHAR8 *DependencyId;
1000 if (Context->LinkBuffer == NULL) {
1001 Context->LinkBufferSize =
MAX (
1003 Context->LinkBufferSize
1011 if (DependencyKext == NULL) {
1012 return EFI_NOT_FOUND;
1015 if (DependencyKext != Kext) {
1017 if (EFI_ERROR (Status)) {
1022 if (Kext->BundleLibraries != NULL) {
1023 DependencyIndex = 1;
1026 for (FieldIndex = 0; FieldIndex < FieldCount; ++FieldIndex) {
1028 if (DependencyId == NULL) {
1032 DEBUG ((DEBUG_VERBOSE,
"OCAK: Checking dependency %a for kext %a\n", DependencyId, Kext->Identifier));
1039 if ( Context->IsKernelCollection
1040 && (AsciiStrnCmp (DependencyId,
"com.apple.kpi.",
L_STR_LEN (
"com.apple.kpi.")) == 0))
1042 DEBUG ((DEBUG_VERBOSE,
"OCAK: Ignoring KPI %a for kext %a in KC/state mode\n", DependencyId, Kext->Identifier));
1051 if (DependencyKext == NULL) {
1052 DEBUG ((DEBUG_INFO,
"OCAK: Dependency %a was not found for kext %a\n", DependencyId, Kext->Identifier));
1055 if (DependencyKext == NULL) {
1067 if (EFI_ERROR (Status)) {
1078 Kext->BundleLibraries = NULL;
1085 if (EFI_ERROR (Status)) {
1093 if (Kext->Context.KxldState != NULL) {
1101 if (EFI_ERROR (Status)) {
1109 if (EFI_ERROR (Status)) {
1117 if (EFI_ERROR (Status)) {
1122 if (EFI_ERROR (Status)) {
1138 Kext = GetFirstNode (&Context->PrelinkedKexts);
1139 while (!IsNull (&Context->PrelinkedKexts, Kext)) {
1141 Kext = GetNextNode (&Context->PrelinkedKexts, Kext);
1150 IN UINT64 LoadAddress,
1151 IN UINT64 KmodAddress,
1152 IN UINT64 FileOffset
1164 if (EFI_ERROR (Status)) {
1179 if (EFI_ERROR (Status)) {
1196 if (EFI_ERROR (Status)) {
1211 if (EFI_ERROR (Status)) {
#define ARRAY_SIZE(Array)
#define MACH_N_TYPE_TYPE
mask for the type bit
#define MACH_HEADER_FLAG_NO_UNDEFINED_REFERENCES
#define MACH_N_TYPE_UNDF
undefined, n_sect == NO_SECT
#define MACH_N_TYPE_INDR
indirect
EFI_STATUS InternalKxldStateBuildLinkedSymbolTable(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
EFI_STATUS InternalKxldStateBuildLinkedVtables(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
EFI_STATUS InternalPrelinkKext(IN OUT PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN UINT64 LoadAddress, IN UINT64 FileOffset)
CONST PRELINKED_KEXT_SYMBOL * InternalOcGetSymbolName(IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN CONST CHAR8 *LookupValue, IN OC_GET_SYMBOL_LEVEL SymbolLevel)
DMG_SIZE_DEVICE_PATH Size
UINT32 KcGetKextSize(IN PRELINKED_CONTEXT *Context, IN UINT64 SourceAddress)
#define PRELINK_INFO_LINK_STATE_SIZE_KEY
EFI_STATUS PrelinkedDependencyInsert(IN OUT PRELINKED_CONTEXT *Context, IN VOID *Buffer)
#define INFO_BUNDLE_LIBRARIES_64_KEY
#define PRELINK_INFO_LINK_STATE_ADDR_KEY
#define PRELINK_INFO_EXECUTABLE_LOAD_ADDR_KEY
#define PRELINK_STATE_SECTION_KEXTS
#define PRELINK_STATE_SEGMENT
#define PRELINK_INFO_KMOD_INFO_KEY
#define PRELINK_INFO_EXECUTABLE_SOURCE_ADDR_KEY
#define PRELINK_KERNEL_IDENTIFIER
#define PRELINK_INFO_EXECUTABLE_SIZE_KEY
#define INFO_BUNDLE_LIBRARIES_KEY
#define INFO_BUNDLE_COMPATIBLE_VERSION_KEY
#define PRELINK_STATE_SECTION_KERNEL
#define INFO_BUNDLE_IDENTIFIER_KEY
BOOLEAN MachoSymbolNameIsCxx(IN CONST CHAR8 *Name)
MACH_SECTION_ANY * MachoGetSectionByName(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND_ANY *Segment, IN CONST CHAR8 *SectionName)
CONST CHAR8 * MachoGetIndirectSymbolName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_ANY *Symbol)
VOID * MachoGetFilePointerByAddress(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address, OUT UINT32 *MaxSize OPTIONAL)
MACH_HEADER_ANY * MachoGetMachHeader(IN OUT OC_MACHO_CONTEXT *Context)
BOOLEAN MachoInitializeContext(OUT OC_MACHO_CONTEXT *Context, IN VOID *FileData, IN UINT32 FileSize, IN UINT32 HeaderOffset, IN UINT32 InnerSize, IN BOOLEAN Is32Bit)
UINT32 MachoGetSymbolTable(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST_ANY **SymbolTable, OUT CONST CHAR8 **StringTable OPTIONAL, OUT CONST MACH_NLIST_ANY **LocalSymbols OPTIONAL, OUT UINT32 *NumLocalSymbols OPTIONAL, OUT CONST MACH_NLIST_ANY **ExternalSymbols OPTIONAL, OUT UINT32 *NumExternalSymbols OPTIONAL, OUT CONST MACH_NLIST_ANY **UndefinedSymbols OPTIONAL, OUT UINT32 *NumUndefinedSymbols OPTIONAL)
CONST CHAR8 * MachoGetSymbolName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_ANY *Symbol)
MACH_SEGMENT_COMMAND_ANY * MachoGetSegmentByName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName)
#define L_STR_LEN(String)
CONST CHAR8 * PlistKeyValue(IN XML_NODE *Node OPTIONAL)
UINT32 XmlNodeChildren(IN CONST XML_NODE *Node)
CONST CHAR8 * XmlNodeContent(IN CONST XML_NODE *Node)
UINT32 PlistDictChildren(IN CONST XML_NODE *Node)
BOOLEAN PlistIntegerValue(IN XML_NODE *Node OPTIONAL, OUT VOID *Value, IN UINT32 Size, IN BOOLEAN Hex)
XML_NODE * PlistNodeCast(IN XML_NODE *Node OPTIONAL, IN PLIST_NODE_TYPE Type)
XML_NODE * XmlNodeChild(IN CONST XML_NODE *Node, IN UINT32 Child)
XML_NODE * PlistDictChild(IN CONST XML_NODE *Node, IN UINT32 Child, OUT XML_NODE **Value OPTIONAL)
#define PRELINKED_KEXT_SIGNATURE
VOID InternalCreateVtablesPrelinked(IN PRELINKED_CONTEXT *Context, IN OUT PRELINKED_KEXT *Kext, IN UINT32 NumVtables, IN CONST OC_PRELINKED_VTABLE_LOOKUP_ENTRY *VtableLookups, OUT PRELINKED_VTABLE *VtableBuffer)
#define GET_PRELINKED_KEXT_FROM_LINK(This)
BOOLEAN InternalGetVtableEntries(IN BOOLEAN Is32Bit, IN CONST VOID *VtableData, IN UINT32 MaxSize, OUT UINT32 *NumEntries)
BOOLEAN InternalPrepareCreateVtablesPrelinked(IN PRELINKED_KEXT *Kext, IN UINT32 MaxSize, OUT UINT32 *NumVtables, OUT OC_PRELINKED_VTABLE_LOOKUP_ENTRY *Vtables)
VOID InternalFreePrelinkedKext(IN PRELINKED_KEXT *Kext)
STATIC EFI_STATUS InternalUpdateLinkBuffer(IN OUT PRELINKED_KEXT *Kext, IN OUT PRELINKED_CONTEXT *Context)
STATIC EFI_STATUS InternalScanBuildLinkedSymbolTable(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
EFI_STATUS InternalScanPrelinkedKext(IN OUT PRELINKED_KEXT *Kext, IN OUT PRELINKED_CONTEXT *Context, IN BOOLEAN Dependency)
PRELINKED_KEXT * InternalNewPrelinkedKext(IN OC_MACHO_CONTEXT *Context, IN XML_NODE *KextPlist)
STATIC VOID InternalScanCurrentPrelinkedKextLinkInfo(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
STATIC EFI_STATUS InternalScanBuildLinkedVtables(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
STATIC UINT32 InternalGetLinkBufferSize(IN OUT PRELINKED_KEXT *Kext)
PRELINKED_KEXT * InternalCachedPrelinkedKext(IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Identifier)
STATIC PRELINKED_KEXT * InternalCreatePrelinkedKext(IN OUT PRELINKED_CONTEXT *Prelinked OPTIONAL, IN XML_NODE *KextPlist, IN CONST CHAR8 *Identifier OPTIONAL, IN BOOLEAN Is32Bit)
STATIC EFI_STATUS InternalInsertPrelinkedKextDependency(IN OUT PRELINKED_KEXT *Kext, IN OUT PRELINKED_CONTEXT *Context, IN UINT32 DependencyIndex, IN OUT PRELINKED_KEXT *DependencyKext)
PRELINKED_KEXT * InternalCachedPrelinkedKernel(IN OUT PRELINKED_CONTEXT *Prelinked)
EFI_STATUS InternalDropCachedPrelinkedKext(IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Identifier)
VOID InternalUnlockContextKexts(IN PRELINKED_CONTEXT *Context)
PRELINKED_KEXT * InternalGetQuirkDependencyKext(IN CONST CHAR8 *DependencyId, IN OUT PRELINKED_CONTEXT *Context)
PRELINKED_KEXT * InternalLinkPrelinkedKext(IN OUT PRELINKED_CONTEXT *Context, IN OUT OC_MACHO_CONTEXT *Executable, IN XML_NODE *PlistRoot, IN UINT64 LoadAddress, IN UINT64 KmodAddress, IN UINT64 FileOffset)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
UINT64 Value
value of this symbol (or stab offset)
UINT32 Value
value of this symbol (or stab offset)
UINT64 FileOffset
file offset of this segment
UINT64 VirtualAddress
memory address of this segment
UINT32 FileOffset
file offset of this segment
UINT32 VirtualAddress
memory address of this segment
union OC_PRELINKED_VTABLE_LOOKUP_ENTRY::@87 Vtable
OC_MACHO_CONTEXT MachContext
BOOLEAN IsKernelCollection
XML_NODE * BundleLibraries
CONST CHAR8 * StringTable
CONST MACH_NLIST_ANY * SymbolTable
CONST CHAR8 * CompatibleVersion
PRELINKED_VTABLE * LinkedVtables
CONST CHAR8 * Name
name of this symbol
UINT64 Value
value of this symbol (or stab offset)
PRELINKED_VTABLE_ENTRY Entries[]
The VTable entries.
MACH_SEGMENT_COMMAND_64 Segment64
MACH_SEGMENT_COMMAND Segment32