| 小我从今天开始在这个版贴点 Win-XP 的跟踪笔记,前辈们不反对吧。^_^省的麻烦所以C的代码就不列了,许多时候汇编比C来的清楚。
 简析:ExCreateHandleTable() 和对象管理器以及句柄表的关系很紧密,它的第一次调用位于 ObInitSystem()。目的是初始化System进程的句柄表。
 
 
 nt!ExCreateHandleTable:
 80603ade 8bff            mov     edi,edi                                                    ; ┓
 80603ae0 55              push    ebp                                                        ; ┣ Prologue
 80603ae1 8bec            mov     ebp,esp                                                    ; ┛
 80603ae3 53              push    ebx                                                        ; : HandleTable
 80603ae4 56              push    esi                                                        ; : CurrentThread
 80603ae5 64a124010000    mov     eax,dword ptr fs:[00000124h]                               ; KeGetCurrentThread()
 80603aeb ff7508          push    dword ptr [ebp+8]                                          ; __in_opt struct _EPROCESS *Process
 80603aee 8bf0            mov     esi,eax                                                    ; ESI <-+-> CurrentThread
 80603af0 e867f7ffff      call    nt!ExpAllocateHandleTable (8060325c)                       ; 注意参数,C代码(Win-2003)和汇编代码(Win-XP)实现上不一样!
 80603af5 8bd8            mov     ebx,eax                                                    ; ┓
 80603af7 85db            test    ebx,ebx                                                    ; ┣ 函数 ExpAllocateHandleTable() 的返回值判断
 80603af9 7452            je      nt!ExCreateHandleTable+0x6f (80603b4d)                     ; ┛
 --------------------------------------------------------------------------------------------
 80603afb ff8ed4000000    dec     dword ptr [esi+0D4h]                                       ; Thread->KernelApcDisable -= 1;    [KeEnterCriticalRegionThread -- Macro in ntddk.h]
 80603b01 57              push    edi                                                        ; : 申请局部变量
 80603b02 6a01            push    1                                                          ; (ARG) : Wait
 80603b04 bf60b55580      mov     edi,offset nt!HandleTableListLock (8055b560)               ; ┓ (ARG) : Resource
 80603b09 57              push    edi                                                        ; ┛
 80603b0a e825eef2ff      call    nt!ExAcquireResourceExclusiveLite (80532934)               ; 注意这里!{FUN} : ExAcquireResourceExclusiveLite()
 --------------------------------------------------------------------------------------------
 80603b0f 8b0d4cb55580    mov     ecx,dword ptr [nt!HandleTableListHead+0x4 (8055b54c)]      ; ECX <-+-> 链表尾部
 80603b15 8d431c          lea     eax,[ebx+1Ch]                                              ; EAX <-+-> [+0x01c] _HANDLE_TABLE.HandleTableList
 80603b18 894804          mov     dword ptr [eax+4],ecx                                      ; [InsertTailList() 操作1] 新插入节点 Blink 域的赋值
 80603b1b c70048b55580    mov     dword ptr [eax],offset nt!HandleTableListHead (8055b548)   ; [InsertTailList() 操作2] 新插入节点 Flink 域的赋值
 80603b21 8901            mov     dword ptr [ecx],eax                                        ; [InsertTailList() 操作3] 原来尾节点 Flink 域的赋值
 80603b23 8bcf            mov     ecx,edi                                                    ; -_-凸  FASTCALL
 80603b25 a34cb55580      mov     dword ptr [nt!HandleTableListHead+0x4 (8055b54c)],eax      ; [InsertTailList() 操作4] 链表首节点 Blink 域的赋值
 --------------------------------------------------------------------------------------------
 80603b2a e8e1e4f2ff      call    nt!ExReleaseResourceLite (80532010)                        ; {FUN} : ExReleaseResourceLite()  !FASTCALL!
 80603b2f ff86d4000000    inc     dword ptr [esi+0D4h]                                       ; Thread->KernelApcDisable += 1;    [KeLeaveCriticalRegionThread -- ..\WRK1.2\base\ntos\inc\kx.h]
 80603b35 5f              pop     edi                                                        ; : 释放局部变量
 80603b36 7513            jne     nt!ExCreateHandleTable+0x6d (80603b4b)                     ; if((Thread->KernelApcDisable += 1) == 0)
 80603b38 8d4634          lea     eax,[esi+34h]                                              ; ┓
 80603b3b 3900            cmp     dword ptr [eax],eax                                        ; ┣ if(Thread->ApcState.ApcListHead[KernelMode].Flink != &Thread->ApcState.ApcListHead[KernelMode])
 80603b3d 740c            je      nt!ExCreateHandleTable+0x6d (80603b4b)                     ; ┛ 80603b4b 为程序的执行流程
 80603b3f b101            mov     cl,1                                                       ; ┓
 80603b41 c6464901        mov     byte ptr [esi+49h],1                                       ; ┣ KiCheckForKernelApcDelivery() 的内部实现(FORCEINLINE)
 80603b45 ff1500874d80    call    dword ptr [nt!_imp_HalRequestSoftwareInterrupt (804d8700)] ; ┛
 --------------------------------------------------------------------------------------------
 80603b4b 8bc3            mov     eax,ebx                                                    ; return HandleTable;
 80603b4d 5e              pop     esi                                                        ; ┓ 清除栈上的局部变量
 80603b4e 5b              pop     ebx                                                        ; ┛
 80603b4f 5d              pop     ebp                                                        ; ESP 没有检验
 80603b50 c20400          ret     4                                                          ; 被调用者清堆栈
 
 |