CSDN博客

img videosender

看chromium代码发现一点有趣的东西

发表于2008/10/3 3:22:00  971人阅读

国庆比较闲,就看了一下chromium的代码,也就是chrome的代码。我比较感兴趣的是它多进程管理和沙箱的实现。整体架构就不说了,官网上写得挺清楚,具体流程我也不说了,说的再清楚也不如代码清楚。
文档
http://sites.google.com/a/chromium.org/dev/
打包下载地址
http://build.chromium.org/buildbot/archives/chromium.tgz
SVN地址
http://src.chromium.org/svn/
就是说说一点有趣的地方
在创建了render进程后,获取了主线程的eax。
  1.   CONTEXT context;
  2.   context.ContextFlags = CONTEXT_ALL;
  3.   if (!::GetThreadContext(process_info.hThread, &context)) {
  4.     win_result = ::GetLastError();
  5.     TerminateTarget(&process_info);
  6.     return win_result;
  7.   }
  8.   sandbox_process_ = process_info.hProcess;
  9.   sandbox_thread_ = process_info.hThread;
  10.   sandbox_process_id_ = process_info.dwProcessId;
  11. #pragma warning(push)
  12. #pragma warning(disable: 4312)
  13.   // This cast generates a warning because it is 32 bit specific.
  14.   void* entry_point = reinterpret_cast<void*>(context.Eax);
  15. #pragma warning(pop)
  16.   base_address_ = GetBaseAddress(exe_path, entry_point);
这个写法真是够hack的,目的是获取进程的主模块的起始地址。我查了一下createprocess和的实现,发觉在创建进程主线程的时候,在线程开始执行之前,确实会把用户定义的入口地址放到context的eax里。因为进程的主线程会从BaseProcessStart开始执行,估计BaseProcessStart 会从eax里面取函数地址并执行。不过这个只是在32位系统上是这样。居然依赖如此隐秘,不确定的特性,也真是够大胆的了,哪天微软改了创建线程的代码,这个估计就挂了。
阅读全文
0 0

相关文章推荐

img
取 消
img