OpenCore
1.0.4
OpenCore Bootloader
|
#include <IndustryStandard/AppleMachoImage.h>
#include <Library/OcAppleKernelLib.h>
#include <Library/OcMachoLib.h>
#include <Library/OcXmlLib.h>
Go to the source code of this file.
Data Structures | |
struct | PRELINKED_KEXT_SYMBOL |
struct | PRELINKED_VTABLE_ENTRY |
struct | PRELINKED_VTABLE |
struct | PRELINKED_KEXT_ |
union | OC_KEXT_VERSION |
struct | OC_PRELINKED_VTABLE_LOOKUP_ENTRY |
struct | OC_VTABLE_PATCH_ENTRY |
Typedefs | |
typedef struct PRELINKED_KEXT_ | PRELINKED_KEXT |
Enumerations | |
enum | OC_KEXT_VERSION_STAGE { OcKextVersionStageDevelopment = 1 , OcKextVersionStageAlpha = 3 , OcKextVersionStageBeta = 5 , OcKextVersionStageCandidate = 7 , OcKextVersionStageRelease = 9 } |
enum | OC_GET_SYMBOL_TYPE { OcGetSymbolByName , OcGetSymbolByValue } |
enum | OC_GET_SYMBOL_LEVEL { OcGetSymbolAnyLevel , OcGetSymbolFirstLevel , OcGetSymbolOnlyCxx } |
Functions | |
PRELINKED_KEXT * | InternalNewPrelinkedKext (IN OC_MACHO_CONTEXT *Context, IN XML_NODE *KextPlist) |
VOID | InternalFreePrelinkedKext (IN PRELINKED_KEXT *Kext) |
PRELINKED_KEXT * | InternalCachedPrelinkedKext (IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Identifier) |
EFI_STATUS | InternalDropCachedPrelinkedKext (IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Identifier) |
PRELINKED_KEXT * | InternalCachedPrelinkedKernel (IN OUT PRELINKED_CONTEXT *Prelinked) |
EFI_STATUS | InternalScanPrelinkedKext (IN OUT PRELINKED_KEXT *Kext, IN OUT PRELINKED_CONTEXT *Context, IN BOOLEAN Dependency) |
VOID | InternalUnlockContextKexts (IN 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) |
EFI_STATUS | InternalConnectExternalSymtab (IN OUT OC_MACHO_CONTEXT *Context, OUT OC_MACHO_CONTEXT *InnerContext, IN UINT8 *Buffer, IN UINT32 BufferSize, OUT BOOLEAN *KernelCollection OPTIONAL) |
STATIC_ASSERT ((sizeof(OC_PRELINKED_VTABLE_LOOKUP_ENTRY)<=sizeof(MACH_NLIST_64)), "Prelinked VTable lookup data might not safely fit LinkBuffer") | |
STATIC_ASSERT (((sizeof(MACH_NLIST_64 *)+MAX((2 *sizeof(UINT32)), sizeof(UINT64 *)))<=sizeof(MACH_NLIST_64)), "VTable Patch data might not safely fit LinkBuffer") | |
BOOLEAN | InternalGetVtableEntries (IN BOOLEAN Is32Bit, IN CONST VOID *VtableData, IN UINT32 MaxSize, OUT UINT32 *NumEntries) |
BOOLEAN | InternalPatchByVtables (IN PRELINKED_CONTEXT *Context, IN OUT PRELINKED_KEXT *Kext) |
BOOLEAN | InternalPrepareCreateVtablesPrelinked (IN PRELINKED_KEXT *Kext, IN UINT32 MaxSize, OUT UINT32 *NumVtables, OUT OC_PRELINKED_VTABLE_LOOKUP_ENTRY *Vtables) |
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_VTABLE * | InternalGetOcVtableByName (IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN CONST CHAR8 *Name) |
CONST PRELINKED_KEXT_SYMBOL * | InternalOcGetSymbolName (IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN CONST CHAR8 *LookupValue, IN OC_GET_SYMBOL_LEVEL SymbolLevel) |
CONST PRELINKED_KEXT_SYMBOL * | InternalOcGetSymbolValue (IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN UINT64 LookupValue, IN OC_GET_SYMBOL_LEVEL SymbolLevel) |
VOID | InternalSolveSymbolValue (IN BOOLEAN Is32Bit, IN UINT64 Value, OUT MACH_NLIST_ANY *Symbol) |
EFI_STATUS | InternalPrelinkKext (IN OUT PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN UINT64 LoadAddress, IN UINT64 FileOffset) |
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 | InternalKxldStateRebuild (IN OUT PRELINKED_CONTEXT *Context) |
UINT64 | InternalKxldSolveSymbol (IN BOOLEAN Is32Bit, IN CONST VOID *KxldState, IN UINT32 KxldStateSize, IN CONST CHAR8 *Name) |
Variables | |
KERNEL_QUIRK | gKernelQuirks [] |
Library handling KEXT prelinking. Currently limited to Intel 64 architectures.
Copyright (c) 2018, Download-Fritz. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Definition in file PrelinkedInternal.h.
#define GET_INJECTED_KEXT_FROM_LINK | ( | This | ) |
Gets the next element in InjectedKexts list of PRELINKED_KEXT.
[in] | This | The current ListEntry. |
Definition at line 166 of file PrelinkedInternal.h.
#define GET_NEXT_OC_VTABLE_PATCH_ENTRY | ( | Entry | ) |
Definition at line 312 of file PrelinkedInternal.h.
#define GET_NEXT_PRELINKED_VTABLE | ( | This | ) |
Definition at line 56 of file PrelinkedInternal.h.
#define GET_PRELINKED_KEXT_FROM_LINK | ( | This | ) |
Gets the next element in PrelinkedKexts list of PRELINKED_KEXT.
[in] | This | The current ListEntry. |
Definition at line 153 of file PrelinkedInternal.h.
#define KERNEL_ADDRESS_BASE 0xFFFFFF8000000000ULL |
Definition at line 286 of file PrelinkedInternal.h.
#define KERNEL_ADDRESS_KEXT 0xFFFFFF7F00000000ULL |
Definition at line 285 of file PrelinkedInternal.h.
#define KERNEL_ADDRESS_MASK 0xFFFFFFFF00000000ULL |
Definition at line 284 of file PrelinkedInternal.h.
#define KERNEL_FIXUP_OFFSET BASE_1MB |
Definition at line 287 of file PrelinkedInternal.h.
#define KEXT_OFFSET_STR_LEN 24 |
Definition at line 33 of file PrelinkedInternal.h.
#define KXLD_ANY_NEXT | ( | a, | |
b ) |
Definition at line 270 of file PrelinkedInternal.h.
#define KXLD_WEAK_TEST_SYMBOL "_gOSKextUnresolved" |
Definition at line 268 of file PrelinkedInternal.h.
#define MAX_KEXT_DEPEDENCIES 16 |
Definition at line 28 of file PrelinkedInternal.h.
#define OS_METACLASS_VTABLE_NAME "__ZTV11OSMetaClass" |
Definition at line 272 of file PrelinkedInternal.h.
#define PRELINKED_KEXT_SIGNATURE SIGNATURE_32 ('P', 'K', 'X', 'T') |
Definition at line 146 of file PrelinkedInternal.h.
#define SYM_MAX_NAME_LEN 256U |
Definition at line 276 of file PrelinkedInternal.h.
#define VTABLE_ENTRY_SIZE_32 4U |
Definition at line 278 of file PrelinkedInternal.h.
#define VTABLE_ENTRY_SIZE_64 8U |
Definition at line 279 of file PrelinkedInternal.h.
#define VTABLE_ENTRY_SIZE_X | ( | a | ) |
Definition at line 290 of file PrelinkedInternal.h.
#define VTABLE_ENTRY_X | ( | a, | |
b, | |||
c ) |
Definition at line 289 of file PrelinkedInternal.h.
#define VTABLE_HEADER_LEN 2U |
Definition at line 280 of file PrelinkedInternal.h.
#define VTABLE_HEADER_SIZE_32 (VTABLE_HEADER_LEN * VTABLE_ENTRY_SIZE_32) |
Definition at line 281 of file PrelinkedInternal.h.
#define VTABLE_HEADER_SIZE_64 (VTABLE_HEADER_LEN * VTABLE_ENTRY_SIZE_64) |
Definition at line 282 of file PrelinkedInternal.h.
#define VTABLE_HEADER_SIZE_X | ( | a | ) |
Definition at line 291 of file PrelinkedInternal.h.
#define X86_64_RIP_RELATIVE_LIMIT 0x80000000ULL |
Definition at line 274 of file PrelinkedInternal.h.
typedef struct PRELINKED_KEXT_ PRELINKED_KEXT |
Definition at line 40 of file PrelinkedInternal.h.
enum OC_GET_SYMBOL_LEVEL |
Enumerator | |
---|---|
OcGetSymbolAnyLevel | |
OcGetSymbolFirstLevel | |
OcGetSymbolOnlyCxx |
Definition at line 403 of file PrelinkedInternal.h.
enum OC_GET_SYMBOL_TYPE |
Enumerator | |
---|---|
OcGetSymbolByName | |
OcGetSymbolByValue |
Definition at line 398 of file PrelinkedInternal.h.
Enumerator | |
---|---|
OcKextVersionStageDevelopment | |
OcKextVersionStageAlpha | |
OcKextVersionStageBeta | |
OcKextVersionStageCandidate | |
OcKextVersionStageRelease |
Definition at line 304 of file PrelinkedInternal.h.
PRELINKED_KEXT * InternalCachedPrelinkedKernel | ( | IN OUT PRELINKED_CONTEXT * | Prelinked | ) |
Gets cached kernel PRELINKED_KEXT from PRELINKED_CONTEXT.
Definition at line 797 of file PrelinkedKext.c.
PRELINKED_KEXT * InternalCachedPrelinkedKext | ( | IN OUT PRELINKED_CONTEXT * | Prelinked, |
IN CONST CHAR8 * | Identifier ) |
Gets cached PRELINKED_KEXT from PRELINKED_CONTEXT.
Definition at line 700 of file PrelinkedKext.c.
EFI_STATUS InternalConnectExternalSymtab | ( | IN OUT OC_MACHO_CONTEXT * | Context, |
OUT OC_MACHO_CONTEXT * | InnerContext, | ||
IN UINT8 * | Buffer, | ||
IN UINT32 | BufferSize, | ||
OUT BOOLEAN *KernelCollection | OPTIONAL ) |
Definition at line 134 of file PrelinkedContext.c.
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 ) |
EFI_STATUS InternalDropCachedPrelinkedKext | ( | IN OUT PRELINKED_CONTEXT * | Prelinked, |
IN CONST CHAR8 * | Identifier ) |
Drops cached PRELINKED_KEXT from PRELINKED_CONTEXT.
Definition at line 751 of file PrelinkedKext.c.
VOID InternalFreePrelinkedKext | ( | IN PRELINKED_KEXT * | Kext | ) |
Frees PRELINKED_KEXT.
Definition at line 682 of file PrelinkedKext.c.
CONST PRELINKED_VTABLE * InternalGetOcVtableByName | ( | IN PRELINKED_CONTEXT * | Context, |
IN PRELINKED_KEXT * | Kext, | ||
IN CONST CHAR8 * | Name ) |
BOOLEAN InternalGetVtableEntries | ( | IN BOOLEAN | Is32Bit, |
IN CONST VOID * | VtableData, | ||
IN UINT32 | MaxSize, | ||
OUT UINT32 * | NumEntries ) |
UINT64 InternalKxldSolveSymbol | ( | IN BOOLEAN | Is32Bit, |
IN CONST VOID * | KxldState, | ||
IN UINT32 | KxldStateSize, | ||
IN CONST CHAR8 * | Name ) |
Solve symbol through KXLD state.
[in] | Is32Bit | KXLD is 32-bit. |
[in] | KxldState | KXLD state. |
[in] | KxldStateSize | KXLD state size. |
[in] | Name | Symbol name. |
Address | on success. |
0 | on failure. |
Definition at line 579 of file KxldState.c.
EFI_STATUS InternalKxldStateBuildLinkedSymbolTable | ( | IN OUT PRELINKED_KEXT * | Kext, |
IN PRELINKED_CONTEXT * | Context ) |
Build symbol table from KXLD state.
[in,out] | Kext | Kext dependency. |
[in] | Context | Prelinking context. |
EFI_SUCCESS | on success. |
Definition at line 192 of file KxldState.c.
EFI_STATUS InternalKxldStateBuildLinkedVtables | ( | IN OUT PRELINKED_KEXT * | Kext, |
IN PRELINKED_CONTEXT * | Context ) |
Build virtual tables from KXLD state.
[in,out] | Kext | Kext dependency. |
[in] | Context | Prelinking context. |
EFI_SUCCESS | on success. |
Definition at line 292 of file KxldState.c.
EFI_STATUS InternalKxldStateRebuild | ( | IN OUT PRELINKED_CONTEXT * | Context | ) |
Update KXLD state in the resulting image.
[in,out] | Context | Prelinking context. |
EFI_SUCCESS | on success. |
Definition at line 459 of file KxldState.c.
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 ) |
Link executable within current prelink context.
[in,out] | Context | Prelinked context. |
[in,out] | Executable | Kext executable copied to prelinked. |
[in] | PlistRoot | Current kext info.plist. |
[in] | LoadAddress | Kext load address. |
[in] | KmodAddress | Kext kmod address. |
[in] | FileOffset | The file offset of the first segment. |
Definition at line 1146 of file PrelinkedKext.c.
PRELINKED_KEXT * InternalNewPrelinkedKext | ( | IN OC_MACHO_CONTEXT * | Context, |
IN XML_NODE * | KextPlist ) |
Creates new PRELINKED_KEXT from OC_MACHO_CONTEXT.
Definition at line 665 of file PrelinkedKext.c.
CONST PRELINKED_KEXT_SYMBOL * InternalOcGetSymbolName | ( | IN PRELINKED_CONTEXT * | Context, |
IN PRELINKED_KEXT * | Kext, | ||
IN CONST CHAR8 * | LookupValue, | ||
IN OC_GET_SYMBOL_LEVEL | SymbolLevel ) |
CONST PRELINKED_KEXT_SYMBOL * InternalOcGetSymbolValue | ( | IN PRELINKED_CONTEXT * | Context, |
IN PRELINKED_KEXT * | Kext, | ||
IN UINT64 | LookupValue, | ||
IN OC_GET_SYMBOL_LEVEL | SymbolLevel ) |
BOOLEAN InternalPatchByVtables | ( | IN PRELINKED_CONTEXT * | Context, |
IN OUT PRELINKED_KEXT * | Kext ) |
EFI_STATUS InternalPrelinkKext | ( | IN OUT PRELINKED_CONTEXT * | Context, |
IN PRELINKED_KEXT * | Kext, | ||
IN UINT64 | LoadAddress, | ||
IN UINT64 | FileOffset ) |
Prelinks the specified KEXT against the specified LoadAddress and the data of its dependencies.
[in,out] | Context | Prelinking context. |
[in] | Kext | KEXT prelinking context. |
[in] | LoadAddress | The address this KEXT shall be linked against. |
[in] | FileOffset | The file offset of the first segment. |
Returned | is whether the prelinking process has been successful. The state of the KEXT is undefined in case this routine fails. |
BOOLEAN InternalPrepareCreateVtablesPrelinked | ( | IN PRELINKED_KEXT * | Kext, |
IN UINT32 | MaxSize, | ||
OUT UINT32 * | NumVtables, | ||
OUT OC_PRELINKED_VTABLE_LOOKUP_ENTRY * | Vtables ) |
EFI_STATUS InternalScanPrelinkedKext | ( | IN OUT PRELINKED_KEXT * | Kext, |
IN OUT PRELINKED_CONTEXT * | Context, | ||
IN BOOLEAN | Dependency ) |
Scan PRELINKED_KEXT for dependencies.
Definition at line 978 of file PrelinkedKext.c.
VOID InternalSolveSymbolValue | ( | IN BOOLEAN | Is32Bit, |
IN UINT64 | Value, | ||
OUT MACH_NLIST_ANY * | Symbol ) |
VOID InternalUnlockContextKexts | ( | IN PRELINKED_CONTEXT * | Context | ) |
Unlock all context dependency kexts by unsetting Processed flag.
[in] | Context | Prelinked context. |
Definition at line 1132 of file PrelinkedKext.c.
STATIC_ASSERT | ( | ((sizeof(MACH_NLIST_64 *)+MAX((2 *sizeof(UINT32)), sizeof(UINT64 *)))<=sizeof(MACH_NLIST_64)) | , |
"VTable Patch data might not safely fit LinkBuffer" | ) |
STATIC_ASSERT | ( | (sizeof(OC_PRELINKED_VTABLE_LOOKUP_ENTRY)<=sizeof(MACH_NLIST_64)) | , |
"Prelinked VTable lookup data might not safely fit LinkBuffer" | ) |
|
extern |
Definition at line 2951 of file CommonPatches.c.