Tor子系统——Windows进程

Tor笔记目录索引

该子系统是最先运行也是最底层的子系统,并且该子系统只会在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;