您的位置:首页 > 理论基础 > 计算机网络

Windows XP System Services(http://webcrazy.yeah.net)

2005-01-31 18:19 1371 查看
 Windows XP System Services
              WebCrazy(http://webcrazy.yeah.net)

    在《再谈Windows NT/2000内部数据结构》一文中我曾经介绍过Windows 2000 System Call。如今Windows XP正式版已经出来了。从总的System Call的组织上看是没有多大的改变。System Call调度表仍是由ntoskrnl.exe导出的全局变量KeServiceDescriptorTable指定。我在分析了Windows XP Professional Build 2600(我手头上只有这个盘),发现与Windows 2000 Server的区别是win32k.sys导出的System Call表的基地址由KeServiceDescriptorTable-30h处指定,而不是2000中的KeServiceDescriptorTable-0ch处。关于System Call参数表等,目前仍没有发现有其他差异。

    在2001年2月25日的学习心得中我就指出Whistler Beta 1(Windows XP的beta)的System Call调度方式与Windows 2000就有较大的区别。Windows XP沿袭了Beta 1时的做法。我们从NtOpenKey出发来看看System Call调度。

    kd> u ntdll!NtOpenKey
    ntdll!ZwOpenKey:
    77f7eb23 b877000000 mov eax,0x77
    77f7eb28 ba0003fe7f mov edx,0x7ffe0300
    77f7eb2d ffd2 call edx
    77f7eb2f c20c00 ret 0xc

    其中0x77是NtOpenKey在Windows XP中的System Call ID.从ret 0xc指令我们很容易的知道NtOpenKey是有三个参数的。继续跟踪7ffe0300:

    kd> u 7ffe0300 l 20
    SharedUserData!SystemCallStub:
    7ffe0300 8bd4 mov edx,esp
    7ffe0302 0f34 sysenter
    7ffe0304 c3 ret
    7ffe0305 9c pushfd
    7ffe0306 810c2400010000 or dword ptr [esp],0x100
    7ffe030d 9d popfd
    7ffe030e c3 ret
    7ffe030f 8bd4 mov edx,esp
    7ffe0311 0f05 syscall
    7ffe0313 c3 ret

    从这部分代码中可以看出传入ntoskrnl!KiSystemService时eax与edx的值与Windows 2000一样,仍分别为System Call ID与参数地址。唯一区别的是由原来的int 2eh指令改为sysenter指令。我查过Intel文档这个指令是PII引入的。其执行时间周期比int 2eh来得短。这也是Windows XP从性能上考虑做的改进。但这导致我的Strace之类直接该2eh IDT的应用小工具失效。关于AMD的syscall请查阅AMD文档。从上面的汇编代码也可以看出这两指令的机器码也是不一样的。

    在《Windows 2000 System Services列表》一文中,我曾指出“Windows 2000 Server Build 2195 SP0 中文版共从ntoskrnl.exe(x86单处理器版本)中导出248个System Services,而从win2k.sys中导出639个System Services”。Windows XP要扩充其操作系统功能,免不了要对System Service的扩充。Windows XP Professional Build 2600共从ntoskrnl.exe(x86单处理器版本)中导出284个System Services,而从win2k.sys中导出666个System Services。共增加了63个。为了对Windows XP Kernel有一个整体的概念。我使用Softice与windbg整理了这些System Call。同样可以参考的是各System Call对应的各内核例程名。我还针对Windows 2000 Server SP0 Build 2195对增加或有过修改的System Call做了标记。应该指出的是这份列表并不是Microsoft的文档。我也只是针对我使用的版本做的分析。从新增加的例程我们也可以隐约的看到Windows XP的改进。列表中也只列出System Service例程名,对于完整的ntoskrnl.exe与win32k.sys的Symbol大家可使用windbg进行学习。我也将这部分做成Excel文件,由于空间的限制,我就没有上传这部分了。需要的朋友请直接联系我(tsu00@263.net)。

    附:Windows XP Build 2600 System Services vs Windows 2000 Build 2195 System Services(文档比较大,大家看时请耐心等待)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息