16#ifndef PRELINKED_INTERNAL_H
17#define PRELINKED_INTERNAL_H
28#define MAX_KEXT_DEPEDENCIES 16
33#define KEXT_OFFSET_STR_LEN 24
56#define GET_NEXT_PRELINKED_VTABLE(This) \
57 (PRELINKED_VTABLE *)( \
58 (UINTN)((This) + 1) + ((This)->NumEntries * sizeof (*(This)->Entries)) \
146#define PRELINKED_KEXT_SIGNATURE SIGNATURE_32 ('P', 'K', 'X', 'T')
153#define GET_PRELINKED_KEXT_FROM_LINK(This) \
158 PRELINKED_KEXT_SIGNATURE \
166#define GET_INJECTED_KEXT_FROM_LINK(This) \
171 PRELINKED_KEXT_SIGNATURE \
197 IN CONST CHAR8 *Identifier
206 IN CONST CHAR8 *Identifier
224 IN BOOLEAN Dependency
254 IN UINT64 LoadAddress,
255 IN UINT64 KmodAddress,
264 IN UINT32 BufferSize,
265 OUT BOOLEAN *KernelCollection OPTIONAL
268#define KXLD_WEAK_TEST_SYMBOL "_gOSKextUnresolved"
270#define KXLD_ANY_NEXT(a, b) ((VOID *) (((UINTN)(b)) + ((a) ? sizeof ((b)->Kxld32) : sizeof ((b)->Kxld64))))
272#define OS_METACLASS_VTABLE_NAME "__ZTV11OSMetaClass"
274#define X86_64_RIP_RELATIVE_LIMIT 0x80000000ULL
276#define SYM_MAX_NAME_LEN 256U
278#define VTABLE_ENTRY_SIZE_32 4U
279#define VTABLE_ENTRY_SIZE_64 8U
280#define VTABLE_HEADER_LEN 2U
281#define VTABLE_HEADER_SIZE_32 (VTABLE_HEADER_LEN * VTABLE_ENTRY_SIZE_32)
282#define VTABLE_HEADER_SIZE_64 (VTABLE_HEADER_LEN * VTABLE_ENTRY_SIZE_64)
284#define KERNEL_ADDRESS_MASK 0xFFFFFFFF00000000ULL
285#define KERNEL_ADDRESS_KEXT 0xFFFFFF7F00000000ULL
286#define KERNEL_ADDRESS_BASE 0xFFFFFF8000000000ULL
287#define KERNEL_FIXUP_OFFSET BASE_1MB
289#define VTABLE_ENTRY_X(a, b, c) ((a) ? ((UINT32 *)(b))[(c)] : ((UINT64 *)(b))[(c)])
290#define VTABLE_ENTRY_SIZE_X(a) ((a) ? VTABLE_ENTRY_SIZE_32 : VTABLE_ENTRY_SIZE_64)
291#define VTABLE_HEADER_SIZE_X(a) ((a) ? VTABLE_HEADER_SIZE_32 : VTABLE_HEADER_SIZE_64)
312#define GET_NEXT_OC_VTABLE_PATCH_ENTRY(Entry) \
313 (OC_VTABLE_PATCH_ENTRY *)( \
314 (UINTN)((Entry) + 1) \
315 + ((Entry)->NumSolveSymbols * sizeof (*(Entry)->SolveSymbols)) \
328 "Prelinked VTable lookup data might not safely fit LinkBuffer"
349 "VTable Patch data might not safely fit LinkBuffer"
359 IN CONST VOID *VtableData,
361 OUT UINT32 *NumEntries
374 OUT UINT32 *NumVtables,
382 IN UINT32 NumVtables,
413 IN CONST CHAR8 *LookupValue,
421 IN UINT64 LookupValue,
449 IN UINT64 LoadAddress,
507 IN CONST VOID *KxldState,
508 IN UINT32 KxldStateSize,
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
EFI_STATUS InternalPrelinkKext(IN OUT PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN UINT64 LoadAddress, IN UINT64 FileOffset)
VOID InternalFreePrelinkedKext(IN PRELINKED_KEXT *Kext)
CONST PRELINKED_VTABLE * InternalGetOcVtableByName(IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN CONST CHAR8 *Name)
EFI_STATUS InternalKxldStateRebuild(IN OUT PRELINKED_CONTEXT *Context)
EFI_STATUS InternalScanPrelinkedKext(IN OUT PRELINKED_KEXT *Kext, IN OUT PRELINKED_CONTEXT *Context, IN BOOLEAN Dependency)
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)
CONST PRELINKED_KEXT_SYMBOL * InternalOcGetSymbolName(IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN CONST CHAR8 *LookupValue, IN OC_GET_SYMBOL_LEVEL SymbolLevel)
UINT64 InternalKxldSolveSymbol(IN BOOLEAN Is32Bit, IN CONST VOID *KxldState, IN UINT32 KxldStateSize, IN CONST CHAR8 *Name)
PRELINKED_KEXT * InternalNewPrelinkedKext(IN OC_MACHO_CONTEXT *Context, IN XML_NODE *KextPlist)
CONST PRELINKED_KEXT_SYMBOL * InternalOcGetSymbolValue(IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN UINT64 LookupValue, IN OC_GET_SYMBOL_LEVEL SymbolLevel)
KERNEL_QUIRK gKernelQuirks[]
BOOLEAN InternalPatchByVtables(IN PRELINKED_CONTEXT *Context, IN OUT PRELINKED_KEXT *Kext)
PRELINKED_KEXT * InternalCachedPrelinkedKext(IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Identifier)
EFI_STATUS InternalKxldStateBuildLinkedSymbolTable(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
@ OcKextVersionStageAlpha
@ OcKextVersionStageRelease
@ OcKextVersionStageCandidate
@ OcKextVersionStageDevelopment
EFI_STATUS InternalKxldStateBuildLinkedVtables(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
#define MAX_KEXT_DEPEDENCIES
EFI_STATUS InternalConnectExternalSymtab(IN OUT OC_MACHO_CONTEXT *Context, OUT OC_MACHO_CONTEXT *InnerContext, IN UINT8 *Buffer, IN UINT32 BufferSize, OUT BOOLEAN *KernelCollection OPTIONAL)
PRELINKED_KEXT * InternalCachedPrelinkedKernel(IN OUT PRELINKED_CONTEXT *Prelinked)
EFI_STATUS InternalDropCachedPrelinkedKext(IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Identifier)
BOOLEAN InternalGetVtableEntries(IN BOOLEAN Is32Bit, IN CONST VOID *VtableData, IN UINT32 MaxSize, OUT UINT32 *NumEntries)
STATIC_ASSERT((sizeof(OC_PRELINKED_VTABLE_LOOKUP_ENTRY)<=sizeof(MACH_NLIST_64)), "Prelinked VTable lookup data might not safely fit LinkBuffer")
VOID InternalUnlockContextKexts(IN PRELINKED_CONTEXT *Context)
VOID InternalSolveSymbolValue(IN BOOLEAN Is32Bit, IN UINT64 Value, OUT MACH_NLIST_ANY *Symbol)
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)
BOOLEAN InternalPrepareCreateVtablesPrelinked(IN PRELINKED_KEXT *Kext, IN UINT32 MaxSize, OUT UINT32 *NumVtables, OUT OC_PRELINKED_VTABLE_LOOKUP_ENTRY *Vtables)
CONST MACH_NLIST_ANY * MetaVtable
CONST MACH_NLIST_ANY * Smcp
CONST MACH_NLIST_ANY * Vtable
XML_NODE * BundleLibraries
UINT32 NumberOfCxxSymbols
CONST CHAR8 * StringTable
CONST MACH_NLIST_ANY * SymbolTable
PRELINKED_KEXT * Dependencies[MAX_KEXT_DEPEDENCIES]
CONST CHAR8 * CompatibleVersion
MACH_SEGMENT_COMMAND_ANY * LinkEditSegment
PRELINKED_VTABLE * LinkedVtables
PRELINKED_KEXT_SYMBOL * LinkedSymbolTable
CONST CHAR8 * Name
name of this symbol
UINT64 Value
value of this symbol (or stab offset)
UINT64 Address
The symbol's address.
CONST CHAR8 * Name
The symbol's name.
UINT32 NumEntries
The number of VTable entries.
CONST CHAR8 * Name
The VTable's name.