源代码
804de88f b923000000 mov ecx,23h ;让ecx存储,023h也就是三环的段描述符
;RPL为3
804de894 6a30 push 30h
804de896 0fa1 pop fs ;Windows内核有个特殊的基本要求,就是只要CPU在内
;称为KPCR的数据结构(在WIndows中线性地址为0xFFDFF位保护模式中,段寄
;存器的内
;容并非一个段基地址某个表项
;这里查询gdt 0x30处即可
;ffc093df`f0000001
;Base:ffdff000
;fs=0x30h
804de898 8ed9 mov ds,cx ;把ds数据段置为0x23h
;ds=0x23h
804de89a 8ec1 mov es,cx ;es辅助ds
;es=0x23h
804de89c 648b0d40000000 mov ecx,dword ptr fs:[40h] ;将TSS地址存储在ecx中
804de8a3 8b6104 mov esp,dword ptr [ecx+4] ;将esp0给esp,切换esp
;esp=TSS.ESP0
804de8a6 6a23 push 23h ;保存旧ss
804de8a8 52 push edx ;保存寄存器edx值,参数指针
804de8a9 9c pushfd ;保存3环eflag寄存器
804de8aa 6a02 push 2 ;将0环eflag寄存器存储在栈中
804de8ac 83c208 add edx,8 ;指向3环API函数
804de8af 9d popfd ;将eflag变为0环的寄存器
804de8b0 804c240102 or byte ptr [esp+1],2 ;将eflag中的保留位置1
804de8b5 6a1b push 1Bh ;Trap_Frame.ss=1Bh
804de8b7 ff350403dfff push dword ptr ds:[0FFDF0304h] ;这里没看懂,猜测是将3环的eip存在这里面
804de8bd 6a00 push 0 ;存储ErrorCode
804de8bf 55 push ebp ;保存ebp寄存器
804de8c0 53 push ebx ;保存ebx寄存器
804de8c1 56 push esi ;保存esi寄存器
804de8c2 57 push edi ;保存edi寄存器
804de8c3 648b1d1c000000 mov ebx,dword ptr fs:[1Ch] ;获取KPCR指针
804de8ca 6a3b push 3Bh ;Fs寄存器
804de8cc 8bb324010000 mov esi,dword ptr [ebx+124h] ;将KThread存入esi中
804de8d2 ff33 push dword ptr [ebx] ;将ExceptionList压入栈中
804de8d4 c703ffffffff mov dword ptr [ebx],0FFFFFFFFh ;新的ExceptionList置为空
804de8da 8b6e18 mov ebp,dword ptr [esi+18h] ;将新线程的Stack给ebp
804de8dd 6a01 push 1 ;存入1,说明先前是3环调用的
804de8df 83ec48 sub esp,48h ;是esp指向Trap Frame指向第一个成员
804de8e2 81ed9c020000 sub ebp,29Ch ;?????
804de8e8 c6864001000001 mov byte ptr [esi+140h],1 ;将KThread的PreviousMode置为1,存储是谁调用的
804de8ef 3bec cmp ebp,esp ;比较ebp与esp
804de8f1 0f8565ffffff jne nt!KiFastCallEntry2+0x25 (804de85c);不一致,则跳转
804de8f7 83652c00 and dword ptr [ebp+2Ch],0 ;清0
804de8fb f6462cff test byte ptr [esi+2Ch],0FFh ;判断是否是调试状态
804de8ff 89ae34010000 mov dword ptr [esi+134h],ebp ;将当前的ebp给新KPCR的TRAP_FRAME
804de905 0f8535feffff jne nt!Dr_FastCallDrSave (804de740) ;如果是调试状态则跳转
804de90b 8b5d60 mov ebx,dword ptr [ebp+60h] ;
804de90e 8b7d68 mov edi,dword ptr [ebp+68h] ;
804de911 89550c mov dword ptr [ebp+0Ch],edx ;将3环参数开始栈中
804de914 c74508000ddbba mov dword ptr [ebp+8],0BADB0D00h ;
804de91b 895d00 mov dword ptr [ebp],ebx ;将三环的ebp存储到_KTRAP_FRAME.Dbgebp
804de91e 897d04 mov dword ptr [ebp+4],edi ;将三环的eip存储到_KTRAP_FRAME.Dbgeip