4

如果我的程序主要使用 win32 API,我的 API 调用是否在 Windows XP/Vista/7 中模拟?

4

3 回答 3

8

它下面有 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除非守护程序正在运行,否则这将无法工作。守护程序由syslogdinit 脚本启动。

这不是一个完美的类比。许多应用程序不依赖于syslog(3),通常可以停止和重新启动syslogd守护程序而不会对系统的操作产生不利影响(与csrss.exe.

于 2009-05-07T14:44:41.293 回答
2

Jared 对命名的看法。不确定这是否是您所得到的,但如果您在 64 位操作系统上运行 32 位进程,则有一个允许它们运行的​​仿真(或“thunking”)层。这适用于所有 64 位版本的 Windows。

于 2009-05-07T14:16:55.087 回答
1

不,Win32 API 的名称有点不对。它可能应该被命名为 Windows API。除非您的代码实际上在其中一种仿真模式下运行,否则它不会被仿真。

于 2009-05-07T13:46:06.317 回答