系统机制 。。(p118--p128)
系统服务分发 。。。
当应用程序调用kernel32 use32 GDI32 里的API时, 最终会调用ntdll.dll中的原型函数 。。。
对于ntdll中的大部分存根函数的实现是相似的:
在X86P2或更高级的处理器上一般是这样实现的:
mov eax, 0xb7
mov edx, esp
sysenter
ret
其中 0xb7是系统服务分发号 。。。 放到eax中 。。。edx中存放的是参数列表 。。。
sysenter 是 inter专门为快速系统分发提供的指令。。
首先 为了支持这个指令。。 系统引导时 将内核的系统服务分发器的地址放到与该指令想关联的一个寄存器中。。哪个呢? 当执行该指令时, 会切换到内核模式,然后执行系统服务分发器。。当然是从eax 和edx中存取 参数。。
下面说说内核模式的系统服务的分发:
那就是SSDT 和shdow SSDT 了 。。。 那内核怎么用这两个系统服务描述符表呢 ?
1) 每个线程的EThread中都有一个指针指向 系统服务表。。
2) SSDT中实现了 Ntosrknl.exe中的核心执行的系统服务。
3)我们都知道。。在xp中 Ms把 GDI的一些系统服务从用户模式 转移到了 win32k.sys中了。。。而Shdow SSDT 存放的就是这些服务的地址 。。
------------------------------------------------------------------------------
用户程序
|
|
|
| |
kernel32.dll user32.dll GDI32.dll
|
用户模式 ntdll.dll
----------------------------------------------------------------------------
内核模式 | |
ntoskrnl.exe win32k.sys
---------------------------------------------------------------------------------------
对象管理器。。
windows内部有两种对象。。。 执行体对象 和内核对象 。