最近工作比较忙,在粗略分析了CoInitialize之后我们一直没有再深入研究,下面言归正传。前面我们初步了解到了CoInitialize其实是通过调用CoInitializeEx来实现功能的,而后者最终调用了wCoInitializeEx函数,如果能进一步了解这个函数的内部实现,那么我们对COM环境的初始化过程就比较清晰了。好,我们下面继续看wCoInitializeEx的汇编代码,这次我们分段来看。
769AF092 arg_0 = dword ptr 8
769AF092 arg_4 = byte ptr 0Ch
769AF092 mov edi, edi
769AF094 push ebp
769AF095 mov ebp, esp
769AF097 push ebx
769AF098 push esi
769AF099 push edi
769AF09A mov edi, ds:__imp__InterlockedIncrement@4 ; InterlockedIncrement(x)
769AF0A0 push offset ?g_cProcessInits@@3KA ; lpAddend
769AF0A5 call edi ; InterlockedIncrement(x) ; InterlockedIncrement(x)
769AF0A7 cmp eax, 1
769AF0AA mov esi, [ebp+arg_0]
769AF0AD jz loc_769CA020
函数一开始先将全局变量g_cProcessInits加1,后面还比较了加1后变量的值是否为1,因此这应该是一个计数器,并且在第一次执行函数时会进行一些额外的操作,具体如下:
769CA020 loc_769CA020:
769CA020 call ?ProcessInitialize@@YGJXZ ; ProcessInitialize(void)
769CA025 test eax, eax
769CA027 mov [e