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(文档比较大,大家看时请耐心等待)。
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(文档比较大,大家看时请耐心等待)。