应用程序验证工具 - 停止代码 - 网络

这组测试包含以下停止代码。

从 DllMain 调用非法网络 API

可能的原因

调用了不支持从 DllMain 内部调用的网络 API。 许多 Win32 API(不仅仅是 Win32 网络 API)都不能从 DllMain 调用。 有关详细信息,请阅读 MSDN 库中有关 DllMain 的文档。 要确定调用的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 从 DllMain 调用的网络功能
  • 参数 2 - 无效调用的 Dll 名称(如果不是 NULL
  • 参数 3 - 未用
  • 参数 4 - 未用

其他信息
  • 测试层: 网络
  • 停止 ID: UNSUPPORTED_API_CALL_IN_DLLMAIN
  • 停止代码: 0000e000
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

尝试使用封闭的 SOCKET

可能的原因

SOCKET 在关闭后被使用。 要找出试图使用已关闭 SOCKET 的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。 要转储关闭 SOCKET 的例程的堆栈跟踪,请使用 dps 命令,并将第二个参数设为 stop。

应用程序验证程序显示的信息
  • 参数 1 -  正在访问的 SOCKET
  • 参数 2 - 关闭 SOCKET 的函数的堆栈跟踪。 如果不是 NULL,则使用 dps 转储堆栈跟踪
  • 参数 3 - 未用
  • 参数 4 - 未用

其他信息
  • 测试层: 网络
  • 停止 ID: WSA_SOCKET_ALREADY_CLOSED
  • 停止代码: 0000e001
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

尝试使用未知 SOCKET

可能的原因

试图为一个 SOCKET 使用未知值,而该 SOCKET 并非通过调用 Winsock 创建。 要查看尝试执行此操作例程的堆栈跟踪,请在调试器中使用“k”命令。

应用程序验证程序显示的信息
  • 参数 1 -  正在访问的 SOCKET
  • 参数 2 - 未用
  • 参数 3 - 未用
  • 参数 4 - 未用

其他信息
  • 测试层: 网络
  • 停止 ID: WSA_INVALID_SOCKET_HANDLE
  • 停止代码: 0000e002
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

检测到泄漏的 SOCKET 句柄

可能的原因

检测到来自 Winsock 基础服务提供程序的开放 SOCKET 已从正在卸载的 DLL 泄漏。 要排除此停止的故障,请使用调试器中的 dps 命令,在此验证器停止的第二个参数上转储打开 SOCKET 句柄的线程的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - SOCKET 句柄被泄露
  • 参数 2 - 初始化堆栈跟踪。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 3 - 打开句柄的线程 ID
  • 参数 4 - 未用

其他信息
  • 测试层: 网络
  • 停止 ID: WSA_LEAKED_SOCKET_HANDLE
  • 停止代码: 0000e003
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

尝试使用封闭的 SOCKET

可能的原因

来自 Winsock 基本提供程序的 SOCKET 在关闭后被使用。 这通常表明分层服务提供程序(LSP - 应用程序与 Winsock 之间的 DLL)出现故障。 要找出试图使用已关闭 SOCKET 的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。 要转储关闭 SOCKET 的例程的堆栈跟踪,请使用 dps 命令,并将第二个参数设为 stop。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的 SOCKET。
  • 参数 2 - 关闭 SOCKET 的函数的堆栈跟踪。 如果不是 NULL,则使用 dps 转储堆栈跟踪
  • 参数 3 - 未用
  • 参数 4 - 未用

其他信息
  • 测试层: 网络
  • 停止 ID: WSP_SOCKET_ALREADY_CLOSED
  • 停止代码: 0000e004
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

尝试使用未知 SOCKET

可能的原因

Winsock 分层服务提供程序 (LSP) 使用了未知的 SOCKET 句柄值。 这通常指向应用程序和 Winsock 之间的特定 LSP 层的故障。 要识别试图使用未知 SOCKET 的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 -  正在访问的 SOCKET
  • 参数 2 - 未用
  • 参数 3 - 未用
  • 参数 4 - 未用

其他信息
  • 测试层: 网络
  • 停止 ID: WSP_INVALID_SOCKET_HANDLE
  • 停止代码: 0000e005
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

检测到泄漏的 SOCKET 句柄

可能的原因

检测到来自 Winsock 基础服务提供程序的开放 SOCKET 已泄漏。 这通常指向应用程序和 Winsock 之间的特定 LSP 层的故障。 要排除此停止的故障,请使用调试器中的 dps 命令,在此验证器停止的第二个参数上转储打开 SOCKET 句柄的线程的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - SOCKET 句柄被泄露
  • 参数 2 - 初始化堆栈跟踪。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 3 - 打开句柄的线程 ID
  • 参数 4 - 未用

其他信息
  • 测试层: 网络
  • 停止 ID: WSP_LEAKED_SOCKET_HANDLE
  • 停止代码: 0000e006
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

在成功调用 WSAStartup() 之前或平衡成功调用 WSACleanup() 之后调用了 Winsock API

可能的原因

在成功调用 WSAStarup() 之前或平衡成功调用 WSACleanup() 之后调用了网络 API。 任何使用 Winsock 的组件都需要 WSAStartup 提供引用计数,以保证 Winsock API 使用的初始化。 组件不平衡的 WSAStartup/WSACleanup 调用模式会导致未定义的行为,因为这会导致 Winsock 层在仍在使用时卸载库并释放资源。

应用程序验证程序显示的信息
  • 参数 1 - 该调用者最后一次成功调用 WSAStartup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 2 - 该调用者最后一次成功调用 WSACleanup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 3 - 此进程中最后一次成功调用 WSAStartup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 4 - 此进程中最后一次成功调用 WSACleanup。 如果不是 NULL,则使用 dps 转储堆栈

其他信息
  • 测试层: 网络
  • 停止 ID: WSA_NOT_INITIALIZED
  • 停止代码: 0000e007
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

在成功调用 WSPStartup() 之前或平衡成功调用 WSPCleanup() 之后调用网络 API

可能的原因

在成功调用 WSPStarup() 之前或平衡成功调用 WSPCleanup() 之后调用了 Winsock 服务提供程序 API。 这通常指向应用程序和 Winsock 之间的特定 Winsock 分层服务提供程序 (LSP)。 任何使用 Winsock 的 LSP 都需要 WSPStartup 提供引用计数,以保证 Winsock 服务提供程序 API 使用的初始化。 LSP 不平衡的 WSPStartup/WSPCleanup 调用模式会导致未定义的行为,因为这会导致 Winsock 层在仍在使用时卸载库并释放资源。

应用程序验证程序显示的信息
  • 参数 1 - 该调用者最后一次成功调用 WSPStartup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 2 - 该调用者最后一次成功调用 WSPCleanup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 3 - 此进程中最后一次成功调用 WSPStartup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 4 - 此进程中最后一次成功调用 WSPCleanup。 如果不是 NULL,则使用 dps 转储堆栈

其他信息
  • 测试层: 网络
  • 停止 ID: WSP_NOT_INITIALIZED
  • 停止代码: 0000e008
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

在成功调用 NSPStartup() 之前或平衡成功调用 NSPCleanup() 之后调用了 Winsock 名称服务提供程序 API

可能的原因

在成功调用 NSPStarup() 之前或平衡成功调用 NSPCleanup() 之后,调用了 Winsock 名称服务提供程序 API。 这通常指向应用程序和 Winsock 之间的特定 Winsock 名称服务提供程序 (NSP)。 任何使用 Winsock 的 NSP 都需要 NSPStartup 提供引用计数,以保证 Winsock 名称服务提供程序 API 使用的初始化。 NSP 不平衡的 NSPStartup/NSPCleanup 调用模式可能导致未定义的行为,因为这会导致 Winsock 层在仍在使用时卸载库并释放资源。

应用程序验证程序显示的信息
  • 参数 1 - 此调用方最后一次成功调用 NSPStartup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 2 - 该调用者最后一次成功调用 NSPCleanup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 3 - 此进程中最后一次成功调用 NSPStartup。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 4 - 此进程中最后一次成功调用 NSPCleanup。 如果不是 NULL,则使用 dps 转储堆栈

其他信息
  • 测试层: 网络
  • 停止 ID: NSP_NOT_INITIALIZED
  • 停止代码: 0000e009
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

检测到使用了无效的 Winsock 扩展函数指针

可能的原因

Microsoft Winsock 扩展函数只能在运行时通过查询函数指针值来调用。 自该函数指针返回后,Winsock 运行时已被卸载。 调用者很可能在调用 WSACleanup 后保留了函数指针的副本,并试图重复使用它。

应用程序验证程序显示的信息
  • 参数 1 - 获取 Winsock 函数指针的最后一次调用。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 2 - 最后一次调用卸载了 mswsock,使函数指针失效。 如果不是 NULL,则使用 dps 转储堆栈
  • 参数 3 - 未用。
  • 参数 4 - 未用。

其他信息
  • 测试层: 网络
  • 停止 ID: INVALID_FUNCTION_POINTER_DETECTED
  • 停止代码: 0000e00A
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

WSACleanup 中止并关闭了拥有这些 SOCKET 的代码下的现有 SOCKET 句柄

可能的原因

当进程中存在已打开的 SOCKET 句柄时,调用 WSACleanup 将 Winsock 引用计数递减为 0。 当引用计数为零时,Winsock 会关闭所有已打开的 SOCKET 句柄。 这通常是某个人通过 WSACleanup 减少 Winsock 引用计数的频率过高(与 WSAStartup 不平衡),或者调用者不再正确跟踪 SOCKET 句柄(泄漏)造成的错误。 在调试器中键入 k,以显示当前调用 WSACleanup 的人,并将 Winsock 引用计数减至 0。

应用程序验证程序显示的信息
  • 参数 1 - 未处理的 SOCKET 数量
  • 参数 2 - 未用。
  • 参数 3 - 未用。
  • 参数 4 - 未用。

其他信息
  • 测试层: 网络
  • 停止 ID: WSA_SOCKETS_ABORTED
  • 停止代码: 0000e00B
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

WSPCleanup 终止并关闭了拥有这些 SOCKET 的代码下的现有服务提供程序 SOCKET 句柄

可能的原因

分层服务提供程序 (LSP) 调用了 WSPCleanup,将 Winsock 引用计数减为 0,同时在此进程中存在已打开的 SOCKET 句柄。 当引用计数为零时,Winsock 会关闭所有已打开的 SOCKET 句柄。 这通常是由于 LSP 通过 WSPCleanup 减少 Winsock 引用计数的频率过高(与 WSPStartup 不平衡),或调用者不再正确跟踪 SOCKET 句柄(泄漏)造成的错误。 在调试器中键入 k,以显示当前调用 WSPCleanup 的程序,并将 Winsock 引用计数减至 0。

应用程序验证程序显示的信息
  • 参数 1 - 未处理的服务提供程序 SOCKET 数量
  • 参数 2 - 未用。
  • 参数 3 - 未用。
  • 参数 4 - 未用。

其他信息
  • 测试层: 网络
  • 停止 ID: WSP_SOCKETS_ABORTED
  • 停止代码: 0000e00C
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 无
  • 记录到文件: 是
  • 创建回溯: 是

立即返回值或 GetLastError 对当前 Winsock 调用无效。 这通常表明服务提供程序存在故障

可能的原因

返回的值或 GetLastError 中的当前值不符合指定的 Winsock 2 规范。 这通常指向分层服务提供程序 (LSP) 中的一个错误--分层在应用程序和 Winsock 之间的 DLL。 在这些情况下,LSP 破坏了 Winsock API 合同,并向调用者返回一个假值。 在调试器中使用参数 3 上的 ln 查找 DLL 中返回错误返回代码的函数。 查看参数 1 和 2,了解 Winsock 调用的错误值。 如果调用的是任何 Winsock 发送或接收函数,则查看参数 4,了解请求发送或接收的实际字节数。 返回的字节数大于请求发送或接收的字节数是无效的。

应用程序验证程序显示的信息
  • 参数 1 - 返回值
  • 参数 2 - GetLastError
  • 参数 3 - 下一个服务提供程序的功能指针。 使用 ln 查看谁刚刚返回了这个值
  • 参数 4 - 发送/接收数据时,发送到 API 的实际字节数

其他信息
  • 测试层: 网络
  • 停止 ID: WSA_RETURN_INVALID
  • 停止代码: 0000e00D
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

返回值或 lpError 对当前 Winsock 调用无效。 这通常指向基础服务提供程序或网络堆栈中的故障

可能的原因

返回的值或 lpError 中的当前值不符合指定的 Winsock 2 规范。 这通常指向加载的基础服务提供程序(通常是 mswsock.dll)或网络堆栈中的错误。 在调试器中使用参数 3 上的 ln 查找 DLL 中返回错误返回代码的函数。 查看参数 1 和 2,了解 Winsock 调用的错误值。 如果调用的是任何 Winsock 发送或接收函数,则查看参数 4,了解请求发送或接收的实际字节数。 返回的字节数大于请求发送或接收的字节数是无效的。

应用程序验证程序显示的信息
  • 参数 1 - 返回值
  • 参数 2 - GetLastError
  • 参数 3 - 下一个服务提供程序的功能指针。 使用 ln 查看谁刚刚返回了这个值
  • 参数 4 - 发送/接收数据时,发送到 API 的实际字节数

其他信息
  • 测试层: 网络
  • 停止 ID: WSP_RETURN_INVALID
  • 停止代码: 0000e00E
  • 严重性:  错误
  • 一次性错误: 否
  • 错误报告: 中断
  • 记录到文件: 是
  • 创建回溯: 是

另请参阅

应用程序验证程序 - 停止代码和定义

应用程序验证程序 - 概述

应用程序验证程序 - 功能

应用程序验证程序 - 测试应用程序

应用程序验证程序 - 应用程序验证程序中的测试

应用程序验证程序 - 调试应用程序验证程序停止

应用程序验证程序 - 常见问题解答