Windows中系统调用的流程

Windows中系统调用的流程
潘爱民,2010.9.24

在《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。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/panaimin/archive/2010/09/24/5903432.aspx

你可能感兴趣的:(c,windows,2010)