Tor子系统——Windows进程
该子系统是最先运行也是最底层的子系统,并且该子系统只会在Windows环境下有意义(通过宏定义来判断运行环境)
子系统结构
子系统的结构可见Tor子系统结构定义
const subsys_fns_t sys_winprocess = { .name = "winprocess", /* HeapEnableTerminationOnCorruption and setdeppolicy() are security * features, we want them to run first. */ .level = -100, .supported = WINPROCESS_SYS_ENABLED, .initialize = subsys_winprocess_initialize, };
该函数在启动时,会调用Windows的HeapSetInformation()
API ,启用HeapEnableTerminationOnCorruption功能,并引入Kernel32.dll
BOOL HeapSetInformation(
HANDLE HeapHandle,
HEAP_INFORMATION_CLASS HeapInformationClass,
PVOID HeapInformation,
SIZE_T HeapInformationLength
);
Tor子系统结构体定义
typedef struct subsys_fns_t { // 子系统名称 const char *name; // 子系统是否已编译 bool supported; // 初始级别(-100~100),会从低级别的子系统开始初始换,并且从高级别子系统开始销毁 int level; // 子系统初始化组件,可能会依赖于更低级的子系统 // 初始化程序不应该依赖于运行时动态生成的配置信息,只应该是全局配置 int (*initialize)(void); // 链接调度系统,用于注册订阅 int (*add_pubsub)(struct pubsub_connector_t *); // 非Windows系统在执行fork前由父进程前调用,不会在子进程只用于exec运行另一程序时调用 void (*prefork)(void); // 非Windows系统执行fork后由新的子进程调用,不会在子进程只用于exec运行另一程序时调用 void (*postfork)(void); // 释放子系统拥有的所有线程资源,在退出前调用 void (*thread_cleanup)(void); // 释放子系统所有资源,关闭前调用 void (*shutdown)(void); // 该子系统用到的torrc字段 const struct config_format_t *options_format; // 该子系统拥有的DataDir/State字段 const struct config_format_t *state_format; // 在所有的选项字段验证通过后调用,将配置传送给子系统,需要保证在下次调用该函数前指针的安全性 int (*set_options)(void *); // 接收state状态,Tor不会重加载运行状态,因此只会在启动时运行一次 int (*set_state)(void *); // 更新state状态,一般用于将数据保存在磁盘上时调用 int (*flush_state)(void *); } subsys_fns_t;