分类 调试 下的文章

Windows API 错误代码定义在winerror.h里,当我们得到一个Error Code不知其意时,可以查阅这个文件

这里定义了绝大部分的错误,摘录翻译如下

〖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〗-系统无法打开指定的设备或文件。
  〖666666〗-文件名太长。
  〖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〗-无法卸载介质。
  〖6666660〗-驱动器中的介质可能已更改。
  〖6666661〗-复位 I/O 总线。
  〖6666662〗-驱动器中没有媒体。
  〖6666663〗-在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符。
  〖6666664〗-动态链接库 (DLL) 初始化例程失败。
  〖6666665〗-系统关机正在进行。
  〖6666666〗-因为没有任何进行中的关机过程,所以无法中断系统关机。
  〖6666667〗-因为 I/O 设备错误,所以无法运行此项请求。
  〖6666668〗-没有串行设备被初始化成功。串行驱动程序将卸载。
  〖6666669〗-无法打开正在与其他设备共享中断请求(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〗-组可能未被禁用。
  〖1311〗-当前没有可用的登录服务器来服务登录请求。
  〖1312〗-指定的登录会话不存在。可能已被终止。
  〖1313〗-指定的特权不存在。
  〖1314〗-客户没有所需的特权。
  〖1315〗-提供的名称并非正确的帐户名形式。
  〖1316〗-指定的用户已存在。
  〖1317〗-指定的用户不存在。
  〖1318〗-指定的组已存在。
  〖1319〗-指定的组不存在。
  〖1320〗-指定的用户帐户已是指定组的成员,或是因为组包含成员所以无法删除指定的组。
  〖1321〗-指定的用户帐户不是指定组帐户的成员。
  〖1322〗-无法禁用或删除最后剩余的系统管理帐户。
  〖1323〗-无法更新密码。提供作为当前密码的值不正确。
  〖1324〗-无法更新密码。提供给新密码的值包含密码中不允许的值。
  〖1325〗-无法更新密码。为新密码提供的值不符合字符域的长度、复杂性或历史要求。
  〖1326〗-登录失败: 未知的用户名或错误密码。
  〖1327〗-登录失败: 用户帐户限制。
  〖1328〗-登录失败: 违反帐户登录时间限制。
  〖1329〗-登录失败: 不允许用户登录到此计算机。
  〖1330〗-登录失败: 指定的帐户密码已过期。
  〖1331〗-登录失败: 禁用当前的帐户。
  〖1332〗-帐户名与安全标识间无任何映射完成。
  〖1333〗-一次请求过多的本地用户标识符(LUIDs)。
  〖1334〗-无更多可用的本地用户标识符(LUIDs)。
  〖1335〗-对于该特别用法,安全 ID 的次级授权部分无效。
  〖1336〗-访问控制列表(ACL)结构无效。
  〖1337〗-安全 ID 结构无效。
  〖1338〗-安全描述符结构无效。
  〖1340〗-无法创建固有的访问控制列表(ACL)或访问控制项目(ACE)。
  〖1341〗-服务器当前已禁用。
  〖1342〗-服务器当前已启用。
  〖1343〗-提供给识别代号颁发机构的值为无效值。
  〖1344〗-无更多可用的内存以更新安全信息。
  〖1345〗-指定属性无效,或与整个群体的属性不兼容。
  〖1346〗-指定的模拟级别无效, 或所提供的模拟级别无效。
  〖1347〗-无法打开匿名级安全令牌。
  〖1348〗-请求的验证信息类别无效。
  〖1349〗-令牌的类型对其尝试使用的方法不适当。
  〖1350〗-无法在与安全性无关联的对象上运行安全性操作。
  〖1351〗-未能从域控制器读取配置信息,或者是因为机器不可使用,或者是访问被拒绝。
  〖1352〗-安全帐户管理器(SAM)或本地安全颁发机构(LSA)服务器处于运行安全操作的错误状态。
  〖1353〗-域处于运行安全操作的错误状态。
  〖1354〗-此操作只对域的主要域控制器可行。
  〖1355〗-指定的域不存在,或无法联系。
  〖1356〗-指定的域已存在。
  〖1357〗-试图超出每服务器域个数的限制。
  〖1358〗-无法完成请求操作,因为磁盘上的严重介质失败或数据结构损坏。
  〖1359〗-出现了内部错误。
  〖1360〗-通用访问类型包含于已映射到非通用类型的访问掩码中。
  〖1361〗-安全描述符格式不正确 (绝对或自相关的)。
  〖1362〗-请求操作只限制在登录进程中使用。调用进程未注册为一个登录进程。
  〖1363〗-无法使用已在使用中的标识启动新的会话。
  〖1364〗-未知的指定验证数据包。
  〖1365〗-登录会话并非处于与请求操作一致的状态中。
  〖1366〗-登录会话标识已在使用中。
  〖1367〗-登录请求包含无效的登录类型值。
  〖1368〗-在使用命名管道读取数据之前,无法经由该管道模拟。
  〖1369〗-注册表子树的事务处理状态与请求状态不一致。
  〖1370〗-安全性数据库内部出现损坏。
  〖1371〗-无法在内置帐户上运行此操作。
  〖1372〗-无法在内置特殊组上运行此操作。
  〖1373〗-无法在内置特殊用户上运行此操作。
  〖1374〗-无法从组中删除用户,因为当前组为用户的主要组。
  〖1375〗-令牌已作为主要令牌使用。
  〖1376〗-指定的本地组不存在。
  〖1377〗-指定的帐户名不是本地组的成员。
  〖1378〗-指定的帐户名已是本地组的成员。
  〖1379〗-指定的本地组已存在。
  〖1380〗-登录失败: 未授予用户在此计算机上的请求登录类型。
  〖1381〗-已超过在单一系统中可保存机密的最大个数。
  〖1382〗-机密的长度超过允许的最大长度。
  〖1383〗-本地安全颁发机构数据库内部包含不一致性。
  〖1384〗-在尝试登录的过程中,用户的安全上下文积累了过多的安全标识。
  〖1385〗-登录失败: 未授予用户在此计算机上的请求登录类型。
  〖1386〗-更改用户密码时需要交叉加密密码。
  〖1387〗-由于成员不存在,无法将成员添加到本地组中,也无法从本地组将其删除。
  〖1388〗-无法将新成员加入到本地组中,因为成员的帐户类型错误。
  〖1389〗-已指定过多的安全标识。
  〖1390〗-更改此用户密码时需要交叉加密密码。
  〖1391〗-表明 ACL 未包含任何可承继的组件。
  〖1392〗-文件或目录损坏且无法读取。
  〖1393〗-磁盘结构损坏且无法读取。
  〖1394〗-无任何指定登录会话的用户会话项。
  〖1395〗-正在访问的服务有连接数目标授权限制。这时候已经无法再连接,原因是已经到达可接受的连接数目上限。
  〖1396〗-登录失败: 该目标帐户名称不正确。
  〖1397〗-相互身份验证失败。该服务器在域控制器的密码过期。
  〖1398〗-在客户机和服务器之间有一个时间差。

有时开发人员只想调试他们编写的代码,而不想调试应用程序中的第三方代码(如框架和库)。当用户和非用户代码在彼此之间来回调用时,这一点尤其有用。clr调试服务有许多新特性来支持这一点,我们称之为“Just My Code”(JMC)调试。

允许调试器将每个函数标记为用户代码或非用户代码。由调试器决定哪些是用户代码,哪些不是用户代码。visualstudio将使用来自项目系统的提示,如果缺少符号,还将假定给定模块是否为非用户代码。您也可以使用System.Diagnostics.DebuggerNonUserCodeAttribute属性告诉VS将特定方法标记为非用户代码。

有很多因素决定了调试在编程乃至整个计算机世界中的无比重要性。从根本上来说,是计算机系统的设计理念决定了调试的重要地位。现代计算机系统的一个重要设计原则是让硬件在软件的指挥下工作,把灵活和智能留在软件中实现,这同时也把计算机系统的控制权交给了软件。让软件控制强大的计算机硬件是聪明的,运行不同的软件就可以让同一台机器做完全不同的事情也是冒险的,一条错误的指令就可能让系统崩溃甚至导致灾难。 降低风 险的方法是提高软件的质量和我们对软件的控 制力。 但对人 类而言 , 无形 的软件比有形 的硬件更加难以驾驭 ! 软件瑕疵 总是存在但却难以寻找 ; 病毒和恶意软件不请 自来 , 而且挥之不去 ; C P U 不堪重负 , 用 户下达的命令却还得不 到执行。 相对于淳朴的硬件 , 软件更 加复杂 、 多变、 柒鹜、 事故和狡黯 ! 何以应对? 为了控制软件 , 计算机先 驱在一开始设计计算机系统时就设计了各种调试设施 , 包括单步执行和 中 断执行等。 今天我们将这些 功能纳入 到调试器工具中。 一旦进 了调 试器 , 再狂野的软件都会变得服服帖帖 , 所有的宏观结构和微观 细节任由我们审 阅 , 大到整个地址空 间和每个文件 , 小到每一个内存单元和每一条指令 。 如果静态的分析还不够 , 那么我们可 以让 它根据我们的要求来执行 , 执行 一 条指令 , 执行到下一个分支 , 执行到上一级 函数 , 等等。 总之 , 以调试 器 为核心的调 试技术是征服软件和计算机世界的最强大工具 , 其用途很广。

具 体地讲 , 首先 , 调试是 定位软件瑕疵的最直接和最 有效的方法 。 没 有哪个程序员能一下子 写出没有错误 的代码。 而使用 以调试器 为主的调试 工具进行调试是定位瑕疵的最直接方法 , 可以从 问题 的症状入手 , 正 向跟 踪或者反 向追 溯。 对于大多数瑕疵 , 使用合适的调试方法可 以大大提高定 位到问题根源 的效率 。 今天的软件环境在不断向着大型化 、 并行化、 复杂 化 方向发展 , 定位瑕疵的难度也在随之不 断提高。 完全靠读源代码来寻找 b u g 的方法已经很难适应今天的软件发展形势 。 另外 , 枚举和排除法通常 也会因系统中的软硬件模块数量太 多而难 以实施 , 有时候 , 花了几天时间 来做替换仍然找不 到怀疑对 象。

第二 , 调 试可 以帮助程序员提高编写代码 的能力。 因 为调试可 以让程 序员彻底了解程 序的实际执行过程 , 检查与自己设计时的预想是 否一致 , 如果 不一致 , 那 么很可能预示 着有问题存在 , 应该引起重视 。 另外 , 调试 过程可 以让 程序员更好的认识到 提高代码可调试性和代码质量 的重要性 。 从此 , 自觉的改进编码方式 , 合理 添加用来支持调 试的代码 。 编码 和调 试 是程序员 日常工作中的两个最 主要任务 , 这两个任务是相辅相成的 , 编写 具有可 调试性的高质量代码 , 可 以明显提高调试效率 , 节约调试时间。 另 一方面 , 调试可 以让程 序员真切感受程序的实际执行过程 , 反思编码和 设 计中的问题 , 加深对软件和 系统的理解 , 提高对代码的感知力和控制力。

第三 , 调试工具是学习计算机系统和其它软硬件知识 的好帮手 。 通过 软件调试技术的强大观察能力和 断点、 栈回溯 、 跟踪等功能可 以快速的了 解一个软件和系统的模块 、 架构 、 和工 作流程 , 因此是学习 其它软硬件技 术的一 个快速而有效的方 法 。

我们已经了解了什么是Dump文件,它保存了什么数据,有什么作用,但它是如何存储的,数据格式是怎样的呢。下面简单说一下。

一、总体结构

 

二、文件头

首先文件的最开始的32个字节是Dump文件的文件头,这里包含了Dump文件标识、格式版本、校验和、时间戳和一些标志,数据结构如下

typedef struct _MINIDUMP_HEADER {

  ULONG32 Signature;
  ULONG32 Version;
  ULONG32 NumberOfStreams;
  RVA     StreamDirectoryRva;
  ULONG32 CheckSum;
  union {
    ULONG32 Reserved;
    ULONG32 TimeDateStamp;
  };
  ULONG64 Flags;
} MINIDUMP_HEADER, *PMINIDUMP_HEADER

上面的结构包含了很多信息,总共32个字节,存放在文件的最开始的位置,下面分别说下各成员:

  • Signature---文件标识
    4个字节,存放内容是"MDMP"字符串的ASSIC码。可以简单的读取文件的头4个字节是否等于"MDMP"来判断一个文件是否是Dump文件。
  • Version---Dump格式的版本
    低两字节是MiniDump的版本号,高两字节是一个特定整形值
  • NumberofStreams----文件里内存数据流的计数
    也就是MiniDump目录表的元素个数。dump文件是以流的形式保存内存数据,各个流的类型不一样。
  • StreamDirectoryRVA
    流目录表的文件偏移地址,从文件最开始处也就是地址0开始,那么要寻址流目录:0+StreamDirectoryRva(字节)
  • CheckSum
    文件校验和,可以为0
  • TimeDataStamp
    时间戳,文件的修改时间
  • Flags
    一个或多个MINIDUMP_TYPE的枚举值组成的标志,说明本文件里包含了哪些信息。

三、流目录

文件头过后紧接着的是流目录。通过文件头里的StreamDirectoryRVA字段决定我们可以快速定位到流目录在文件里的位置。

我们可以看到流目录紧挨着文件头的尾部。
流目录记录内存数据的流的摘要数据组成的数组,方便解析器进行解析和数据定位。数组元素由如下结构填充:

typedef struct _MINIDUMP_DIRECTORY {
ULONG32 StreamType;
MINIDUMP_LOCATION_DESCRIPTOR Location;
} MINIDUMP_DIRECTORY, *PMINIDUMP_DIRECTORY;
  • StreamType---流类型
    这是一个4字节的MINIDUMP_STREAM_TYPE枚举类型的数据

    typedef enum _MINIDUMP_STREAM_TYPE {
    UnusedStream,
    ReservedStream0,
    ReservedStream1,
    ThreadListStream,
    ModuleListStream,
    MemoryListStream,
    ExceptionStream,
    SystemInfoStream,
    ThreadExListStream,
    Memory64ListStream,
    CommentStreamA,
    CommentStreamW,
    HandleDataStream,
    FunctionTableStream,
    UnloadedModuleListStream,
    MiscInfoStream,
    MemoryInfoListStream,
    ThreadInfoListStream,
    HandleOperationListStream,
    TokenStream,
    JavaScriptDataStream,
    SystemMemoryInfoStream,
    ProcessVmCountersStream,
    IptTraceStream,
    ThreadNamesStream,
    ceStreamNull,
    ceStreamSystemInfo,
    ceStreamException,
    ceStreamModuleList,
    ceStreamProcessList,
    ceStreamThreadList,
    ceStreamThreadContextList,
    ceStreamThreadCallStackList,
    ceStreamMemoryVirtualList,
    ceStreamMemoryPhysicalList,
    ceStreamBucketParameters,
    ceStreamProcessModuleMap,
    ceStreamDiagnosisList,
    LastReservedStream
    } MINIDUMP_STREAM_TYPE;
  • Location---流数据的位置信息
    位置信息也是由一个结构MINIDUMP_LOCATION_DESCRIPTOR来描述的,包含流数据大小和文件偏移地址

    typedef struct _MINIDUMP_LOCATION_DESCRIPTOR {
    ULONG32 DataSize;
    RVA Rva;
    } MINIDUMP_LOCATION_DESCRIPTOR;

通过上面的相关结构,我们可以得出,一个流目录项总供有12个字节,那么有多少个项呢,由文件头里的字段NumberOfStreams给出,比如

我们就可以知道,流目录的大小=sizeof(MINIDUMP_DIRECTORY)*MINIDUMP_HEADER::NumberOfStreams。这个文件里的流目录的大小=12*17=204B

 

----未完待续

问题是:
也许您在调试时浏览了全局、局部或参数,然后通过一些丑陋的对象引用(如哈希表)来查找对象引用。你希望能在那个物体上获得一些身份,这样你就可以很容易地再次找到它。以后重新查找它可能不实际,特别是如果程序状态自上次以来已更改,以致原始步骤不再生成相同的对象。如果一个数据结构被更改,一个变量被重新分配,或者一个函数返回并使其所有的局部变量无效,那么很容易发生这种情况。事实上,在这种情况下,回溯原始步骤甚至可能产生完全不同的对象。
解决方案是提供独立于其发现方式的“对象标识”。然后,不管程序状态发生了什么变化,都可以在以后根据其标识检索对象

本机代码中的对象标识

在本机代码中,通过“this”指针,每个对象都有一个内部标识。由于本机代码中没有GC移动对象,所以对象的地址是常量,只要对象还活着,就可以用来引用对象。


例如,如果我知道地址0x0012eeff有一个Foo类型的对象,我可以通过检查“((Foo*)0x0012eeff)”随时查看它。地址提供了一个非常方便的固有对象标识。

托管代码中的问题

由于托管代码有一个GC来移动对象,所以转换地址不一定是安全的。地址可以是0x0012eeff,然后GC可以将其移动到0x44556677。托管代码的任何对象标识解决方案都需要与垃圾回收器协作。

托管代码中的对象标识示例