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

国庆比较闲,就看了一下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. CONTEXTcontext;
  2. context.ContextFlags=CONTEXT_ALL;
  3. if(!::GetThreadContext(process_info.hThread,&context)){
  4. win_result=::GetLastError();
  5. TerminateTarget(&process_info);
  6. returnwin_result;
  7. }
  8. sandbox_process_=process_info.hProcess;
  9. sandbox_thread_=process_info.hThread;
  10. sandbox_process_id_=process_info.dwProcessId;
  11. #pragmawarning(push)
  12. #pragmawarning(disable:4312)
  13. //Thiscastgeneratesawarningbecauseitis32bitspecific.
  14. void*entry_point=reinterpret_cast<void*>(context.Eax);
  15. #pragmawarning(pop)
  16. base_address_=GetBaseAddress(exe_path,entry_point);
这个写法真是够hack的,目的是获取进程的主模块的起始地址。我查了一下createprocess和的实现,发觉在创建进程主线程的时候,在线程开始执行之前,确实会把用户定义的入口地址放到context的eax里。因为进程的主线程会从BaseProcessStart开始执行,估计BaseProcessStart 会从eax里面取函数地址并执行。 不过这个只是在32位系统上是这样。居然依赖如此隐秘,不确定的特性,也真是够大胆的了,哪天微软改了创建线程的代码,这个估计就挂了。

你可能感兴趣的:(ROM)