#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kpm.h" #include "compact.h" #include "../allowlist.h" #include "../manager.h" static int sukisu_is_su_allow_uid(uid_t uid) { return ksu_is_allow_uid(uid) ? 1 : 0; } static int sukisu_get_ap_mod_exclude(uid_t uid) { return 0; /* Not supported */ } static int sukisu_is_uid_should_umount(uid_t uid) { return ksu_uid_should_umount(uid) ? 1 : 0; } static int sukisu_is_current_uid_manager(void) { return is_manager(); } static uid_t sukisu_get_manager_uid(void) { return ksu_manager_uid; } static void sukisu_set_manager_uid(uid_t uid, int force) { if (force || ksu_manager_uid == -1) ksu_manager_uid = uid; } struct CompactAddressSymbol { const char *symbol_name; void *addr; }; unsigned long sukisu_compact_find_symbol(const char *name); static struct CompactAddressSymbol address_symbol[] = { { "kallsyms_lookup_name", &kallsyms_lookup_name }, { "compact_find_symbol", &sukisu_compact_find_symbol }, { "is_run_in_sukisu_ultra", (void *)1 }, { "is_su_allow_uid", &sukisu_is_su_allow_uid }, { "get_ap_mod_exclude", &sukisu_get_ap_mod_exclude }, { "is_uid_should_umount", &sukisu_is_uid_should_umount }, { "is_current_uid_manager", &sukisu_is_current_uid_manager }, { "get_manager_uid", &sukisu_get_manager_uid }, { "sukisu_set_manager_uid", &sukisu_set_manager_uid } }; unsigned long sukisu_compact_find_symbol(const char* name) { int i; unsigned long addr; for (i = 0; i < (sizeof(address_symbol) / sizeof(struct CompactAddressSymbol)); i++) { struct CompactAddressSymbol *symbol = &address_symbol[i]; if (strcmp(name, symbol->symbol_name) == 0) return (unsigned long)symbol->addr; } addr = kallsyms_lookup_name(name); if (addr) return addr; return 0; } EXPORT_SYMBOL(sukisu_compact_find_symbol);