windows应用程序接口与错误返回码表
2010-03-27 14:48:04 阿炯

Windows应用程序接口(Windows API),或俗称WinAPI,是微软Windows操作系统中的一套核心应用程序接口。Windows API这一叫法实际上是多个Windows平台上相似接口的统称,这些接口也拥有各自的名字,如Win32 API。几乎所有的Windows应用程序都在与WinAPI进行交互。

WinAPI将与Windows系统有关的复杂操作封装在简单的函数当中,编译成动态链接库,再随Windows一同发布。开发者可以简单地借助这些函数来完成复杂的操作,有效降低了编写Windows程序的难度。Windows有一个软件开发包(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Windows API的软件和利用Windows技术。

C是Windows API(Win32)的主要编程语言,在该API的文档中所公开的函数和数据结构均以该语言进行了描述。但如果某种编程语言能够处理(明确定义的)低级数据结构,并能按照规定进行调用与回调,那么其编译器或汇编器也可以调用Windows API。类似地,在历史上Windows API也由多种语言进行了开发。尽管C不是面向对象的编程语言,但Windows API和Windows都具有面向对象的特性;同时也有许多面向对象语言的包装类和扩展(如微软基础类库MFC、可视化组件库VCL、GDI+等)使这种面向对象的结构更加清晰。例如Windows 8提供的Windows API和WinRT API就是用C++实现的,并且在设计上也是面向对象的。在C成为主流语言之前,Windows API中使用了大量的Pascal和x86汇编语言。对此一个遗留的痕迹就是API函数中仍然使用了Pascal的方式来处理调用函数时传递的参数(而不是像C的那样)。


WinAPI所提供的功能可以归为八类:

1、基础服务(Base Services)
提供了对Windows系统可用的基础资源的访问接口,包括文件系统(file system)、外部设备(device)、进程(process)、线程(thread)和错误处理(error handling)等。这些功能接口在16位Windows中位于kernel.exe、krnl286.exe或krnl386.exe中;在32位和64位Windows下位于kernel32.dll和KernelBase.dll中。这些文件在所有Windows的\Windows\System32 目录中都可以被找到。

2、高级服务(Advanced Services)
提供了对内核以外功能的访问,包括注册表(Windows registry)、关闭/重启系统(shutdown/restart)、服务(Windows Service)、用户账户(user accounts)等。这些函数位于32位Windows上的advapi32.dll和advapires32.dll中。

3、图形设备接口(GDI)
提供了将图形内容输出到显示器、打印机和其他外部输出设备的功能。它位于16位Windows下的gdi.exe,以及32位Windows下的gdi32.dll中。

4、图形化用户界面(GUI)
提供了创建和管理窗口和大多数基本控件(control)、接收鼠标和键盘输入,以及其他与GUI有关的功能。这些调用接口位于:16位Windows下的user.exe,以及32位Windows下的user32.dll。从Windows XP版本之后,基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。

5、通用对话框链接库(Common Dialog Box Library)
为应用程序提供标准对话框(如打开/保存文件对话框、颜色对话框和字体对话框等)。这个链接库位于:16位Windows下的commdlg.dll中,以及32位Windows下的comdlg32.dll中。它被归类为User Interface API之下。

6、通用控件链接库(Common Control Library)
为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位Windows下的commctrl.dll中,以及32位Windows下comctl32.dll中。它被归类为User Interface API之下。使用API函数InitCommonControls或InitCommonControlsEx初始化(即注册)相应的窗口类。InitCommonControlsEx实际注册指定的通用控件的窗口类。注意ICC_WIN95_CLASSES代表12个控件类的集合。InitCommonControls是个空函数,但会使应用程序加载comctl32.dll;在comctl32.dll加载到进程时会在DLL的入口点调用InitCommonControlsEx注册ICC_WIN95_CLASSES控件类。

7、Windows Shell
作为Windows API的组成部分,不仅允许应用程序访问Windows Shell提供的功能,还对之有所改进和增强。它位于16位Windows下的shell.dll中,以及32位Windows下的shell32.dll中(Windows 95则在shlwapi.dll中)。它被归类为User Interface API之下。

8、网络服务(Network Services)
为访问操作系统提供的多种网络功能提供接口。它包括NetBIOS、Winsock、NetDDE及远程过程调用(RPC)等。


Web相关API

Internet Explorer网页浏览器还公开了许多经常被应用程序调用的API,因此通常其也被视为是Windows API的一部分。IE从Windows 95 OSR2起就包含在了Windows系统中,并从Windows 98起开始为应用程序提供Web相关服务。具体来说,它提供:
1.可嵌入的网页浏览器控件(以及 Trident/MSHTML 引擎),位于shdocvw.dll和mshtml.dll之中。

2.urlmon.dll中的命名服务(URL moniters service),利用COM对象为应用程序提供解析URL服务。应用程序也可以为其他程序提供自己的URL处理程序。

3.WinInet IE的网络层,支持HTTP和HTTPS等协议。

4.一个支持多种语言文本的链接库(mlang.dll)。

5.DirectX Transforms,一组图像过滤组件。

6.XML支持(MSXML组件)。

和Windows的邮件功能相关的API,例如地址本和邮件API,在Windows 7取消邮件功能之后也随之从Windows API中去除。由于Windows Mail在Windows Vista上取代了Outlook Express,对应的API也随之变化。


多媒体相关API

经典的Windows多媒体API位于winmm.dll中,包含了播放音频、MIDI通讯、游戏手柄及其他促进多媒体体验的功能。该API源自Windows 3.x。自从Windows 95 OSR2以来,Microsoft把DirectX API作为Windows安装的一部分。DirectX提供一组松散相关的多媒体和游戏服务,包括:
1.Direct3D可以作为OpenGL的替代,来访问3D加速硬件。

2.DirectDraw提供硬件加速2D framebuffer(帧缓冲)访问接口。自DirectX 9以来,相比Direct3D更倾向于后者,因为Direct3D提供更全面的高性能图形功能(毕竟2D渲染只是3D渲染的(不严格)子集)。已被Direct2D替代。

3.DirectSound提供底层次的硬件加速声卡访问。被XAudio替代。

4.DirectInput用来与输入设备(摇杆和gamepad)进行通信。已被DirectX 9中引入的XInput所替代。

5.DirectPlay提供一个多人游戏的架构(multiplayer gaming infrastructure)。它已经被DirectX 9所替代,Microsoft不建议用它开发游戏。

6.DirectShow可以创建和运行通用的多媒体管道(generic multimedia pipelines)。它可以与GStreamer框架相媲美,并且经常被用来渲染游戏视频和创建媒体播放器(Windows Media Player及诸如FFDShow之类的编解码器正是基于此;但在Windows Vista及更高版本中,DirectShow被Media Foundation替代)。不建议用DirectShow开发游戏。

7.DirectMusic提供类似MIDI的功能。与DirectSound一起被XAudio替代。

Microsoft还提供了多个用于媒体编码和播放的API:
1.DirectShow,用于构建和运行通用的媒体管道。它类似于GStreamer框架,常用于渲染游戏内的视频和构建媒体播放器(著名的Windows Media Player即基于它)。如今DirectShow已不再被推荐用于开发。

2.Media Foundation,一种较新的数字媒体API,旨在取代DirectShow。


程序通信API

Windows API最重要功能即为此:处理操作系统和应用程序之间的交互。对于不同的Windows应用程序之间的通信,Microsoft发展了一系列的技术并开发了最主要的Windows API。这些技术从动态数据交换(DDE)开始,随后被对象链接和嵌入(OLE)取代,再被组件对象模型(COM)、自动化对象、ActiveX控件和.NET框架取代。不过,这些技术之间区别并不总是十分明显,并且有很多重叠之处。

这些技术的多样性基本上是对软件开发的不同方面进行细分的结果。自动化特别涉及了导出应用程序和组件的功能为API,以便使其可以由其他应用程序而不是人类来进行控制。.NET是一种自包含的通用方法和技术,用于开发各种使用即时编译语言编写的桌面和Web应用程序。

Windows.pas是一个Pascal/Delphi单元,其中包含了Windows特定的API声明。它在Pascal中的作用就像C中的windows.h一样。


封装库

微软利用许多更底层的Windows API函数,开发出许多封装库(wrapper),让应用程序以更抽象的方式与Windows API进行交互。MFC(Microsoft Foundation Class Library)用C++ 类来封装Windows API的功能,因而允许用更为面向对象的方式与API进行交互。ATL(Active Template Library)是对COM的面向模板(template oriented)的封装。WTL(Windows Template Library)作为ATL的增强,被用来作为MFC的轻型的替代物。

其他著名的封装库是Borland公司的产品,为了与MFC竞争而推出的OWL(Object Windows Library)提供了类似的面向对象封装。不久Borland又推出VCL(Visual Component Library)来取而代之。

大多数的Windows 程序框架(application framework)是对Windows API的封装,因而.NET Framework、Java以及其他在Windows下的程序语言,都是(或者包含)封装库。


历史

Windows API总会为程序员提供大量的构建不同 Windows的底层结构,这有助于为 Windows 程序员开发应用程序提供大量的灵活性和功能。但是,它同样使Windows应用程序要负责处理大量底层且有时是繁琐的与图形用户界面(GUI)相关的操作。

例如,初学C的程序员通常会把编写简单的“Hello world”作为他们的第一项任务。程序的工作部分仅仅是主程序中的一个printf行,在链接到标准I/O库时也仅需要一个include行:
#include <stdio.h>
int main(void) {
    printf("Hello, World!\n");
}

Windows版本的工作部分仍然只有一行代码,但除此之外它需要很多很多行的额外开销。

许多有关Windows API的畅销书的作者查尔斯·佩佐德(Charles Petzold)曾经说过:
“ Windows 1.0 SDK中的最初的Hello world程序或多或少沾了些丑闻。HELLO.C大约有150行,而HELLO.RC资源脚本还多加了大约20多行……在接触到Windows 的Hello world程序时,资深的C程序员通常会惊恐或大笑起来。”

——查尔斯·佩佐德(Charles Petzold),Programming Microsoft Windows with C#

这些年来,Windows操作系统已经今非昔比,而Windows API也随之改变和成长并反映出这种变化。Windows API的Windows 1.0版本只提供不到450个函数调用(Subroutine),而现在的版本提供上千个。然而,就整体而言,Windows接口保持了相当好的一致性,习惯于现在版本Windows API的程序员对古老的Windows 1.0程序也并不会陌生。

微软特别强调维持软件的向后兼容性。为了实现此一目标,有时微软甚至不惜支持使用了非官方乃至(编程上)非法的API的软件。一位致力于Windows API的Windows开发者雷蒙德·陈(Raymond Chen)曾提及:“仅仅是关于应用程序所做出的坏事以及我们让应用程序重新运作所必须(通常是在不由自主的情况下)采用的方法,我可能会写上几个月。这就是在人们指责微软在操作系统升级期间恶意破坏应用程序时,我会特别愤怒的原因。如果有任何无法在Windows95上运行的应用程序,我会将这些应用程序视为个人故障。”

对Windows API来说,其历史上最大的变化之一就是从Win16(在Windows 3.1及更早的版本中提供)到Win32(Windows NT和Windows 95及更高版本)的过渡。虽然Win32早已在Windows NT 3.1中引入,并在Windows 95前就已允许使用,但直到Windows 95应用程序才开始广泛移植到Win32。为了简化转换的过程,在Windows 95中对Microsoft内外的开发人员Windows使用了一种复杂的API thunk方案来允许32位代码调用到16位代码(对大多数Win16 API有效),反之亦然。同样的,64位的Windows也可以通过WoW64运行32位的应用程序,而位于Windows目录下的SysWOW64文件夹中包含了多个用于支持32位应用程序的工具。


版本

几乎每个版本的Windows都引入了其对Windows API的添加和修改,但是API的名称在不同版本的Windows间保持了一致,并且仅当Windows主要的架构和平台都更改时API的名称才会改变。Microsoft最终将当时名叫Win32的API家族改名为Windows API,并使其成为过去和未来API版本的统称。

1、Win16是第一个16位版本Windows的API。它最早被简单地叫做Windows API,但后来为了与较新的32位API区分,它被重命名为了Win16。Win16 API的功能主要驻留在操作系统的核心文件中,如kernel.exe(或krnl286.exe、krnl386.exe)、user.exe和gdi.exe。值得一提的是,尽管这些文件采用了exe的扩展名,它们本质上其实是动态链接库。

2、Win32是Windows 95及后续版本的32位API。与Win16相同,这个API由在系统DLL中实现的函数组成。Win32的核心文件是kernel32.dll、user32.dll和gdi32.dll。Win32最早在Windows NT中引入,而不是Windows 95。Windows 95中的Win32最早被称为Win32c,其中的“c”表示兼容性(英语:compatibility);这个名称后来被微软舍弃,转而使用Win32。

3、Win32s是Windows 3.1x系列的扩展,它为这些系统实现了Win32 API的一部分功能。其中的“s”表示子集(英语:subset)。

4、Win64是64位Windows上的Windows API变体。此时应用程序的32位和64位版本可以从同一个代码库进行编译。在默认情况下,所有内存指针都是64位的(LLP64型),因此部分程序的源代码必须被重写以兼容64位指针算法。

5、WinCE是Windows CE操作系统中的Windows API。


其它实现

尽管微软的Windows API实现有著作权保护,但被普遍认可的是,根据美国的法律先例,其他厂商仍然可以通过提供一致的API来模拟Windows,而不会侵犯著作权。

Wine项目为类Unix平台提供了一个在Linux内核API与Windows API程序之间的Win32 API兼容层。ReactOS则更进一步,想要实现一个完整的Windows操作系统;它通过与Wine项目的密切合作来促进其代码的重用和兼容。DosWin32和HX DOS-Extender是另外两个模拟Windows API的项目,它们允许通过DOS命令行来运行简单的Windows程序。Odin是一个在OS/2平台上模拟Win32的项目。


编译器支持

为了开发使用Windows API的软件,编译器必须能处理和导入微软相关的DLLs或者COM对象。编译器必须接受一种C或C++方言,或者能够处理揭示了内部API函数名称的接口定义语言(Interface description language)文件和头文件及生成的类型库(Type Library)。概括而言,这些预备条件(编译器、开发工具、库和头文件)被统称为Microsoft Platform SDK。很长时间以来,包含了编译器和开发工具的专利产品如Microsoft Visual Studio系列和Borland编译器(尽管至少在Windows下,SDK是可以从整个IDE环境中剥离出来单独免费下载的,据Microsoft Platform SDK Update),是仅有的能提供整套开发环境的选择。如今MinGW和Cygwin也能提供一套这样的开发环境——是基于采用一种独立头文件集合来保证能与微软DLL连接的GCC。LCC-Win32是由Jacob Navia维护的一种“非商业用途免费”的C编译器。Pellesc是由Pelle Orinius维护的一种免费C编译器。MASM32是一个成熟的项目,它通过自制或由SDK平台转换的头文件和库,并利用32位微软汇编器来实现支持Windows API。

微软相关的编译器支持也是异常处理(Structured Exception Handling)特性所需要的。这个体制有双重目的:它提供了语言相关的异常处理赖以实现的基础,同时也是内核藉以通知程序发生诸如解除一个非法指针的引用或堆栈溢出之类异常状况的渠道。甫一被引入Windows 95和NT,微软/Borland C++编译器就有使用这种体制的能力,然而实际实现未被公开,而且必须经过反向工程方可用于Wine项目和免费编译器。SEH的运行机制是先把异常的句柄推入堆栈,继而将它们添加到存储于线程本地资源(即线程环境块的首字段)的一个链表里。事实上,每一个未有程序本身处理的异常,都将由会弹出常规Windows崩溃对话框的默认backstop处理器处理。


客户端错误日志的返回代码表:

0 操作成功完成。

1 功能错误。

2 系统找不到指定的文件。

3 系统找不到指定的路径。

4 系统无法打开文件。

5 拒绝访问。

6 句柄无效。

7 存储控制块被损坏。

8 存储空间不足,无法处理此命令。

9 存储控制块地址无效。

10 环境错误。

11 试图加载格式错误的程序。

12 访问码无效。

13 数据无效。

14 存储器不足,无法完成此操作。

15 系统找不到指定的驱动器。

16 无法删除目录。

17 系统无法将文件移到不同的驱动器。

18 没有更多文件。

19 介质受写入保护。

20 系统找不到指定的设备。

21 设备未就绪。

22 设备不识别此命令。

23 数据错误 (循环冗余检查)。

24 程序发出命令,但命令长度不正确。

25 驱动器无法找出磁盘上特定区域或磁道的位置。

26 无法访问指定的磁盘或软盘。

27 驱动器找不到请求的扇区。

28 打印机缺纸。

29 系统无法写入指定的设备。

30 系统无法从指定的设备上读取。

31 连到系统上的设备没有发挥作用。

32 进程无法访问文件,因为另一个程序正在使用此文件。

33 进程无法访问文件,因为另一个程序已锁定文件的一部分。

36 用来共享的打开文件过多。

38 到达文件结尾。

39 磁盘已满。

50 不支持网络请求。

51 远程计算机不可用 。

52 在网络上已有重复的名称。

53 找不到网络路径。

54 网络忙。

55 指定的网络资源或设备不再可用。

56 已到达网络 BIOS 命令限制。

57 网络适配器硬件出错。

58 指定的服务器无法运行请求的操作。

59 发生意外的网络错误。

60 远程适配器不兼容。

61 打印机队列已满。

62 无法在服务器上获得用于保存待打印文件的空间。

63 删除等候打印的文件。

64 指定的网络名不再可用。

65 拒绝网络访问。

66 网络资源类型错误。

67 找不到网络名。

68 超过本地计算机网卡的名称限制。

69 超出网络 BIOS 会话限制。

70 远程服务器已暂停,或正在启动过程中。

71 当前已无法再同此远程计算机连接,因为已达到计算机的连接数目极限。

72 已暂停指定的打印机或磁盘设备。

80 文件存在。

82 无法创建目录或文件。

83 INT 24 失败。

84 无法取得处理此请求的存储空间。

85 本地设备名已在使用中。

86 指定的网络密码错误。

87 参数错误。

88 网络上发生写入错误。

89 系统无法在此时启动另一个进程。

100 无法创建另一个系统信号灯。

101 另一个进程拥有独占的信号灯。

102 已设置信号灯且无法关闭。

103 无法再设置信号灯。

104 无法在中断时请求独占的信号灯。

105 此信号灯的前一个所有权已结束。

107 程序停止,因为替代的软盘未插入。

108 磁盘在使用中,或被另一个进程锁定。

109 管道已结束。

110 系统无法打开指定的 设备或文件。

111 文件名太长。

112 磁盘空间不足。

113 无法再获得内部文件的标识。

114 目标内部文件的标识不正确。

117 应用程序制作的 IOCTL 调用错误。

118 验证写入的切换参数值错误。

119 系统不支持请求的命令。

120 此功能只被此系统支持。

121 信号灯超时时间已到。

122 传递到系统调用的数据区太小。

123 文件名、目录名或卷标语法不正确。

124 系统调用级别错误。

125 磁盘没有卷标。

126 找不到指定的模块。

127 找不到指定的程序。

128 没有等候的子进程。

130 试图使用操作(而非原始磁盘 I/O)的已打开磁盘分区的文件句柄。

131 试图移动文件指针到文件开头之前。

132 无法在指定的设备或文件上设置文件指针。

133 包含先前加入驱动器的驱动器无法使用 JOIN 或 SUBST 命令。

134 试图在已被合并的驱动器上使用 JOIN 或 SUBST 命令。

135 试图在已被合并的驱动器上使用 JOIN 或 SUBST 命令。

136 系统试图解除未合并驱动器的 JOIN。

137 系统试图解除未替代驱动器的 SUBST。

138 系统试图将驱动器合并到合并驱动器上的目录。

139 系统试图将驱动器替代为替代驱动器上的目录。

140 系统试图将驱动器合并到替代驱动器上的目录。

141 系统试图替代驱动器为合并驱动器上的目录。

142 系统无法在此时运行 JOIN 或 SUBST。

143 系统无法将驱动器合并到或替代为相同驱动器上的目录。

144 目录并非根目录下的子目录。

145 目录非空。

146 指定的路径已在替代中使用。

147 资源不足,无法处理此命令。

148 指定的路径无法在此时使用。

149 企图将驱动器合并或替代为驱动器上目录是上一个替代的目标的驱动器。

150 系统跟踪信息未在 CONFIG.SYS 文件中指定,或不允许跟踪。

151 为 DosMuxSemWait 指定的信号灯事件个数错误。

152 DosMuxSemWait 不可运行。已设置过多的信号灯。

153 DosMuxSemWait 清单错误。

154 输入的卷标超过目标文件系统的长度限制

155 无法创建另一个线程。

156 接收进程已拒绝此信号。

157 段已被放弃且无法锁定。

158 段已解除锁定。

159 线程标识的地址错误。

160 传递到 DosExecPgm 的参数字符串错误。

161 指定的路径无效。

162 信号已暂停。

164 无法在系统中创建更多的线程。

167 无法锁定文件区域。

170 请求的资源在使用中。

173 对于提供取消区域进行锁定的请求不明显。

174 文件系统不支持锁定类型的最小单元更改。

180 系统检测出错误的段号。

183 当文件已存在时,无法创建该文件。

186 传递的标志错误。

187 找不到指定的系统信号灯名称。

196 操作系统无法运行此应用程序。

197 操作系统当前的配置不能运行此应用程序。

199 操作系统无法运行此应用程序。

200 代码段不可大于或等于 64K。

203 操作系统找不到已输入的 环境选项。

205 命令子树中的进程没有信号处理程序。

206 文件名或扩展名太长。

207 第 2 环堆栈已被占用。

208 没有正确输入文件名通配符 * 或 ?,或指定过多的文件名通配符。

209 正在发送的信号错误。

210 无法设置信号处理程序。

212 段已锁定且无法重新分配。

214 连到该程序或动态链接模块的动态链接模块太多。

215 无法嵌套调用 LoadModule。

230 管道状态无效。

231 所有的管道实例都在使用中。

232 管道正在关闭中。

233 管道的另一端上无任何进程。

234 更多数据可用。

240 取消会话。

254 指定的扩展属性名无效。

255 扩展属性不一致。

258 等待的操作过时。

259 没有可用的数据了。

266 无法使用复制功能。

267 目录名无效。

275 扩展属性在缓冲区中不适用。

276 装在文件系统上的扩展属性文件已损坏。

277 扩展属性表格文件已满。

278 指定的扩展属性句柄无效。

282 装入的文件系统不支持扩展属性。

288 企图释放并非呼叫方所拥有的多用户终端运行程序。

298 发向信号灯的请求过多。

299 仅完成部分的 ReadProcessMemoty 或 WriteProcessMemory 请求。

300 操作锁定请求被拒绝。

301 系统接收了一个无效的操作锁定确认。

487 试图访问无效的地址。

534 算术结果超过 32 位。

535 管道的另一端有一进程。

536 等候打开管道另一端的进程。

994 拒绝访问扩展属性。

995 由于线程退出或应用程序请求,已放弃 I/O 操作。

996 重叠 I/O 事件不在信号状态中。

997 重叠 I/O 操作在进行中。

998 内存分配访问无效。

999 错误运行页内操作。

1001 递归太深;栈溢出。

1002 窗口无法在已发送的消息上操作。

1003 无法完成此功能。

1004 无效标志。

1005 此卷不包含可识别的文件系统。请确定所有请求的文件系统驱动程序已加载,且此卷未损坏。

1006 文件所在的卷已被外部改变,因此打开的文件不再有效。

1007 无法在全屏幕模式下运行请求的操作。

1008 试图引用不存在的令牌。

1009 配置注册表数据库损坏。

1010 配置注册表项无效。

1011 无法打开配置注册表项。

1012 无法读取配置注册表项。

1013 无法写入配置注册表项。

1014 注册表数据库中的某一文件必须使用记录或替代复制来恢复。恢复成功完成。

1015 注册表损坏。包含注册表数据的某一文件结构损坏,或系统的文件内存映像损坏,或因为替代副本、日志缺少或损坏而无法恢复文件。

1016 由注册表启动的 I/O 操作恢复失败。注册表无法读入、写出或清除任意一个包含注册表系统映像的文件。

1017 系统试图加载或还原文件到注册表,但指定的文件并非注册表文件格式。

1018 试图在标记为删除的注册表项上运行不合法的操作。

1019 系统无法配置注册表日志中所请求的空间。

1020 无法在已有子项或值的注册表项中创建符号链接。

1021 无法在易变父项下创建稳定子项。

1022 通知更改请求正在完成中,且信息并未返回到呼叫方的缓冲区中。当前呼叫方必须枚举文件来查找更改。

1051 已发送停止控制到服务,该服务被其它正在运行的服务所依赖。

1052 请求的控件对此服务无效

1053 服务并未及时响应启动或控制请求。

1054 无法创建此服务的线程。

1055 锁定服务数据库。

1056 服务的实例已在运行中。

1057 帐户名无效或不存在,或者密码对于指定的帐户名无效。

1058 无法启动服务,原因可能是它被禁用或与它相关联的设备没有启动。

1059 指定了循环服务依存。

1060 指定的服务并未以已安装的服务存在。

1061 服务无法在此时接受控制信息。

1062 服务未启动。

1063 服务进程无法连接到服务控制器上。

1064 当处理控制请求时,在服务中发生异常。

1065 指定的数据库不存在。

1066 服务已返回特定的服务错误码。

1067 进程意外终止。

1068 依存服务或组无法启动。

1069 由于登录失败而无法启动服务。

1070 启动后,服务停留在启动暂停状态。

1071 指定的服务数据库锁定无效。

1072 指定的服务已标记为删除。

1073 指定的服务已存在。

1074 系统当前以最新的有效配置运行。

1075 依存服务不存在,或已被标记为删除。

1076 已接受使用当前引导作为最后的有效控制设置。

1077 上次启动之后,仍未尝试引导服务。

1078 名称已用作服务名或服务显示名。

1079 此服务的帐户不同于运行于同一进程上的其它服务的帐户。

1080 只能为 Win32 服务设置失败操作,不能为驱动程序设置。

1081 这个服务所运行的处理和服务控制管理器相同。 所以,如果服务处理程序意外中止的话,服务控制管理器无法进行任何操作。

1082 这个服务尚未设置恢复程序。

1083 配置成在该可执行程序中运行的这个服务不能执行该服务。

1100 已达磁带的实际结尾。

1101 磁带访问已达文件标记。

1102 已达磁带或磁盘分区的开头。

1103 磁带访问已达一组文件的结尾。

1104 磁带上不再有任何数据。

1105 磁带无法分区。

1106 在访问多卷分区的新磁带时,当前的块大小不正确。

1107 当加载磁带时,找不到分区信息。

1108 无法锁定媒体弹出功能。

1109 无法卸载介质。

1110 驱动器中的介质可能已更改。

1111 复位 I/O 总线。

1112 驱动器中没有媒体。

1113 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符。

1114 动态链接库 (DLL) 初始化例程失败。

1115 系统关机正在进行。

1116 因为没有任何进行中的关机过程,所以无法中断系统关机。

1117 因为 I/O 设备错误,所以无法运行此项请求。

1118 没有串行设备被初始化成功。串行驱动程序将卸载。

1119 无法打开正在与其他设备共享中断请求(IRQ)的设备。至少有一个使用该 IRQ 的其他设备已打开。

1120 序列 I/O 操作已由另一个串行口的写入完成。 (IOCTL_SERIAL_XOFF_COUNTER 已达零。)

1121 因为已过超时时间,所以串行 I/O 操作完成。 (IOCTL_SERIAL_XOFF_COUNTER 未达零。)

1122 在软盘上找不到 ID 地址标记。

1123 软盘扇区 ID 字符域与软盘控制器磁道地址不相符。

1124 软盘控制器报告软盘驱动程序不能识别的错误。

1125 软盘控制器返回与其寄存器中不一致的结果。

1126 当访问硬盘时,重新校准操作失败,重试仍然失败。

1127 当访问硬盘时,磁盘操作失败,重试仍然失败。

1128 当访问硬盘时,即使失败,仍须复位磁盘控制器。

1129 已达磁带结尾。

1130 服务器存储空间不足,无法处理此命令。

1131 检测出潜在的死锁状态。

1132 指定的基址或文件偏移量没有适当对齐。

1140 改变系统供电状态的尝试被另一应用程序或驱动程序否决。

1141 系统 BIOS 改变系统供电状态的尝试失败。

1142 试图在一文件上创建超过系统允许数额的链接。

1150 指定程序要求更新的 Windows 版本。

1151 指定程序不是 Windows 或 MS-DOS 程序。

1152 只能启动该指定程序的一个实例。

1153 该指定程序适用于旧的 Windows 版本。

1154 执行该应用程序所需的库文件之一被损坏。

1155 没有应用程序与此操作的指定文件有关联。

1156 在输送指令到应用程序的过程中出现错误。

1157 执行该应用程序所需的库文件之一无法找到。

1158 当前程序已使用了 Window 管理器对象的系统允许的所有句柄。

1159 消息只能与同步操作一起使用。

1160 指出的源元素没有媒体。

1161 指出的目标元素已包含媒体。

1162 指出的元素不存在。

1163 指出的元素是未显示的存储资源的一部分。

1164 显示设备需要重新初始化,因为硬件有错误。

1165 设备显示在尝试进一步操作之前需要清除。

1166 设备显示它的门仍是打开状态。

1167 设备没有连接。

1168 找不到元素。

1169 索引中没有同指定项相匹配的项。

1170 在对象上不存在指定的属性集。

1171 传递到 GetMouseMovePoints 的点不在缓冲区中。

1172 跟踪(工作站)服务没运行。

1173 找不到卷 ID。

1175 无法删除要被替换的文件。

1176 无法将替换文件移到要被替换的文件。要被替换的文件保持原来的名称。

1177 无法将替换文件移到要被替换的文件。要被替换的文件已被重新命名为备份名称。

1178 卷更改记录被删除。

1179 卷更改记录服务不处于活动中。

1180 找到一份文件,但是可能不是正确的文件。

1181 日志项从日志中被删除。

1200 指定的设备名无效。

1201 设备当前未连接上,但其为一个记录连接。

1202 企图记录先前已被记录的设备。

1203 无任何网络提供程序接受指定的网络路径。

1204 指定的网络提供程序名称无效。

1205 无法打开网络连接配置文件。

1206 网络连接配置文件损坏。

1207 无法枚举空载体。

1208 发生扩展错误。

1209 指定的组名格式无效。

1210 指定的计算机名格式无效。

1211 指定的事件名格式无效。

1212 指定的域名格式无效。

1213 指定的服务名格式无效。

1214 指定的网络名格式无效。

1215 指定的共享名格式无效。

1216 指定的密码格式无效。

1217 指定的消息名格式无效。

1218 指定的消息目标格式无效。

1219 提供的凭据与已存在的凭据集冲突。

1220 企图创建网络服务器的会话,但已对该服务器创建过多的会话。

1221 工作组或域名已由网络上的另一部计算机使用。

1222 网络未连接或启动。

1223 操作已被用户取消。

1224 请求的操作无法在使用用户映射区域打开的文件上执行。

1225 远程系统拒绝网络连接。

1226 网络连接已被适当地关闭了。

1227 网络传输终结点已有与其关联的地址。

1228 地址仍未与网络终结点关联。

1229 企图在不存在的网络连接上进行操作。

1230 企图在使用中的网络连接上进行无效的操作。

1231 不能访问网络位置。有关网络排除故障的信息,请参阅 Windows 帮助。

1232 不能访问网络位置。有关网络排除故障的信息,请参阅 Windows 帮助。

1233 不能访问网络位置。有关网络排除故障的信息,请参阅 Windows 帮助。

1234 没有任何服务正在远程系统上的目标网络终结点上操作。

1235 请求被终止。

1236 由本地系统终止网络连接。

1237 操作无法完成。应该重试。

1238 因为已达到此帐户的最大同时连接数限制,所以无法连接服务器。

1239 试图在这个帐户未被授权的时间内登录。

1240 此帐户并未得到从这个工作站登录的授权。

1241 请求的操作不能使用这个网络地址。

1242 服务器已经注册。

1243 指定的服务不存在。

1244 因为用户还未被验证,不能执行所要求的操作。

1245 因为用户还未登录网络,不能执行所要求的操作。 指定的服务不存在。

1246 正在继续工作。

1247 试图进行初始操作,但是初始化已完成。

1248 没有更多的本地设备。

1249 指定的站点不存在。

1250 具有指定名称的域控制器已经存在。

1251 只有连接到服务器上时,该操作才受支持。

1252 即使没有改动,组策略框架也应该调用扩展。

1253 指定的用户没有一个有效的配置文件。

1254 Microsoft Small Business Server 不支持此操作。

1300 并非所有被引用的特权都指派给呼叫方。

1301 帐户名和安全标识间的某些映射未完成。

1302 没有为该帐户特别设置系统配额限制。

1303 没有可用的加密密钥。返回了一个已知加密密钥。

1304 密码太复杂,无法转换成 LAN Manager 密码。返回的 LAN Manager 密码为空字符串。

1305 修订级别未知。

1306 表明两个修订级别是不兼容的。

1307 这个安全标识不能指派为此对象的所有者。

1308 这个安全标识不能指派为对象的主要组。

1309 当前并未模拟客户的线程试图操作模拟令牌。

1310 组可能未被禁用。