2023-04-08 09:27:21 +01:00
|
|
|
#ifndef SOCKS_KEXT_H_
|
|
|
|
|
#define SOCKS_KEXT_H_
|
|
|
|
|
|
|
|
|
|
#include <socks/status.h>
|
2023-05-06 19:48:14 +01:00
|
|
|
#include <socks/object.h>
|
2023-04-08 09:27:21 +01:00
|
|
|
#include <socks/compiler.h>
|
2023-04-09 16:43:03 +01:00
|
|
|
#include <socks/btree.h>
|
2023-04-08 09:27:21 +01:00
|
|
|
|
|
|
|
|
#define KERNEL_KEXT_ID "net.doorstuck.socks-kernel"
|
|
|
|
|
#define KEXT_IDENT_MAX 80
|
2023-04-09 16:43:03 +01:00
|
|
|
#define KEXT_NO_DEPENDENCIES NULL
|
2023-04-08 09:27:21 +01:00
|
|
|
|
|
|
|
|
#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
|
2023-04-09 16:43:03 +01:00
|
|
|
#define __KEXT_INFO_ALIGNMENT 0x80
|
2023-04-08 09:27:21 +01:00
|
|
|
#else
|
|
|
|
|
#define __KEXT_INFO_LINKAGE
|
|
|
|
|
#define __KEXT_INFO_VARNAME() __kext_info
|
|
|
|
|
#define __KEXT_INFO_DEPNAME() __kext_deps
|
|
|
|
|
#define __KEXT_INFO_FLAGS KEXT_NONE
|
2023-04-09 16:43:03 +01:00
|
|
|
#define __KEXT_INFO_ALIGNMENT 0x80
|
2023-04-08 09:27:21 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
2023-04-09 16:43:03 +01:00
|
|
|
#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(), \
|
2023-04-08 09:27:21 +01:00
|
|
|
}
|
|
|
|
|
#else
|
2023-04-09 16:43:03 +01:00
|
|
|
#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(), \
|
2023-04-08 09:27:21 +01:00
|
|
|
}
|
|
|
|
|
#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 {
|
2023-05-06 19:48:14 +01:00
|
|
|
struct object k_base;
|
2023-04-08 09:27:21 +01:00
|
|
|
enum kext_flags k_flags;
|
|
|
|
|
char k_ident[KEXT_IDENT_MAX];
|
2023-04-09 16:43:03 +01:00
|
|
|
uint64_t k_ident_hash;
|
2023-04-12 20:17:11 +01:00
|
|
|
struct btree_node k_node;
|
2023-04-08 09:27:21 +01:00
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
2023-06-02 19:35:07 +01:00
|
|
|
extern kern_status_t init_kernel_kext(void);
|
|
|
|
|
extern struct kext *kernel_kext(void);
|
|
|
|
|
|
2023-04-09 16:43:03 +01:00
|
|
|
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);
|
|
|
|
|
|
2023-04-08 09:27:21 +01:00
|
|
|
#endif
|