发布时间:2012-8-27 13:23
分类名称:WRK
潘爱民,2010.9.24
From: http://blog.csdn.net/panaimin/article/details/5903432
在《Windows内核原理与实现》一书,我曾经详细地解析了Windows应用程序发出的系统调用,经过ntdll.dll中的stub函数,再通过sysenter/syscall或int 2eh指令,调用到内核的完整过程。图8.5中有一个错误(感谢读者liucy指出这一错误),正确的图应该如下所示。
图中红色文字是改正之后的函数名称。这里实际上把通过sysenter或int 2eh两种情形的系统调用流程画在一起,所以显得较为复杂。如果拆开来,画成两个图,可能会更加容易理解。下面是按照sysenter/sysexit指令的系统调用流程:
而按照int 2eh来进入内核的流程更加简单一些:
无论是哪一种情形,对于ntdll.dll中的NtCreateFile或ntoskrnl.exe中的NtCreateFile函数,它们无 须关心系统调用是怎样发生的。
关于这两种情形下系统调用的详细穿透过程,请参考这本书的8.1.2节,这里不再进一步介绍。最后看一个系统调用栈:
f5484c94 808e3375 nt!IopCreateFile
f5484cf0 808e50ec nt!IoCreateFile
f5484d30 80882a2c nt!NtCreateFile
007deed8 7c8211f4 ntdll!KiFastSystemCallRet
007deedc 76cf2707 ntdll!ZwCreateFile+0xc
007def54 76cf276b iphlpapi!OpenTCPDriver+0xad
007def64 76cf278f iphlpapi!CheckTcpipState+0x62
007def98 76cf299a iphlpapi!GetIpStatsFromStack+0xd
007df00c 76cf32de iphlpapi!GetInterfaceInfo+0x38
007df028 76cf3230 iphlpapi!GetAdapterNameToIndexInfo+0x1e
007df060 76cf6a6b iphlpapi!GetAdapterInfo+0x18
007df0b4 4e7fdf36 iphlpapi!GetAdapterInfoEx+0x1c
007df504 4e7fe2f9 WINHTTP!CIpConfig::GetAdapterListOnNT5+0x6e
007dfac4 4e7fe938 WINHTTP!CIpConfig::GetAdapterList+0x58
...
注意,这里ntdll!ZwCreateFile的符号地址等同于ntdll!NtCreateFile。