如果我的程序主要使用 win32 API,我的 API 调用是否在 Windows XP/Vista/7 中模拟?
3 回答
它下面有 Windows NT 内核,原生 NT 应用程序使用(大部分未记录的)NT API 与其交互。
csrss.exe
,即“客户端/服务器运行时子系统”,是一个提供用户模式 Win32 子系统和win32k.sys
内核模式 Win32 子系统的原生 NT 应用程序。如果不加载这两个,Win32 应用程序将无法运行。
smss.exe
,“会话管理子系统”,是启动期间要执行的第一个应用程序。作为其任务之一,它启动 Win32 子系统。
你认为什么是“本地人”?内核根本不理解 Win32——所有 Win32 API 调用都由运行时处理csrss
,最终归结为 NT API 调用。但是你永远不会在没有 Win32 子系统的情况下运行 Windows。
还存在用于 Windows 的 OS/2 和 POSIX 子系统。我不相信它们是常用的。
如果您熟悉 UNIX,这里有一个粗略的类比:是syslog(3)
原生 API 吗?
POSIX 要求它的存在。它可能由libc
运行时库实现为“连接到套接字/管道并发送消息”。syslogd
除非守护程序正在运行,否则这将无法工作。守护程序由syslogd
init 脚本启动。
这不是一个完美的类比。许多应用程序不依赖于syslog(3)
,通常可以停止和重新启动syslogd
守护程序而不会对系统的操作产生不利影响(与csrss.exe
.
Jared 对命名的看法。不确定这是否是您所得到的,但如果您在 64 位操作系统上运行 32 位进程,则有一个允许它们运行的仿真(或“thunking”)层。这适用于所有 64 位版本的 Windows。
不,Win32 API 的名称有点不对。它可能应该被命名为 Windows API。除非您的代码实际上在其中一种仿真模式下运行,否则它不会被仿真。