MCPcopy Create free account
hub / github.com/CloverHackyColor/CloverBootloader / KernelUserPatch

Method KernelUserPatch

rEFIt_UEFI/Platform/kernel_patcher.cpp:2352–2421  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2350}
2351
2352BOOLEAN
2353LOADER_ENTRY::KernelUserPatch()
2354{
2355 INTN Num, y = 0;
2356
2357
2358 // old confuse
2359 // We are using KernelAndKextPatches as set by Custom Entries.
2360 // while config patches go to gSettings.KernelAndKextPatches
2361 // how to resolve it?
2362
2363 for (size_t i = 0 ; i < KernelAndKextPatches.KernelPatches.size(); ++i) {
2364 DBG( "Patch[%zu]: %s\n", i, KernelAndKextPatches.KernelPatches[i].Label.c_str());
2365 if (!KernelAndKextPatches.KernelPatches[i].MenuItem.BValue) {
2366 //DBG_RT( "Patch[%d]: %a :: is not allowed for booted OS %a\n", i, KernelAndKextPatches.KernelPatches[i].Label, OSVersion);
2367 DBG( "==> disabled\n");
2368 continue;
2369 }
2370 // if we modify directly KernelAndKextPatches.KernelPatches[i].SearchLen, it will wrong for next driver
2371 UINTN SearchLen = KernelAndKextPatches.KernelPatches[i].SearchLen;
2372 bool once = false;
2373 UINTN procLen = 0;
2374 UINTN procAddr = searchProc(KernelAndKextPatches.KernelPatches[i].ProcedureName);
2375 DBG("procedure %s found at 0x%llx\n", KernelAndKextPatches.KernelPatches[i].ProcedureName.c_str(), procAddr);
2376 if (SearchLen == 0) {
2377 SearchLen = KERNEL_MAX_SIZE;
2378 procLen = KERNEL_MAX_SIZE - procAddr;
2379 once = true;
2380 } else {
2381 procLen = SearchLen;
2382 }
2383 UINT8 * curs = &KernelData[procAddr];
2384 UINTN j = 0;
2385 while (j < KERNEL_MAX_SIZE) {
2386 if (KernelAndKextPatches.KernelPatches[i].StartPattern.isEmpty() || //old behavior
2387 CompareMemMask((const UINT8*)curs,
2388 KernelAndKextPatches.KernelPatches[i].StartPattern.data(),
2389 KernelAndKextPatches.KernelPatches[i].StartPattern.size(),
2390 KernelAndKextPatches.KernelPatches[i].StartMask.data(),
2391 KernelAndKextPatches.KernelPatches[i].StartPattern.size())) {
2392 DBG( " StartPattern found\n");
2393 Num = SearchAndReplaceMask(curs,
2394 procLen,
2395 (const UINT8*)KernelAndKextPatches.KernelPatches[i].Data.data(),
2396 (const UINT8*)KernelAndKextPatches.KernelPatches[i].MaskFind.data(),
2397 KernelAndKextPatches.KernelPatches[i].Data.size(),
2398 (const UINT8*)KernelAndKextPatches.KernelPatches[i].Patch.data(),
2399 (const UINT8*)KernelAndKextPatches.KernelPatches[i].MaskReplace.data(),
2400 KernelAndKextPatches.KernelPatches[i].Count
2401 );
2402
2403 if (Num) {
2404 y++;
2405 curs += SearchLen - 1;
2406 j += SearchLen - 1;
2407 }
2408 DBG( "==> %s : %lld replaces done\n", Num ? "Success" : "Error", Num);
2409 if ( once || KernelAndKextPatches.KernelPatches[i].StartPattern.isEmpty() ) {

Callers

nothing calls this directly

Calls 7

CompareMemMaskFunction · 0.85
SearchAndReplaceMaskFunction · 0.85
StallMethod · 0.80
sizeMethod · 0.45
c_strMethod · 0.45
isEmptyMethod · 0.45
dataMethod · 0.45

Tested by

no test coverage detected