国庆比较闲,就看了一下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。
这个写法真是够hack的,目的是获取进程的主模块的起始地址。我查了一下createprocess和的实现,发觉在创建进程主线程的时候,在线程开始执行之前,确实会把用户定义的入口地址放到context的eax里。因为进程的主线程会从BaseProcessStart开始执行,估计BaseProcessStart 会从eax里面取函数地址并执行。
不过这个只是在32位系统上是这样。居然依赖如此隐秘,不确定的特性,也真是够大胆的了,哪天微软改了创建线程的代码,这个估计就挂了。
文档
http://sites.google.com/a/chromium.org/dev/
打包下载地址
http://build.chromium.org/buildbot/archives/chromium.tgz
SVN地址
http://src.chromium.org/svn/
就是说说一点有趣的地方
在创建了render进程后,获取了主线程的eax。
- CONTEXTcontext;
- context.ContextFlags=CONTEXT_ALL;
- if(!::GetThreadContext(process_info.hThread,&context)){
- win_result=::GetLastError();
- TerminateTarget(&process_info);
- returnwin_result;
- }
- sandbox_process_=process_info.hProcess;
- sandbox_thread_=process_info.hThread;
- sandbox_process_id_=process_info.dwProcessId;
- #pragmawarning(push)
- #pragmawarning(disable:4312)
- //Thiscastgeneratesawarningbecauseitis32bitspecific.
- void*entry_point=reinterpret_cast<void*>(context.Eax);
- #pragmawarning(pop)
- base_address_=GetBaseAddress(exe_path,entry_point);