33 IN CONST VOID *PrimaryEntry,
34 IN CONST VOID *SecondaryEntry
37 CONST OC_KERNEL_ADD_ENTRY *KernelAddPrimaryEntry;
38 CONST OC_KERNEL_ADD_ENTRY *KernelAddSecondaryEntry;
39 CONST CHAR8 *KernelAddPrimaryBundlePathString;
40 CONST CHAR8 *KernelAddSecondaryBundlePathString;
42 KernelAddPrimaryEntry = *(CONST OC_KERNEL_ADD_ENTRY **)PrimaryEntry;
43 KernelAddSecondaryEntry = *(CONST OC_KERNEL_ADD_ENTRY **)SecondaryEntry;
44 KernelAddPrimaryBundlePathString =
OC_BLOB_GET (&KernelAddPrimaryEntry->BundlePath);
45 KernelAddSecondaryBundlePathString =
OC_BLOB_GET (&KernelAddSecondaryEntry->BundlePath);
47 if (!KernelAddPrimaryEntry->Enabled || !KernelAddSecondaryEntry->Enabled) {
51 return StringIsDuplicated (
"Kernel->Add", KernelAddPrimaryBundlePathString, KernelAddSecondaryBundlePathString);
65 IN CONST VOID *PrimaryEntry,
66 IN CONST VOID *SecondaryEntry
69 CONST OC_KERNEL_BLOCK_ENTRY *KernelBlockPrimaryEntry;
70 CONST OC_KERNEL_BLOCK_ENTRY *KernelBlockSecondaryEntry;
71 CONST CHAR8 *KernelBlockPrimaryIdentifierString;
72 CONST CHAR8 *KernelBlockSecondaryIdentifierString;
74 KernelBlockPrimaryEntry = *(CONST OC_KERNEL_BLOCK_ENTRY **)PrimaryEntry;
75 KernelBlockSecondaryEntry = *(CONST OC_KERNEL_BLOCK_ENTRY **)SecondaryEntry;
76 KernelBlockPrimaryIdentifierString =
OC_BLOB_GET (&KernelBlockPrimaryEntry->Identifier);
77 KernelBlockSecondaryIdentifierString =
OC_BLOB_GET (&KernelBlockSecondaryEntry->Identifier);
79 if (!KernelBlockPrimaryEntry->Enabled || !KernelBlockSecondaryEntry->Enabled) {
83 return StringIsDuplicated (
"Kernel->Block", KernelBlockPrimaryIdentifierString, KernelBlockSecondaryIdentifierString);
97 IN CONST VOID *PrimaryEntry,
98 IN CONST VOID *SecondaryEntry
104 CONST OC_KERNEL_ADD_ENTRY *KernelForcePrimaryEntry;
105 CONST OC_KERNEL_ADD_ENTRY *KernelForceSecondaryEntry;
106 CONST CHAR8 *KernelForcePrimaryBundlePathString;
107 CONST CHAR8 *KernelForceSecondaryBundlePathString;
109 KernelForcePrimaryEntry = *(CONST OC_KERNEL_ADD_ENTRY **)PrimaryEntry;
110 KernelForceSecondaryEntry = *(CONST OC_KERNEL_ADD_ENTRY **)SecondaryEntry;
111 KernelForcePrimaryBundlePathString =
OC_BLOB_GET (&KernelForcePrimaryEntry->BundlePath);
112 KernelForceSecondaryBundlePathString =
OC_BLOB_GET (&KernelForceSecondaryEntry->BundlePath);
114 if (!KernelForcePrimaryEntry->Enabled || !KernelForceSecondaryEntry->Enabled) {
118 return StringIsDuplicated (
"Kernel->Force", KernelForcePrimaryBundlePathString, KernelForceSecondaryBundlePathString);
124 IN OC_GLOBAL_CONFIG *Config
130 CONST CHAR8 *BundlePath;
131 UINTN BundlePathSumSize;
132 CONST CHAR8 *Comment;
133 CONST CHAR8 *ExecutablePath;
134 UINTN ExecutableUserLength;
135 UINTN ExecutablePathSumSize;
136 CONST CHAR8 *MaxKernel;
137 CONST CHAR8 *MinKernel;
138 CONST CHAR8 *PlistPath;
139 UINTN PlistUserLength;
140 UINTN PlistPathSumSize;
142 BOOLEAN IsDisableLinkeditJettisonEnabled;
144 UINTN IndexKextPrecedence;
146 CONST CHAR8 *CurrentKext;
147 CONST CHAR8 *ParentKext;
148 CONST CHAR8 *ChildKext;
152 for (Index = 0; Index < Config->Kernel.Add.Count; ++Index) {
153 Arch =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->Arch);
154 BundlePath =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->BundlePath);
155 Comment =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->Comment);
156 ExecutablePath =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->ExecutablePath);
157 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->MaxKernel);
158 MinKernel =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->MinKernel);
159 PlistPath =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->PlistPath);
165 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->Arch is borked (Can only be Any, i386, and x86_64)!\n", Index));
170 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->BundlePath contains illegal character!\n", Index));
179 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->BundlePath does NOT contain .kext suffix!\n", Index));
184 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->Comment contains illegal character!\n", Index));
189 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->ExecutablePath contains illegal character!\n", Index));
195 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->PlistPath contains illegal character!\n", Index));
204 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->PlistPath does NOT contain .plist suffix!\n", Index));
215 "Kernel->Add[%u]->BundlePath (length %u) is too long (should not exceed %u)!\n",
217 AsciiStrLen (BundlePath),
226 ExecutableUserLength = AsciiStrLen (BundlePath) + 1 + AsciiStrLen (ExecutablePath);
231 "Kernel->Add[%u]->BundlePath + '\\' + ExecutablePath (length %u) is too long (should not exceed %u)!\n",
233 ExecutableUserLength,
242 PlistUserLength = AsciiStrLen (BundlePath) + 1 + AsciiStrLen (PlistPath);
247 "Kernel->Add[%u]->BundlePath + '\\' + PlistPath (length %u) is too long (should not exceed %u)!\n",
259 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", Index, MinKernel));
267 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->MaxKernel (currently set to %a) is borked!\n", Index, MaxKernel));
272 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->MinKernel (currently set to %a) is borked!\n", Index, MinKernel));
276 for (IndexKextInfo = 0; IndexKextInfo <
mKextInfoSize; ++IndexKextInfo) {
277 if (AsciiStrCmp (BundlePath,
mKextInfo[IndexKextInfo].KextBundlePath) == 0) {
281 if ( (AsciiStrCmp (ExecutablePath,
mKextInfo[IndexKextInfo].KextExecutablePath) == 0)
282 && (AsciiStrCmp (PlistPath,
mKextInfo[IndexKextInfo].KextPlistPath) == 0))
288 IsLiluUsed = Config->Kernel.Add.Values[Index]->Enabled;
289 IsDisableLinkeditJettisonEnabled = Config->Kernel.Quirks.DisableLinkeditJettison;
290 if (IsLiluUsed && !IsDisableLinkeditJettisonEnabled) {
291 DEBUG ((DEBUG_WARN,
"Lilu.kext is loaded at Kernel->Add[%u], but DisableLinkeditJettison is not enabled at Kernel->Quirks!\n", Index));
299 if (AsciiStrCmp (BundlePath,
"BrcmFirmwareRepo.kext") == 0) {
300 DEBUG ((DEBUG_WARN,
"BrcmFirmwareRepo.kext at Kernel->Add[%u] cannot be injected by OpenCore, please remove it!\n", Index));
306 "Kernel->Add[%u] discovers %a, but its ExecutablePath (%a) or PlistPath (%a) is borked!\n",
321 for (IndexKextPrecedence = 0; IndexKextPrecedence <
mKextPrecedenceSize; ++IndexKextPrecedence) {
324 for (Index = 0; Index < Config->Kernel.Add.Count; ++Index) {
325 CurrentKext =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->BundlePath);
329 if (AsciiStrCmp (CurrentKext, ParentKext) == 0) {
331 }
else if (AsciiStrCmp (CurrentKext, ChildKext) == 0) {
333 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u] discovers %a, but its Parent (%a) is either placed after it or is missing!\n", Index, CurrentKext, ParentKext));
349 Config->Kernel.Add.Values,
350 Config->Kernel.Add.Count,
351 sizeof (Config->Kernel.Add.Values[0]),
361 IN OC_GLOBAL_CONFIG *Config
367 CONST CHAR8 *Comment;
368 CONST CHAR8 *MaxKernel;
369 CONST CHAR8 *MinKernel;
370 CONST CHAR8 *Identifier;
371 CONST CHAR8 *Strategy;
375 for (Index = 0; Index < Config->Kernel.Block.Count; ++Index) {
376 Arch =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->Arch);
377 Comment =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->Comment);
378 Identifier =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->Identifier);
379 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->MaxKernel);
380 MinKernel =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->MinKernel);
381 Strategy =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->Strategy);
387 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->Arch is borked (Can only be Any, i386, and x86_64)!\n", Index));
392 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->Comment contains illegal character!\n", Index));
397 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->Identifier contains illegal character!\n", Index));
405 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", Index, MinKernel));
413 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->MaxKernel (currently set to %a) is borked!\n", Index, MaxKernel));
418 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->MinKernel (currently set to %a) is borked!\n", Index, MinKernel));
422 if ( (AsciiStrCmp (Strategy,
"Disable") != 0)
423 && (AsciiStrCmp (Strategy,
"Exclude") != 0))
425 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->Strategy is borked (Can only be Disable or Exclude)!\n", Index));
434 Config->Kernel.Block.Values,
435 Config->Kernel.Block.Count,
436 sizeof (Config->Kernel.Block.Values[0]),
446 IN OC_GLOBAL_CONFIG *Config
450 CONST CHAR8 *MaxKernel;
451 CONST CHAR8 *MinKernel;
456 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Emulate.MaxKernel);
457 MinKernel =
OC_BLOB_GET (&Config->Kernel.Emulate.MinKernel);
463 DEBUG ((DEBUG_WARN,
"Kernel->Emulate->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", MinKernel));
471 DEBUG ((DEBUG_WARN,
"Kernel->Emulate->MaxKernel (currently set to %a) is borked!\n", MaxKernel));
476 DEBUG ((DEBUG_WARN,
"Kernel->Emulate->MinKernel (currently set to %a) is borked!\n", MinKernel));
481 Config->Kernel.Emulate.Cpuid1Data,
482 Config->Kernel.Emulate.Cpuid1Mask,
483 sizeof (Config->Kernel.Emulate.Cpuid1Data),
484 sizeof (Config->Kernel.Emulate.Cpuid1Mask)
488 DEBUG ((DEBUG_WARN,
"Kernel->Emulate->Cpuid1Data requires Cpuid1Mask to be active for replaced bits!\n"));
498 IN OC_GLOBAL_CONFIG *Config
504 CONST CHAR8 *BundlePath;
505 CONST CHAR8 *Comment;
506 CONST CHAR8 *ExecutablePath;
507 CONST CHAR8 *Identifier;
508 CONST CHAR8 *MaxKernel;
509 CONST CHAR8 *MinKernel;
510 CONST CHAR8 *PlistPath;
514 for (Index = 0; Index < Config->Kernel.Force.Count; ++Index) {
515 Arch =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->Arch);
516 BundlePath =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->BundlePath);
517 Comment =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->Comment);
518 ExecutablePath =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->ExecutablePath);
519 Identifier =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->Identifier);
520 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->MaxKernel);
521 MinKernel =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->MinKernel);
522 PlistPath =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->PlistPath);
528 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->Arch is borked (Can only be Any, i386, and x86_64)!\n", Index));
533 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->Identifier contains illegal character!\n", Index));
538 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->BundlePath contains illegal character!\n", Index));
547 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->BundlePath does NOT contain .kext suffix!\n", Index));
552 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->Comment contains illegal character!\n", Index));
557 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->ExecutablePath contains illegal character!\n", Index));
563 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->PlistPath contains illegal character!\n", Index));
572 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->PlistPath does NOT contain .plist suffix!\n", Index));
580 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", Index, MinKernel));
588 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->MaxKernel (currently set to %a) is borked!\n", Index, MaxKernel));
593 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->MinKernel (currently set to %a) is borked!\n", Index, MinKernel));
602 Config->Kernel.Force.Values,
603 Config->Kernel.Force.Count,
604 sizeof (Config->Kernel.Force.Values[0]),
614 IN OC_GLOBAL_CONFIG *Config
620 CONST CHAR8 *Comment;
621 CONST CHAR8 *MaxKernel;
622 CONST CHAR8 *MinKernel;
623 CONST CHAR8 *Identifier;
627 CONST UINT8 *Replace;
631 CONST UINT8 *ReplaceMask;
632 UINT32 ReplaceMaskSize;
636 for (Index = 0; Index < Config->Kernel.Patch.Count; ++Index) {
637 Base =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Base);
638 Comment =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Comment);
639 Arch =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Arch);
640 Identifier =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Identifier);
641 Find =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Find);
642 FindSize = Config->Kernel.Patch.Values[Index]->Find.Size;
643 Replace =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Replace);
644 ReplaceSize = Config->Kernel.Patch.Values[Index]->Replace.Size;
645 Mask =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Mask);
646 MaskSize = Config->Kernel.Patch.Values[Index]->Mask.Size;
647 ReplaceMask =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->ReplaceMask);
648 ReplaceMaskSize = Config->Kernel.Patch.Values[Index]->ReplaceMask.Size;
649 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->MaxKernel);
650 MinKernel =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->MinKernel);
656 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->Comment contains illegal character!\n", Index));
661 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->Arch is borked (Can only be Any, i386, and x86_64)!\n", Index));
666 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->Identifier contains illegal character!\n", Index));
674 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", Index, MinKernel));
682 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->MaxKernel (currently set to %a) is borked!\n", Index, MaxKernel));
687 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->MinKernel (currently set to %a) is borked!\n", Index, MinKernel));
697 Base[0] !=
'\0' && FindSize == 0,
715 IN OC_GLOBAL_CONFIG *Config
719 BOOLEAN IsCustomSMBIOSGuidEnabled;
720 CONST CHAR8 *UpdateSMBIOSMode;
721 INT64 SetApfsTrimTimeout;
728 IsCustomSMBIOSGuidEnabled = Config->Kernel.Quirks.CustomSmbiosGuid;
729 UpdateSMBIOSMode =
OC_BLOB_GET (&Config->PlatformInfo.UpdateSmbiosMode);
730 if (IsCustomSMBIOSGuidEnabled && (AsciiStrCmp (UpdateSMBIOSMode,
"Custom") != 0)) {
731 DEBUG ((DEBUG_WARN,
"Kernel->Quirks->CustomSMBIOSGuid is enabled, but PlatformInfo->UpdateSMBIOSMode is not set to Custom!\n"));
735 SetApfsTrimTimeout = Config->Kernel.Quirks.SetApfsTrimTimeout;
736 if ( (SetApfsTrimTimeout > MAX_UINT32)
737 || (SetApfsTrimTimeout < -1))
739 DEBUG ((DEBUG_WARN,
"Kernel->Quirks->SetApfsTrimTimeout is invalid value %d!\n", SetApfsTrimTimeout));
749 IN OC_GLOBAL_CONFIG *Config
754 CONST CHAR8 *KernelCache;
761 Arch =
OC_BLOB_GET (&Config->Kernel.Scheme.KernelArch);
763 DEBUG ((DEBUG_WARN,
"Kernel->Scheme->KernelArch is borked (Can only be Auto, i386, i386-user32, or x86_64)!\n"));
767 KernelCache =
OC_BLOB_GET (&Config->Kernel.Scheme.KernelCache);
768 if ( (AsciiStrCmp (KernelCache,
"Auto") != 0)
769 && (AsciiStrCmp (KernelCache,
"Cacheless") != 0)
770 && (AsciiStrCmp (KernelCache,
"Mkext") != 0)
771 && (AsciiStrCmp (KernelCache,
"Prelinked") != 0))
773 DEBUG ((DEBUG_WARN,
"Kernel->Scheme->KernelCache is borked (Can only be Auto, Cacheless, Mkext, or Prelinked)!\n"));
782 IN OC_GLOBAL_CONFIG *Config
797 DEBUG ((DEBUG_VERBOSE,
"config loaded into %a!\n", __func__));
806 for (Index = 0; Index <
ARRAY_SIZE (KernelCheckers); ++Index) {
807 ErrorCount += KernelCheckers[Index](Config);
#define ARRAY_SIZE(Array)
VOID ValidateKextInfo(VOID)
UINTN mKextPrecedenceSize
KEXT_PRECEDENCE mKextPrecedence[]
BOOLEAN OcMatchDarwinVersion(IN UINT32 CurrentVersion OPTIONAL, IN UINT32 MinVersion OPTIONAL, IN UINT32 MaxVersion OPTIONAL)
UINT32 OcParseDarwinVersion(IN CONST CHAR8 *String)
#define KERNEL_VERSION_TIGER_MIN
#define OPEN_CORE_KEXT_PATH
#define OC_STORAGE_SAFE_PATH_MAX
#define L_STR_LEN(String)
BOOLEAN EFIAPI OcAsciiEndsWith(IN CONST CHAR8 *String, IN CONST CHAR8 *SearchString, IN BOOLEAN CaseInsensitiveMatch)
#define OC_BLOB_GET(Blob)
BOOLEAN DataHasProperMasking(IN CONST VOID *Data, IN CONST VOID *Mask, IN UINTN DataSize, IN UINTN MaskSize)
UINT32 ReportError(IN CONST CHAR8 *FuncName, IN UINT32 ErrorCount)
BOOLEAN AsciiArchIsLegal(IN CONST CHAR8 *Arch, IN BOOLEAN IsKernelArch)
UINT32 ValidatePatch(IN CONST CHAR8 *PatchSection, IN UINT32 PatchIndex, IN BOOLEAN FindSizeCanBeZero, IN CONST UINT8 *Find, IN UINT32 FindSize, IN CONST UINT8 *Replace, IN UINT32 ReplaceSize, IN CONST UINT8 *Mask, IN UINT32 MaskSize, IN CONST UINT8 *ReplaceMask, IN UINT32 ReplaceMaskSize)
BOOLEAN StringIsDuplicated(IN CONST CHAR8 *EntrySection, IN CONST CHAR8 *FirstString, IN CONST CHAR8 *SecondString)
UINT32 FindArrayDuplication(IN VOID *First, IN UINTN Number, IN UINTN Size, IN DUPLICATION_CHECK DupChecker)
BOOLEAN AsciiFileSystemPathIsLegal(IN CONST CHAR8 *Path)
BOOLEAN AsciiIdentifierIsLegal(IN CONST CHAR8 *Identifier, IN BOOLEAN IsKernelIdentifier)
BOOLEAN AsciiCommentIsLegal(IN CONST CHAR8 *Comment)
STATIC UINT32 CheckKernelAdd(IN OC_GLOBAL_CONFIG *Config)
STATIC UINT32 CheckKernelPatch(IN OC_GLOBAL_CONFIG *Config)
STATIC UINT32 CheckKernelForce(IN OC_GLOBAL_CONFIG *Config)
STATIC BOOLEAN KernelForceHasDuplication(IN CONST VOID *PrimaryEntry, IN CONST VOID *SecondaryEntry)
STATIC UINT32 CheckKernelBlock(IN OC_GLOBAL_CONFIG *Config)
STATIC BOOLEAN KernelAddHasDuplication(IN CONST VOID *PrimaryEntry, IN CONST VOID *SecondaryEntry)
STATIC UINT32 CheckKernelQuirks(IN OC_GLOBAL_CONFIG *Config)
UINT32 CheckKernel(IN OC_GLOBAL_CONFIG *Config)
STATIC UINT32 CheckKernelScheme(IN OC_GLOBAL_CONFIG *Config)
STATIC BOOLEAN KernelBlockHasDuplication(IN CONST VOID *PrimaryEntry, IN CONST VOID *SecondaryEntry)
STATIC UINT32 CheckKernelEmulate(IN OC_GLOBAL_CONFIG *Config)
UINT32(* CONFIG_CHECK)(IN OC_GLOBAL_CONFIG *Config)