#ifndef SOCKS_KEXT_H_ #define SOCKS_KEXT_H_ #include #include #include #define KERNEL_KEXT_ID "net.doorstuck.socks-kernel" #define KEXT_IDENT_MAX 80 #define KEXT_NO_DEPENDENCIES NULL #define __KEXT_INFO_VARNAME_2(a, b) a ## b #define __KEXT_INFO_VARNAME_1(a, b) __KEXT_INFO_VARNAME_2(a, b) #ifdef SOCKS_INTERNAL #define __KEXT_INFO_LINKAGE static #define __KEXT_INFO_VARNAME() __KEXT_INFO_VARNAME_1(__kext_info, __LINE__) #define __KEXT_INFO_DEPNAME() __KEXT_INFO_VARNAME_1(__kext_deps, __LINE__) #define __KEXT_INFO_FLAGS KEXT_INTERNAL #define __KEXT_INFO_ALIGNMENT 0x80 #else #define __KEXT_INFO_LINKAGE #define __KEXT_INFO_VARNAME() __kext_info #define __KEXT_INFO_DEPNAME() __kext_deps #define __KEXT_INFO_FLAGS KEXT_NONE #define __KEXT_INFO_ALIGNMENT 0x80 #endif #ifdef __cplusplus #define DEFINE_KEXT(ident, online, offline, ...) \ static const char *__KEXT_INFO_DEPNAME()[] = { \ __VA_ARGS__, NULL \ }; \ static struct kext_info __section(".kextinfo") __aligned(__KEXT_INFO_ALIGNMENT) __used __KEXT_INFO_VARNAME() = { \ __KEXT_INFO_FLAGS, \ ident, \ online, \ offline, \ __KEXT_INFO_DEPNAME(), \ } #else #define DEFINE_KEXT(ident, online, offline, ...) \ static const char *__KEXT_INFO_DEPNAME()[] = { \ __VA_ARGS__, NULL \ }; \ static struct kext_info __section(".kextinfo") __aligned(__KEXT_INFO_ALIGNMENT) __used __KEXT_INFO_VARNAME() = { \ .k_flags = __KEXT_INFO_FLAGS, \ .k_ident = ident, \ .k_online = online, \ .k_offline = offline, \ .k_dependencies = __KEXT_INFO_DEPNAME(), \ } #endif struct kext; enum kext_flags { KEXT_NONE = 0x00u, KEXT_INTERNAL = 0x01u, KEXT_ONLINE = 0x02u, }; struct kext_info { enum kext_flags k_flags; char k_ident[KEXT_IDENT_MAX]; kern_status_t(*k_online)(struct kext *); kern_status_t(*k_offline)(struct kext *); const char **k_dependencies; }; struct kext { enum kext_flags k_flags; char k_ident[KEXT_IDENT_MAX]; uint64_t k_ident_hash; btree_node_t k_node; kern_status_t(*k_online)(struct kext *); kern_status_t(*k_offline)(struct kext *); unsigned int k_nr_dependencies; struct kext **k_dependencies; }; extern kern_status_t scan_internal_kexts(void); extern kern_status_t bring_internal_kexts_online(void); extern kern_status_t kext_cache_init(void); extern struct kext *kext_alloc(void); extern void kext_release(struct kext *kext); extern kern_status_t kext_register(struct kext *kext); extern struct kext *kext_get_by_id(const char *ident); extern kern_status_t kext_bring_online(struct kext *kext); #endif