repair kernel patching

Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
This commit is contained in:
Sergey Isakov 2020-03-16 07:27:02 +03:00
parent 449fa1c6d1
commit 4618b74d1a
2 changed files with 14 additions and 6 deletions

View File

@ -1329,8 +1329,8 @@ FillinKextPatches (IN OUT KERNEL_AND_KEXT_PATCHES *Patches,
TmpData = GetDataSetting (Prop2, "Find", &FindLen); TmpData = GetDataSetting (Prop2, "Find", &FindLen);
TmpPatch = GetDataSetting (Prop2, "Replace", &ReplaceLen); TmpPatch = GetDataSetting (Prop2, "Replace", &ReplaceLen);
//replace len can be smaller if mask using
if (!FindLen || !ReplaceLen || (FindLen != ReplaceLen)) { if (!FindLen || !ReplaceLen /*|| (FindLen != ReplaceLen)*/) {
DBG (" :: invalid Find/Replace data - skipping!\n"); DBG (" :: invalid Find/Replace data - skipping!\n");
continue; continue;
} }
@ -1348,9 +1348,11 @@ FillinKextPatches (IN OUT KERNEL_AND_KEXT_PATCHES *Patches,
CopyMem(Patches->KernelPatches[Patches->NrKexts].MaskFind, TmpData, MaskLen); CopyMem(Patches->KernelPatches[Patches->NrKexts].MaskFind, TmpData, MaskLen);
} }
FreePool(TmpData); FreePool(TmpData);
Patches->KernelPatches[Patches->NrKernels].Patch = (__typeof__(Patches->KernelPatches[Patches->NrKernels].Patch))AllocateCopyPool (FindLen, TmpPatch); // this is "Replace" string len of ReplaceLen
Patches->KernelPatches[Patches->NrKernels].Patch = (__typeof__(Patches->KernelPatches[Patches->NrKernels].Patch))AllocateZeroPool(FindLen);
CopyMem(Patches->KernelPatches[Patches->NrKexts].Patch, TmpPatch, ReplaceLen);
FreePool(TmpPatch); FreePool(TmpPatch);
TmpData = GetDataSetting (Prop2, "MaskReplace", &MaskLen); TmpData = GetDataSetting (Prop2, "MaskReplace", &MaskLen); //reuse MaskLen
MaskLen = (MaskLen > FindLen)? FindLen : MaskLen; MaskLen = (MaskLen > FindLen)? FindLen : MaskLen;
if (TmpData == NULL || MaskLen == 0) { if (TmpData == NULL || MaskLen == 0) {
Patches->KernelPatches[Patches->NrKexts].MaskReplace = NULL; Patches->KernelPatches[Patches->NrKexts].MaskReplace = NULL;

View File

@ -1735,6 +1735,8 @@ BOOLEAN
KernelUserPatch(IN UINT8 *UKernelData, LOADER_ENTRY *Entry) KernelUserPatch(IN UINT8 *UKernelData, LOADER_ENTRY *Entry)
{ {
INTN Num, i = 0, y = 0; INTN Num, i = 0, y = 0;
// old confuse
for (; i < Entry->KernelAndKextPatches->NrKernels; ++i) { for (; i < Entry->KernelAndKextPatches->NrKernels; ++i) {
DBG_RT(Entry, "Patch[%d]: %a\n", i, Entry->KernelAndKextPatches->KernelPatches[i].Label); DBG_RT(Entry, "Patch[%d]: %a\n", i, Entry->KernelAndKextPatches->KernelPatches[i].Label);
if (!Entry->KernelAndKextPatches->KernelPatches[i].MenuItem.BValue) { if (!Entry->KernelAndKextPatches->KernelPatches[i].MenuItem.BValue) {
@ -1862,9 +1864,11 @@ VOID
KernelAndKextsPatcherStart(IN LOADER_ENTRY *Entry) KernelAndKextsPatcherStart(IN LOADER_ENTRY *Entry)
{ {
BOOLEAN KextPatchesNeeded, patchedOk; BOOLEAN KextPatchesNeeded, patchedOk;
// it was intended for custom entries but not work if no suctom entries used
// so set common until better solution invented
Entry->KernelAndKextPatches = (KERNEL_AND_KEXT_PATCHES *)(((UINTN)&gSettings) + OFFSET_OF(SETTINGS_DATA, KernelAndKextPatches));
// we will call KernelAndKextPatcherInit() only if needed // we will call KernelAndKextPatcherInit() only if needed
if ((Entry == NULL) || (Entry->KernelAndKextPatches == NULL)) return; if ((Entry == NULL) || (Entry->KernelAndKextPatches == NULL)) return; //entry is not null as double check
KextPatchesNeeded = ( KextPatchesNeeded = (
Entry->KernelAndKextPatches->KPAppleIntelCPUPM || Entry->KernelAndKextPatches->KPAppleIntelCPUPM ||
@ -1875,12 +1879,14 @@ KernelAndKextsPatcherStart(IN LOADER_ENTRY *Entry)
); );
DBG_RT(Entry, "\nKernelToPatch: "); DBG_RT(Entry, "\nKernelToPatch: ");
DBG_RT(Entry, "Kernels patches: %d\n", Entry->KernelAndKextPatches->NrKernels);
if (gSettings.KernelPatchesAllowed && (Entry->KernelAndKextPatches->KernelPatches != NULL) && Entry->KernelAndKextPatches->NrKernels) { if (gSettings.KernelPatchesAllowed && (Entry->KernelAndKextPatches->KernelPatches != NULL) && Entry->KernelAndKextPatches->NrKernels) {
DBG_RT(Entry, "Enabled: "); DBG_RT(Entry, "Enabled: ");
KernelAndKextPatcherInit(Entry); KernelAndKextPatcherInit(Entry);
if (KernelData == NULL) goto NoKernelData; if (KernelData == NULL) goto NoKernelData;
patchedOk = KernelUserPatch(KernelData, Entry); patchedOk = KernelUserPatch(KernelData, Entry);
DBG_RT(Entry, patchedOk ? " OK\n" : " FAILED!\n"); DBG_RT(Entry, patchedOk ? " OK\n" : " FAILED!\n");
// gBS->Stall(5000000);
} else { } else {
DBG_RT(Entry, "Disabled\n"); DBG_RT(Entry, "Disabled\n");
} }