From 8e4f980db04fd9f9a51f96063e56685fa9a82c45 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Thu, 26 Jun 2025 14:15:49 +0800 Subject: [PATCH] ksud: third test properly check if vendor is already patched or not for lkm restoration and also handle magisk patched vendor boot Co-authored-by: rifsxd --- userspace/ksud/src/boot_patch.rs | 42 +++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/userspace/ksud/src/boot_patch.rs b/userspace/ksud/src/boot_patch.rs index e0c25996..7f525544 100644 --- a/userspace/ksud/src/boot_patch.rs +++ b/userspace/ksud/src/boot_patch.rs @@ -194,6 +194,23 @@ fn is_magisk_patched(magiskboot: &Path, workdir: &Path) -> Result { Ok(status.code() == Some(1)) } +fn is_magisk_patched_vendor(magiskboot: &Path, workdir: &Path) -> Result { + let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio"); + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .args([ + "cpio", + vendor_ramdisk_cpio.to_str().unwrap(), + "test", + ]) + .status()?; + + // 0: stock, 1: magisk + Ok(status.code() == Some(1)) +} + fn is_kernelsu_patched(magiskboot: &Path, workdir: &Path) -> Result { let status = Command::new(magiskboot) .current_dir(workdir) @@ -205,6 +222,22 @@ fn is_kernelsu_patched(magiskboot: &Path, workdir: &Path) -> Result { Ok(status.success()) } +fn is_kernelsu_patched_vendor(magiskboot: &Path, workdir: &Path) -> Result { + let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio"); + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .args([ + "cpio", + vendor_ramdisk_cpio.to_str().unwrap(), + "exists kernelsu.ko", + ]) + .status()?; + + Ok(status.success()) +} + fn dd, Q: AsRef>(ifile: P, ofile: Q) -> Result<()> { let status = Command::new("dd") .stdout(Stdio::null()) @@ -251,7 +284,8 @@ pub fn restore( let no_ramdisk = !workdir.join("ramdisk.cpio").exists(); let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?; - ensure!(is_kernelsu_patched, "boot image is not patched by KernelSU"); + let is_kernelsu_patched_vendor = is_kernelsu_patched_vendor(&magiskboot, workdir)?; + ensure!(is_kernelsu_patched || is_kernelsu_patched_vendor, "boot image is not patched by KernelSU"); let mut new_boot = None; let mut from_backup = false; @@ -483,16 +517,18 @@ fn do_patch( let no_ramdisk = !workdir.join("ramdisk.cpio").exists(); let is_magisk_patched = is_magisk_patched(&magiskboot, workdir)?; + let is_magisk_patched_vendor = is_magisk_patched_vendor(&magiskboot, workdir)?; ensure!( - no_ramdisk || !is_magisk_patched, + no_ramdisk || !is_magisk_patched || !is_magisk_patched_vendor, "Cannot work with Magisk patched image" ); println!("- Adding KernelSU LKM"); let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?; + let is_kernelsu_patched_vendor = is_kernelsu_patched_vendor(&magiskboot, workdir)?; let mut need_backup = false; - if !is_kernelsu_patched { + if !is_kernelsu_patched || !is_kernelsu_patched_vendor { if no_ramdisk { // vendor ramdisk patching let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init");