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。