| 2350 | } |
| 2351 | |
| 2352 | BOOLEAN |
| 2353 | LOADER_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() ) { |
nothing calls this directly
no test coverage detected