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 <rifat.44.azad.rifs@gmail.com>
This commit is contained in:
ShirkNeko
2025-06-26 14:15:49 +08:00
parent cfee357ed1
commit 8e4f980db0

View File

@@ -194,6 +194,23 @@ fn is_magisk_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
Ok(status.code() == Some(1)) Ok(status.code() == Some(1))
} }
fn is_magisk_patched_vendor(magiskboot: &Path, workdir: &Path) -> Result<bool> {
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<bool> { fn is_kernelsu_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
let status = Command::new(magiskboot) let status = Command::new(magiskboot)
.current_dir(workdir) .current_dir(workdir)
@@ -205,6 +222,22 @@ fn is_kernelsu_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
Ok(status.success()) Ok(status.success())
} }
fn is_kernelsu_patched_vendor(magiskboot: &Path, workdir: &Path) -> Result<bool> {
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<P: AsRef<Path>, Q: AsRef<Path>>(ifile: P, ofile: Q) -> Result<()> { fn dd<P: AsRef<Path>, Q: AsRef<Path>>(ifile: P, ofile: Q) -> Result<()> {
let status = Command::new("dd") let status = Command::new("dd")
.stdout(Stdio::null()) .stdout(Stdio::null())
@@ -251,7 +284,8 @@ pub fn restore(
let no_ramdisk = !workdir.join("ramdisk.cpio").exists(); let no_ramdisk = !workdir.join("ramdisk.cpio").exists();
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?; 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 new_boot = None;
let mut from_backup = false; let mut from_backup = false;
@@ -483,16 +517,18 @@ fn do_patch(
let no_ramdisk = !workdir.join("ramdisk.cpio").exists(); let no_ramdisk = !workdir.join("ramdisk.cpio").exists();
let is_magisk_patched = is_magisk_patched(&magiskboot, workdir)?; let is_magisk_patched = is_magisk_patched(&magiskboot, workdir)?;
let is_magisk_patched_vendor = is_magisk_patched_vendor(&magiskboot, workdir)?;
ensure!( ensure!(
no_ramdisk || !is_magisk_patched, no_ramdisk || !is_magisk_patched || !is_magisk_patched_vendor,
"Cannot work with Magisk patched image" "Cannot work with Magisk patched image"
); );
println!("- Adding KernelSU LKM"); println!("- Adding KernelSU LKM");
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?; 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; let mut need_backup = false;
if !is_kernelsu_patched { if !is_kernelsu_patched || !is_kernelsu_patched_vendor {
if no_ramdisk { if no_ramdisk {
// vendor ramdisk patching // vendor ramdisk patching
let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init"); let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init");