Refactoring KPM support to check KPM status using CMD_ENABLE_KPM
This commit is contained in:
@@ -425,6 +425,18 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (arg2 == CMD_ENABLE_KPM) {
|
||||||
|
#ifdef CONFIG_KPM
|
||||||
|
bool KPM_Enabled = true;
|
||||||
|
#else
|
||||||
|
bool KPM_Enabled = false;
|
||||||
|
#endif
|
||||||
|
if (copy_to_user((void __user *)arg3, &KPM_Enabled, sizeof(KPM_Enabled))) {
|
||||||
|
pr_info("KPM: copy_to_user() failed\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// all other cmds are for 'root manager'
|
// all other cmds are for 'root manager'
|
||||||
if (!from_manager) {
|
if (!from_manager) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#define CMD_UID_SHOULD_UMOUNT 13
|
#define CMD_UID_SHOULD_UMOUNT 13
|
||||||
#define CMD_IS_SU_ENABLED 14
|
#define CMD_IS_SU_ENABLED 14
|
||||||
#define CMD_ENABLE_SU 15
|
#define CMD_ENABLE_SU 15
|
||||||
|
#define CMD_ENABLE_KPM 100
|
||||||
|
|
||||||
#define EVENT_POST_FS_DATA 1
|
#define EVENT_POST_FS_DATA 1
|
||||||
#define EVENT_BOOT_COMPLETED 2
|
#define EVENT_BOOT_COMPLETED 2
|
||||||
|
|||||||
@@ -305,4 +305,10 @@ extern "C"
|
|||||||
JNIEXPORT jboolean JNICALL
|
JNIEXPORT jboolean JNICALL
|
||||||
Java_com_sukisu_ultra_Natives_setSuEnabled(JNIEnv *env, jobject thiz, jboolean enabled) {
|
Java_com_sukisu_ultra_Natives_setSuEnabled(JNIEnv *env, jobject thiz, jboolean enabled) {
|
||||||
return set_su_enabled(enabled);
|
return set_su_enabled(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
JNIEXPORT jboolean JNICALL
|
||||||
|
Java_com_sukisu_ultra_Natives_isKPMEnabled(JNIEnv *env, jclass clazz) {
|
||||||
|
return (jboolean)is_KPM_enable();
|
||||||
}
|
}
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
#define CMD_IS_UID_SHOULD_UMOUNT 13
|
#define CMD_IS_UID_SHOULD_UMOUNT 13
|
||||||
#define CMD_IS_SU_ENABLED 14
|
#define CMD_IS_SU_ENABLED 14
|
||||||
#define CMD_ENABLE_SU 15
|
#define CMD_ENABLE_SU 15
|
||||||
|
#define CMD_ENABLE_KPM 100
|
||||||
|
|
||||||
static bool ksuctl(int cmd, void* arg1, void* arg2) {
|
static bool ksuctl(int cmd, void* arg1, void* arg2) {
|
||||||
int32_t result = 0;
|
int32_t result = 0;
|
||||||
@@ -96,4 +97,10 @@ bool is_su_enabled() {
|
|||||||
// if ksuctl failed, we assume su is enabled, and it cannot be disabled.
|
// if ksuctl failed, we assume su is enabled, and it cannot be disabled.
|
||||||
ksuctl(CMD_IS_SU_ENABLED, &enabled, nullptr);
|
ksuctl(CMD_IS_SU_ENABLED, &enabled, nullptr);
|
||||||
return enabled;
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_KPM_enable() {
|
||||||
|
bool enabled = false;
|
||||||
|
ksuctl(CMD_ENABLE_KPM, &enabled, nullptr);
|
||||||
|
return enabled;
|
||||||
}
|
}
|
||||||
@@ -83,4 +83,6 @@ bool set_su_enabled(bool enabled);
|
|||||||
|
|
||||||
bool is_su_enabled();
|
bool is_su_enabled();
|
||||||
|
|
||||||
|
bool is_KPM_enable();
|
||||||
|
|
||||||
#endif //KERNELSU_KSU_H
|
#endif //KERNELSU_KSU_H
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ object Natives {
|
|||||||
const val MINIMAL_SUPPORTED_SU_COMPAT = 12040
|
const val MINIMAL_SUPPORTED_SU_COMPAT = 12040
|
||||||
const val KERNEL_SU_DOMAIN = "u:r:su:s0"
|
const val KERNEL_SU_DOMAIN = "u:r:su:s0"
|
||||||
|
|
||||||
|
const val MINIMAL_SUPPORTED_KPM = 12800
|
||||||
|
|
||||||
const val ROOT_UID = 0
|
const val ROOT_UID = 0
|
||||||
const val ROOT_GID = 0
|
const val ROOT_GID = 0
|
||||||
|
|
||||||
@@ -66,6 +68,7 @@ object Natives {
|
|||||||
*/
|
*/
|
||||||
external fun isSuEnabled(): Boolean
|
external fun isSuEnabled(): Boolean
|
||||||
external fun setSuEnabled(enabled: Boolean): Boolean
|
external fun setSuEnabled(enabled: Boolean): Boolean
|
||||||
|
external fun isKPMEnabled(): Boolean
|
||||||
|
|
||||||
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
|
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
|
||||||
private const val NOBODY_UID = 9999
|
private const val NOBODY_UID = 9999
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ import com.ramcosta.composedestinations.generated.destinations.InstallScreenDest
|
|||||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||||
import com.sukisu.ultra.KernelVersion
|
import com.sukisu.ultra.KernelVersion
|
||||||
import com.sukisu.ultra.Natives
|
import com.sukisu.ultra.Natives
|
||||||
|
import com.sukisu.ultra.Natives.isKPMEnabled
|
||||||
import com.sukisu.ultra.R
|
import com.sukisu.ultra.R
|
||||||
import com.sukisu.ultra.getKernelVersion
|
import com.sukisu.ultra.getKernelVersion
|
||||||
import com.sukisu.ultra.ksuApp
|
import com.sukisu.ultra.ksuApp
|
||||||
@@ -895,7 +896,7 @@ private fun InfoCard() {
|
|||||||
if (!isSimpleMode) {
|
if (!isSimpleMode) {
|
||||||
if (lkmMode != true) {
|
if (lkmMode != true) {
|
||||||
val kpmVersion = getKpmVersion()
|
val kpmVersion = getKpmVersion()
|
||||||
val isKpmConfigured = checkKpmConfigured()
|
val isKpmConfigured = checkKPMEnabled()
|
||||||
|
|
||||||
// 根据showKpmInfo决定是否显示KPM信息
|
// 根据showKpmInfo决定是否显示KPM信息
|
||||||
if (showKpmInfo) {
|
if (showKpmInfo) {
|
||||||
@@ -1010,55 +1011,6 @@ private object DeviceModelCache {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private object KpmConfigCache {
|
|
||||||
private var isChecked = false
|
|
||||||
private var isConfigured = false
|
|
||||||
|
|
||||||
fun checkKpmConfigured(): Boolean {
|
|
||||||
if (isChecked) {
|
|
||||||
return isConfigured
|
|
||||||
}
|
|
||||||
|
|
||||||
isConfigured = performKpmCheck()
|
|
||||||
isChecked = true
|
|
||||||
return isConfigured
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun performKpmCheck(): Boolean {
|
|
||||||
try {
|
|
||||||
val process = Runtime.getRuntime().exec("su -c cat /proc/config.gz")
|
|
||||||
val inputStream = process.inputStream
|
|
||||||
val gzipInputStream = GZIPInputStream(inputStream)
|
|
||||||
val reader = BufferedReader(InputStreamReader(gzipInputStream))
|
|
||||||
|
|
||||||
var line: String?
|
|
||||||
while (reader.readLine().also { line = it } != null) {
|
|
||||||
if (line?.contains("CONFIG_KPM=y") == true) {
|
|
||||||
reader.close()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reader.close()
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
val process = Runtime.getRuntime().exec("su -c grep sukisu_kpm /proc/kallsyms")
|
|
||||||
val reader = BufferedReader(InputStreamReader(process.inputStream))
|
|
||||||
if (reader.readLine() != null) {
|
|
||||||
reader.close()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
reader.close()
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取设备型号
|
// 获取设备型号
|
||||||
@SuppressLint("PrivateApi")
|
@SuppressLint("PrivateApi")
|
||||||
private fun getDeviceModel(): String {
|
private fun getDeviceModel(): String {
|
||||||
@@ -1066,8 +1018,12 @@ private fun getDeviceModel(): String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 检查KPM是否存在
|
// 检查KPM是否存在
|
||||||
private fun checkKpmConfigured(): Boolean {
|
private fun checkKPMEnabled(): Boolean {
|
||||||
return KpmConfigCache.checkKpmConfigured()
|
return if (Natives.version >= Natives.MINIMAL_SUPPORTED_KPM) {
|
||||||
|
isKPMEnabled()
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("UnnecessaryComposedModifier")
|
@SuppressLint("UnnecessaryComposedModifier")
|
||||||
|
|||||||
Reference in New Issue
Block a user