应用程序验证程序 - 停止代码 - 打印

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

检测到打印机句柄泄漏

可能的原因

应用程序终止时检测到一个打开的打印机句柄。 很可能是创建线程没有调用 ClosePrinter() 关闭打印机句柄。 要排除此停止的故障,请使用此验证程序停止的第二个参数提供堆栈跟踪,以确定打开打印机句柄的线程。 使用调试器中的 dps 命令转储堆栈跟踪。 查找第一个调用 vfPrint!VfHookOpenPrinter* 或 vfPrint!VfHookAddPrinter* 的非 Winspool 和非 vfPrint 模块名称,通常是列表中的第 4 或第 6 个堆栈帧。

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

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

检测到泄漏的打印机更改通知句柄

可能的原因

应用程序退出时,检测到未关闭的打印机更改通知句柄。 很可能是打开句柄的线程没有在退出线程之前调用 FindClosePrinterChangeNotification() 关闭句柄。 要排除此停止的故障,请确定打开打印机更改通知句柄的线程:该停止符的第二个参数提供堆栈地址。 使用 dps 命令转储堆栈跟踪。 查找第一个调用 vfPrint!VfHookFindFirstPrinterChangeNotification 的非 Winpool 和非 vfPrint 模块名称。 这通常出现在第 4 个堆栈帧中。

应用程序验证程序显示的信息
  • 参数 1 - 打印机更改通知句柄被泄露。
  • 参数 2 - 初始化堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 最后使用它的线程 ID。
  • 参数 4 - 未用。

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

检测到泄漏的 PRINTER_NOTIFY_INFO

可能的原因

程序退出时检测到一个已分配的 PRINTER_NOTIFY_INFO 对象未释放。 很可能需要在退出前调用 FreePrinterNotifyInfo() 释放它。 要排除此停止的故障:通过此验证程序停止的第二个参数,确定调用 Winspool 为其分配 PRINTER_NOTIFY_INFO 对象的例程。 使用调试器中的 dps 命令转储初始化堆栈跟踪。 查找第一个调用 vfPrint!VfHookFindNextPrinterChangeNotification 的非 Winspool 和非 vfPrint 模块名称。 该例程通常位于第 3 个堆栈帧中。

应用程序验证程序显示的信息
  • 参数 1 - 指向泄漏的 PRINTER_NOTIFY_INFO 对象的指针。
  • 参数 2 - 初始化堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

使用打印机句柄时检测到竞赛条件

可能的原因

多个线程同时使用一个打印机句柄。 打印机句柄不是线程安全型,这意味着如果没有应用级同步来安全地协调对句柄的访问,就不允许在多个线程中同时使用打印机句柄。 应用程序应在每个线程中打开单独的打印机句柄,或使用 Win32 同步 API 对打印机句柄进行自定义同步访问。 有关 Win32 同步应用程序接口的进一步说明,请访问 https://video2.skills-academy.com/windows/win32/sync/synchronization-functions.

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的打印机句柄。
  • 参数 2 - 当前线程 ID。
  • 参数 3 - 并发线程的线程 ID。
  • 参数 4 - 并发次数。

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

检测到对打印机句柄的潜在多线程访问

可能的原因

打印机句柄在不同的线程中使用,而不是在创建它的线程中使用。 打印机句柄不是线程安全型,这意味着如果没有应用级同步来安全地协调对句柄的访问,就不允许在多个线程中同时使用打印机句柄。 应用程序应在每个线程中打开单独的打印机句柄,或使用 Win32 同步 API 对打印机句柄进行自定义同步访问。 有关 Win32 同步应用程序接口的进一步说明,请访问 https://video2.skills-academy.com/windows/win32/sync/synchronization-functions.

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的打印机句柄。
  • 参数 2 - 初始化线程的线程 ID。
  • 参数 3 - 初始化的堆栈跟踪。
  • 参数 4 - 未用。

其他信息
  • 测试层: PrintAPI
  • 停止 ID: PRINTER_HANDLE_ACCESSED_NOT_ON_THE_THREAD_THAT_OPENED_IT
  • 停止代码: 0000A004
  • 严重性: 警告
  • 一次性错误: 否
  • 错误报告: 无
  • 记录到文件: 否
  • 创建回溯: 否

尝试使用封闭式打印机句柄

可能的原因

关闭后使用了打印机句柄。 要识别试图使用已关闭打印机句柄的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。 要转储关闭句柄的例程的堆栈跟踪,请使用 dps 命令,并将第二个参数设为 stop。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的打印机句柄。
  • 参数 2 - 关闭的堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

尝试使用未知打印机句柄

可能的原因

试图使用未通过调用 OpenPrinterA、OpenPrinterW、OpenPrinter2W(在 Windows Vista 上)、AddPrinterA 或 AddPrinterW 打开的打印机句柄。 要查看尝试执行此操作例程的堆栈跟踪,请在调试器中使用“k”命令。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的打印机句柄。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

尝试使用已关闭的打印机更改通知句柄

可能的原因

打印机更改通知句柄在关闭后被使用。 要查看试图使用已关闭打印机更改通知句柄的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。 要转储关闭句柄的例程的堆栈跟踪,请使用 dps 命令,并将第二个参数设为 stop。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的打印机更改通知句柄。
  • 参数 2 - 关闭的堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

尝试使用无效的打印机更改通知句柄

可能的原因

传递了一个未使用 FindFirstPrinterChangeNotification Win32 API 函数打开的句柄作为打印机更改通知句柄。 要查看尝试执行此操作例程的堆栈跟踪,请在调试器中使用“k”命令。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的打印机更改通知句柄。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

尝试使用已释放的 PRINTER_NOTIFY_INFO 对象

可能的原因

PRINTER_NOTIFY_INFO 对象被释放后又被使用。 要查看试图使用释放的 PRINTER_NOTIFY_INFO 对象的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。 要转储关闭句柄的例程的堆栈跟踪,请使用 dps 命令,并将第二个参数设为 stop。

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

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

试图使用无效的 PRINTER_NOTIFY_INFO 对象

可能的原因

FindNextPrinterChangeNotification Win32 API 函数未打开 PRINTER_NOTIFY_INFO 对象。 要查看尝试执行此操作例程的堆栈跟踪,请在调试器中使用“k”命令。

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

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

打开的打印机句柄太多

可能的原因

打开了太多的打印机句柄。 可能存在资源泄漏。

应用程序验证程序显示的信息
  • 参数 1 - 当前打开的打印机句柄数。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

OpenPrinter2W 似乎是从 Windows 早期版本的 winspool.drv 导出的。

可能的原因

未知。 向 Microsoft 报告此错误。

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

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

打开的 PrintTicket 提供程序句柄过多 (HPTPROVIDER)

可能的原因

调用 PTOpenProvider(Ex) 打开了太多 PrintTicket 提供程序句柄。 这可能是由于不再需要句柄时没有调用 PTCloseProvider,从而造成资源泄漏。

应用程序验证程序显示的信息
  • 参数 1 - 当前打开的 PrintTicket 提供程序句柄数量。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

尝试使用已关闭的 PrintTicket 提供程序句柄 (HPTPROVIDER)

可能的原因

PrintTicket 提供程序句柄被释放后又被使用。 要查看试图使用已关闭 PrintTicket 提供程序处理程序的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。 要转储关闭句柄的例程的堆栈跟踪,请使用 dps 命令,并将第二个参数设为 stop。

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

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

尝试使用未知 PrintTicket 提供程序句柄 (HPTPROVIDER)

可能的原因

使用的 PrintTicket 提供程序句柄未通过调用 PTOpenProvider 或 PTOpenProviderEx 打开。

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

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

使用 PrintTicket 提供程序句柄时检测到竞赛条件

可能的原因

多个线程同时使用一个 PrintTicket 提供程序句柄。 这就需要对句柄的访问进行应用级同步。 PrintTicket 提供程序句柄不是线程安全的,这意味着不允许在多个线程中同时使用 PrintTicket 提供程序句柄。 相反,应用程序应在每个线程中打开单独的 PrintTicket 提供程序句柄,或使用 Win32 同步 API 为 PrintTicket 提供程序句柄提供自定义同步访问。 有关 Win32 同步应用程序接口的进一步说明,请访问 https://video2.skills-academy.com/windows/win32/sync/synchronization-functions.

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的 PrintTicket 提供程序句柄。
  • 参数 2 - 当前线程 ID。
  • 参数 3 - 并发线程的线程 ID。
  • 参数 4 - 并发次数。

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

检测到对 PrintTicket 提供程序句柄的潜在多线程访问

可能的原因

这是一个警告,说明 PrintTicket 提供程序句柄已在不同于创建该句柄的线程中使用。 这可能需要应用级同步才能安全地访问句柄。 PrintTicket 提供程序句柄不是线程安全的,这意味着不允许在多个线程中同时使用 PrintTicket 提供程序句柄。 相反,应用程序应在每个线程中打开单独的 PrintTicket 提供程序句柄,或使用 Win32 同步 API 为 PrintTicket 提供程序句柄提供自定义同步访问。 有关 Win32 同步应用程序接口的进一步说明,请访问 https://video2.skills-academy.com/windows/win32/sync/synchronization-functions.

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的 PrintTicket 提供程序句柄。
  • 参数 2 - 初始化线程的线程 ID。
  • 参数 3 - 初始化的堆栈跟踪。
  • 参数 4 - 未用。

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

检测到泄漏的 PrintTicket 提供程序句柄

可能的原因

线程退出时检测到一个打开的 PrintTicket 提供程序句柄。 创建例程在退出之前可能没有调用 PTCloseProvider() 关闭它。 要排除此停止的故障,请使用此验证程序停止的第二个参数提供堆栈跟踪,以确定打开 PrintTicket 提供程序句柄的线程。 使用调试器中的 dps 命令转储堆栈跟踪。 查找调用 vfPrint!VfPTOpenProvider 或 vfPrint!VfPTOpenProviderEx 的第一个非 prntvpt 和非 vfPrint 模块名称,通常是列表中的第 4 或第 6 个堆栈帧。

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

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

打开的打印机更改通知句柄太多

可能的原因

打开了太多的打印机更改通知句柄。 可能存在资源泄漏。 一种常见的资源泄漏形式是,例程会打开打印机更改通知句柄,但在退出前并未关闭。

应用程序验证程序显示的信息
  • 参数 1 - 当前打开的打印机更改通知句柄数量。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

打开的 PRINTER_NOTIFY_INFO 对象过多

可能的原因

打开了太多 PRINTER_NOTIFY_INFO 对象。 可能存在资源泄漏。 资源泄漏的一种常见形式是例程打开 PRINTER_NOTIFY_INFO 对象,但在退出前没有关闭该对象。

应用程序验证程序显示的信息
  • 参数 1 - 当前打开的 PRINTER_NOTIFY_INFO 对象数目。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

尝试使用无效 PrintTicket

可能的原因

当应用程序使用无效 PrintTicket 调用 PrintTicket 方法时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 当应用程序使用无效 PrintTicket 调用 %lS 方法时,验证程序会停止运行。
  • 参数 1 - PTConform 返回的错误信息。 如果该参数不是 NULL,则使用 du 转储信息。
  • 参数 2 - PrintTicket XML 文本。 如果该参数不是 NULL,则使用 du 转储 XML。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

尝试使用无效的 PrintCapabilities 文档

可能的原因

当应用程序使用无效的 PrintCapabilities 文档调用 PrintTicket 方法时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 当应用程序使用无效的 PrintCapabilities 文档调用 %lS 方法时,验证程序会停止运行。
  • 参数 1 - PTConform 返回的错误信息。 如果该参数不是 NULL,则使用 du 转储信息。
  • 参数 2 - PrintCapabilities XML 文本。 如果该参数不是 NULL,则使用 du 转储 XML。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

向 PrintTicket 方法传递了无效的 NULL 参数

可能的原因

当应用程序调用带有无效 NULL 参数的 PrintTicket 方法时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 当应用程序以空闲 %lS 参数调用 %lS 方法时,验证程序停止运行。
  • 参数 1 - 未用。
  • 参数 2  -  未使用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

PTConform 遇到意外错误

可能的原因

当 PrintVerifier 在尝试验证 PrintTicket/PrintCapabilities 是否符合 PrintSchema 时遇到意外错误时,验证程序会停止运行。 将此错误报告给 Microsoft,因为这可能是 PrintVerifier 的问题。

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

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

从 DllMain 调用非法打印 API

可能的原因

调用了不支持从 DllMain 中调用的打印 API。 许多 Win32 API(不仅仅是 Win32 打印 API)都不能从 DllMain 调用。 有关详细信息,请阅读 MSDN 库中有关 DllMain 的文档。

应用程序验证程序显示的信息
  • 格式: -  从 DllMain 调用的打印 API:%s
  • 参数 1 - 未用。
  • 参数 2  -  未使用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

检测到泄漏的后台打印文件句柄

可能的原因

应用程序终止时检测到一个打开的后台打印文件句柄。 很可能没有调用 CloseSpoolFileHandle()。 要排除此停止的故障:确定是哪条线程打开了打印机句柄。 如果参数 2 不是空值,则使用 dps 转储堆栈。 查找第一个调用 vfPrint!VfHookOpenPrinter* 或 vfPrint!VfHookAddPrinter* 的非 Winspool 和非 vfPrint 模块名称。 该例程通常是列表中的第 4 或第 6 个堆栈帧。

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

其他信息
  • 测试层: PrintAPI
  • 停止 ID: LEAKED_SPOOL_FILE_HANDLE
  • 停止代码: 0000A01A
  • 严重性: 警告
  • 一次性错误: 否
  • 错误报告: 无
  • 记录到文件: 否
  • 创建回溯: 否

尝试使用关闭的后台打印文件句柄

可能的原因

后台打印文件句柄在关闭后被使用。 要排除此停止的故障:在调试器中使用“k”命令转存当前堆栈跟踪,确定试图使用已关闭句柄的例程。 使用带有停止符第二个参数的 dps 命令,转储关闭句柄的例程的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的后台打印文件句柄。
  • 参数 2 - 关闭的堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

尝试使用未知的后台打印文件句柄

可能的原因

试图使用未通过调用 GetSpoolFileHandle 或 CommitSpoolData 打开的后台打印文件句柄。 在调试器中使用“k”命令查看尝试执行此操作的例程的堆栈跟踪。

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

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

打开的后台打印文件句柄太多

可能的原因

打开了太多的后台打印文件句柄。 可能存在资源泄漏。

应用程序验证程序显示的信息
  • 参数 1 - 当前打开的句柄数量。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

DEVMODE 缓冲区参数跨越不可读内存页。

可能的原因

这种停止可能由以下几种情况造成:DEVMODE 缓冲区已释放;DEVMODE 缓冲区的构造不正确,给 dmSize 和 dmDriverExtra 成员分配的值大于应有的值;或者使用了 NULL devmode 缓冲区,而预期使用的是非 NULL 缓冲区。

应用程序验证程序显示的信息
  • 格式: -  该校验程序停止的原因是软件组件调用了打印子系统,而该子系统的 DEVMODE 缓冲区有问题。 查看当前堆栈跟踪并检查:分配、构造和 devmode 的生命周期,确定错误位置。
  • 参数 1 - 坏的 DEVMODE 缓冲区
  • 参数 2 - 根据 devmode dmSize 和 dmDriverExtra 字段计算的总缓冲区大小。 如果缓冲区完全位于不可读内存中,则为零。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

卸载有活动 COM 回调的模块。

可能的原因

目标模块卸载时,检测到 COM 接口上的 refcount 为正值。 可能是由于模块中 DllCanUnloadNow 导出的执行不正确或引用计数不正确造成的。

应用程序验证程序显示的信息
  • 格式: -  该校验程序停止的原因是 %lS 模块卸载,而系统仍持有 %lS 指针。
  • 参数 1 - COM 接口地址。
  • 参数 2 - 提供回调的堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

RegisterForPrintAsyncNotifications 返回的异步通知句柄未正确释放

可能的原因

RegisterForPrintAsyncNotifications API 函数分配的句柄直到程序退出时才被释放。 很可能需要在退出之前调用 UnRegisterForPrintAsyncNotifications() 来释放它。 要排除此停止的故障:通过该验证程序停止符的第二个参数,确定调用 Winspool 为其分配句柄的例程。 使用调试器中的 dps 命令转储初始化堆栈跟踪。 查找第一个调用 vfPrint!VfHookRegisterForPrintAsyncNotifications 的非 Winspool 和非 vfPrint 模块名称。 该例程通常位于第 3 个堆栈帧中。

应用程序验证程序显示的信息
  • 参数 1 - 句柄值。
  • 参数 2 - 初始化堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

试图在 UnRegisterForPrintAsyncNotifications 中使用无效句柄。

可能的原因

RegisterForPrintAsyncNotifications Win32 API 函数未打开句柄。 要查看尝试执行此操作例程的堆栈跟踪,请在调试器中使用“k”命令。

应用程序验证程序显示的信息
  • 参数 1 - 句柄值。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

试图在 UnRegisterForPrintAsyncNotifications API 函数中使用已关闭的句柄

可能的原因

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

应用程序验证程序显示的信息
  • 参数 1 - 句柄值。
  • 参数 2 - 关闭的堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

第三方函数报告失败,但会增加输入接口的引用计数

可能的原因

第三方方法接收接口指针作为输入。 当这种方法返回失败代码时,接口 ref 数量应保持不变。 但在这种情况下,参考文献的数量增加了。

应用程序验证程序显示的信息
  • 格式: -  %lS 方法返回 %x 错误代码,但会增加 %lS 参数的 ref 计数。
  • 参数 1 - 调用的接口指针。 若为 NULL,则调用的函数为静态函数。
  • 参数 2 - 输入接口指针。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

Windows API 函数会报告失败,但会增加输入接口的引用计数

可能的原因

API 方法接收接口指针作为输入。 当这种方法返回失败代码时,接口 ref 数量应保持不变。 但在这种情况下,参考文献的数量增加了。 请将此错误报告给微软,因为这可能是 API 代码的问题。

应用程序验证程序显示的信息
  • 格式: -  %lS 方法返回 %x 错误代码,但会增加 %lS 参数的 ref 计数。
  • 参数 1 - 调用的接口指针。 若为 NULL,则调用的函数为静态函数。
  • 参数 2 - 输入接口指针。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

操作系统违反 IPrintAsyncNotifyChannel 合同。

可能的原因

IPrintAsyncNotifyChannel 的平台实施违反了 IPrintAsyncNotifyChannel 隐含或定义的部分特殊契约。 IPrintAsyncNotifyChannel 对 AddRef 和 Release 有特殊例外。 这就要求平台在调用 OnEventNotify 和 ChannelClosed 时使用与通道创建时相同的指针值。

应用程序验证程序显示的信息
  • 格式: - 使用错误的接口指针调用了  %s。
  • 参数 1 - 实际接口指针。
  • 参数 2 - 预期接口指针。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

通道消费者违反 IPrintAsyncNotifyChannel 合同。

可能的原因

在双向通道上,调用 SendNotification、CloseChannel 或对接口指针进行最终释放都会放弃“所有权”。 创建通道并发送第一条通知后,在调用回调的 OnEventNotify 之前不能调用 Release()。 如果调用 CloseChannel() 或收到 ChannelClosed 通知,则不得执行最后的 Release() 调用。

应用程序验证程序显示的信息
  • 格式: - 已调用 %s,但通道“所有权”目前属于打印后台处理程序
  • 参数 1 - IPrintAsyncNotifyChannel 接口指针。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

在关闭 IPrintAsyncNotifyChannel 期间检测到争用条件

可能的原因

*** 请向微软报告此故障。 *** 此停止表示在调用 CloseChannel 期间有通知到达。 如果出现这种情况,消费者可能无法正确释放通道。 这一站应该不会经常遇到。 防止这种情况的方法是:在创建双向通道之前,始终确保有侦听器可用;或者确保在尝试关闭已发送通知但未收到回调的通道之前,不能启动侦听器。

应用程序验证程序显示的信息
  • 格式: - 在函数 %s 中,一个调用已在另一个线程上进行。 更多信息,请参阅帮助。
  • 参数 1 - IPrintAsyncNotifyChannel 接口指针。
  • 参数 2 - 被调用成员函数的线程 ID。
  • 参数 3 - 回调事件函数的线程 ID。
  • 参数 4 - 未用。

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

调用打印 API,在图形用户界面线程上进行网络调用。 这可能会导致 UI 挂起。

可能的原因

在图形用户界面线程上调用打印 API 进行网络调用。 这可能会导致 UI 挂起。 通常情况下,这类应用程序接口需要在工作线程上调用,不需要消息泵。

应用程序验证程序显示的信息
  • 格式: - %s 在图形用户界面线程上被调用。 这可能会导致 UI 挂起。
  • 参数 1 - 顶层可见窗口的 HWND。
  • 参数 2 - 当前线程 ID。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

调用会弹出用户界面的应用程序接口为 Session0。

可能的原因

会话 0 调用了一个 API,该 API 将弹出用户界面。

应用程序验证程序显示的信息
  • 格式: -  Session0 API 中的非法调用:%s
  • 参数 1 - 未用。
  • 参数 2  -  未使用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

首次检测到违规访问

可能的原因

当打印机驱动程序尝试访问虚拟内存地址时,如果该地址不可执行、已被释放或退订、或已被保留但未被提交,则会产生此停止。 要调试此停止:$ u 参数2 - 用于反汇编可疑代码;$ .exr 参数 3 - 用于显示异常信息;$ .cxr 参数 4 - 用于显示异常上下文信息;$ kb - 用于显示异常发生时的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的地址。
  • 参数 2 - 执行无效访问的代码。
  • 参数 3  -  异常记录。 使用 .exr 显示它。
  • 参数 4  -  上下文记录。 使用 .cxr 显示它。

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

该线程试图将一个整数值除以整数除数 0

可能的原因

当打印机驱动程序尝试将整数值除以整数除数 0 时,会产生此停止。 要调试此停止:$ u 参数 1 - 用于反汇编可疑代码;$ .exr 参数 2 - 用于显示异常信息;$ .cxr 参数 3 - 用于显示异常上下文信息;$ kb - 用于显示异常发生时的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 执行除以零操作的代码。
  • 参数 2 - 异常记录。 使用 .exr 显示它。
  • 参数 3  -  上下文记录。 使用 .cxr 显示它。
  • 参数 4  -  未使用。

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

线程试图在不提供对齐功能的硬件上读取或写入错误对齐的数据

可能的原因

当驱动程序试图在不提供对齐功能的硬件上读取或写入错误对齐的数据时,就会产生此停止。 例如,16 位数值必须按 2 字节边界对齐,32 位数值按 4 字节边界对齐,依此类推。 要调试此停止:$ u 参数1 - 用于反汇编罪魁祸首代码;$ .exr 参数2 - 用于显示异常信息;$ .cxr 参数3 - 用于显示异常上下文信息;$ kb - 用于显示异常发生时的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 发生数据类型错位的代码。
  • 参数 2 - 异常记录。 使用 .exr 显示它。
  • 参数 3  -  上下文记录。 使用 .cxr 显示它。
  • 参数 4  -  未使用。

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

当前堆栈跟踪的无效句柄异常

可能的原因

当堆栈顶层的函数向系统例程传递无效句柄时,就会产生此停止。 通常,kb 命令会显示调用栈中传递的句柄值。 句柄将是调用的参数之一。 通常它是第一个参数。 空句柄值就是无效句柄值的一个例子。 如果句柄值似乎有效,可使用 !htrace 调试器扩展查看涉及句柄值的操作历史。 有时,如果句柄在关闭后被使用,看似有效的句柄值可能会失效。

应用程序验证程序显示的信息
  • 参数 1  -  异常代码。
  • 参数 2  -  异常记录。 使用 .exr 显示它。
  • 参数 3  -  上下文记录。 使用 .cxr 显示它。
  • 参数 4  -  未使用。

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

核心驱动程序正在向插件发送一个封闭的打印机句柄

可能的原因

核心驱动程序正在向插件发送一个已经关闭的打印机句柄。 将此错误报告给微软,因为这可能是微软核心打印机驱动模块的问题。 要识别试图使用已关闭打印机句柄的例程,请在调试器中使用“k”命令转储当前堆栈跟踪。 要转储关闭句柄的例程的堆栈跟踪,请使用 dps 命令,并将第二个参数设为 stop。

应用程序验证程序显示的信息
  • 参数 1 - 发送给插件的打印机句柄。
  • 参数 2 - 关闭例程的堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

核心驱动程序向插件发送未知打印机句柄

可能的原因

核心驱动程序正在向插件发送一个打印机句柄,该句柄未通过调用 OpenPrinterA、OpenPrinterW、Windows Vista 中的 OpenPrinter2W、AddPrinterA 或 AddPrinterW 打开。 将此错误报告给微软,因为这可能是微软核心打印机驱动模块的问题。

应用程序验证程序显示的信息
  • 参数 1 - 发送给插件的打印机句柄。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

插件关闭了打印机手柄

可能的原因

插件会关闭从核心驱动程序输入的打印机句柄。 这违反了 WDK 关于从核心驱动程序调用插件的规则。 对“停止”的第二个参数使用 dps,可转储关闭句柄的例程的堆栈跟踪。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处插件模块中的 %lS 方法造成的
  • 参数 1 - 已关闭的打印机句柄。
  • 参数 2 - 关闭的堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

支持的打印架构主要版本数无效

可能的原因

PrintTicket 提供商插件返回的受支持打印架构主要版本的数量无效。 插件中的 IPrintOemPrintTicketProvider::GetSupportedVersions 方法应至少返回一个受支持的主要版本。 由于 Windows Vista 只支持一个主要版本的打印架构,因此插件将返回一个值。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处插件模块中的 %lS 方法造成的
  • 参数 1 - 返回的受支持架构版本的数量。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

缺少支持的打印架构版本

可能的原因

PrintTicket 提供商插件表示至少返回一个受支持的打印架构版本,但未能返回任何版本。 调用插件中的 IPrintOemPrintTicketProvider::GetSupportedVersions 方法时,会接受两个输出指针作为参数。 ppVersions 参数指向一个整数数组,代表打印架构支持的主要版本。 cVersions 参数指向返回的整数数组中的元素个数。 当插件在 cVersions 中返回一个有效数字,但在 ppVersions 数组中没有返回任何数字时,验证程序就会停止。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处插件模块中的 %lS 方法造成的
  • 参数 1 - 返回的受支持打印架构版本的数量。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

打印架构主版本无效

可能的原因

PrintTicket 提供商插件返回的 Print Schema 主要版本无效。 调用插件中的 IPrintOemPrintTicketProvider::GetSupportedVersions 方法预计将返回 1 (1) 值,因为 Windows Vista 支持的打印架构唯一主要版本是 1。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处插件模块中的 %lS 方法造成的
  • 参数 1 - 返回的打印架构版本。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

OEMPTOPTS 值无效

可能的原因

PrintTicket 提供商插件返回的 OEMPTOPTS 值无效。 插件中 IPrintOemPrintTicketProvider::BindPrinter 方法的参数之一是指向 OEMPTOPTS 枚举的指针。 插件应将此参数的值设置为 Windows Vista 支持的值之一。 Windows Vista 支持的值是 OEMPT_DEFAULT 和 OEMPT_NOSNAPSHOT。 当插件返回的值不在这些支持值之列时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处插件模块中的 %lS 方法造成的
  • 参数 1 - 返回的 OEMPTOPTS 值。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

缺少打印架构私有命名空间

可能的原因

PrintTicket 提供商插件表示至少返回一个打印架构私有命名空间,但没有返回任何私有命名空间。 插件中对 IPrintOemPrintTicketProvider::BindPrinter 方法的调用包含两个输出指针参数,通过这两个参数,插件可以返回它所支持打印架构私有命名空间的信息。 ppNamespaces 参数指向一个字符串数组,代表受支持的打印架构私有命名空间。 cNamespaces 参数指向返回的字符串数组中的元素个数。 当插件在 cNamespaces 中返回一个有效数字,但在 ppNamespaces 数组中没有返回任何内容时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处插件模块中的 %lS 方法造成的
  • 参数 1 - 预期命名空间的数量。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

插件中检测到不正确的参考计数

可能的原因

WDK 规定,插件在实现 IUnknown::AddRef 和 IUnknown::Release 方法时必须执行精确的引用计数。 插件接口对象的寿命取决于精确的引用计数。 如果引用计数不准确,可能会导致资源泄漏或插件过早卸载,从而导致驱动程序失效。 当检测到插件中的参考计数不正确时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - 预期引用计数。
  • 参数 2 - 插件维护的实际参考计数。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

在 OEMNextBand 中 pptl 为 NULL

可能的原因

核心驱动程序传递给插件中 OEMNextBand 钩子的 pptl 为 NULL。 核心驱动程序应始终向插件中的 OEMNextBand 钩子发送有效的 pptl。 将此错误报告给微软,因为这可能是微软核心打印机驱动模块的问题。

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

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

插件在从 EnablePDEV 方法返回 S_OK 之后,返回了一个 NULL PDEV

可能的原因

虽然 EnablePDEV 方法的返回值为 S_OK,表示成功,但插件返回的私有 PDEV 为 NULL。 WDK 规定,如果插件的 EnablePDEV 方法返回 S_OK 状态,它还必须分配一个私有 PDEV 结构实例,对其进行初始化,并在方法的 pDevOem 参数中返回该结构的地址。 当插件在执行 EnablePDEV 方法时返回 S_OK 状态,但未返回有效的私有 PDEV 结构时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - 未用。
  • 参数 2  -  未使用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

插件返回的私有 DEVMODE 小于允许的最小尺寸

可能的原因

插件返回的私有 DEVMODE 至少应等于 OEM_DMEXTRAHEADER 的大小。 插件的 DevMode 方法在以 OEMDM_SIZE 模式调用时,必须返回存储其私有 DEVMODE 成员所需的大小。 该值在首次调用该方法时设置。 插件中的 DevMode 方法必须将 OEMDMPARAM 结构中 cbBufSize 成员的值设置为所需字节数,且该值必须大于或等于 OEM_DMEXTRAHEADER 的大小。 当 OEMDMPARAM 结构中 cbBufSize 成员返回的大小小于 OEM_DMEXTRAHEADER 的大小时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - 当前 DevMode 回调的模式。
  • 参数 2 - 插件专用 DEVMODE 的大小。
  • 参数 3 - OEM_DMEXTRAHEADER 的大小。
  • 参数 4 - 未用。

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

插件返回的私有 DEVMODE 大小与 DevMode(OEMDM_SIZE) 调用返回的大小不同

可能的原因

插件应返回一个私有 DEVMODE,其大小与使用 OEMDM_SIZE 模式的 DevMode 调用所返回的大小相同。 当以 OEMDM_SIZE 模式调用 DevMode 方法时,插件的 DevMode 方法必须返回存储其私有 DEVMODE 成员所需的大小。 该值是一个常量,在首次调用该方法时设置。 在后续调用插件的 DevMode 方法时,该值不得更改。 当插件中的 DevMode 方法返回的值与第一次调用时返回的值不同时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - 当前 Devmode 回调的模式。
  • 参数 2 - pOEMDMOut 中指定的输出插件私人 DEVMODE 的大小。
  • 参数 3 - pOEMDMParam 中指定的输出插件私人 DEVMODE 的大小。
  • 参数 4 - 在调用 OEMDM_SIZE 时指定的插件私有 DEVMODE 的大小。

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

插件从 GetInfo(OEMGI_GETSIGNATURE) 调用中返回了无效签名

可能的原因

当在模式为 OEMGI_GETSIGNATURE 的 GetInfo 调用期间调用插件时,插件应返回一个有效的非零签名。 插件中的 GetInfo 方法必须返回一个唯一的四字节识别签名。 当插件中的 GetInfo(OEMGI_GETSIGNATURE) 方法返回零签名时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - 未用。
  • 参数 2  -  未使用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

插件在私有 DEVMODE 中返回的签名与从 GetInfo 调用中返回的签名不同

可能的原因

插件应返回一个私有 DEVMODE,该 DEVMODE 包含与调用插件中 GetInfo 方法的 OEMGI_GETSIGNATURE 所返回的相同的唯一四字节识别签名。 当这两个签名不完全相同时,验证程序就会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - 当前 DevMode 方法调用的模式。
  • 参数 2 - 输出插件专用 DEVMODE 中指定的签名。
  • 参数 3 - 在调用 GetInfo 时指定的签名。
  • 参数 4 - 未用。

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

插件中的 EnableDriver 方法失败。

可能的原因

插件中的 EnableDriver 方法预计不会失败,但在特殊情况下可能会失败。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - EnableDriver 返回的 HRESULT。
  • 参数 2 - 插件设置的错误代码。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

插件中的 EnableDriver 方法失败,未设置最后一个错误代码

可能的原因

插件中的 EnableDriver 方法预计不会失败,但在特殊情况下可能会失败。 如果失败,则必须调用 SetLastError 设置最后一个错误代码。 当插件中的 EnableDriver 方法在未设置最后一个错误的情况下失败时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - EnableDriver 返回的 HRESULT。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

虽然插件从 DriverDMS 返回了 S_OK,但核心驱动程序调用了 SetBandSize

可能的原因

如果插件实现了 DriverDMS 方法,且其实现的 DriverDMS 方法返回 S_OK,则核心驱动程序不会调用 SetBandSize。 将此错误报告给微软,因为这可能是微软核心打印机驱动模块的问题。

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

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

核心驱动程序在调用 WritePrinter 初始化时使用了无效参数

可能的原因

在 WritePrinter 的初始化调用中,pdevobj 和 pBuf 参数应为 NULL,cbBuf 应为 0。 当核心驱动程序对插件中的 WritePrinter 方法进行初始化调用时,其中一个条件并不成立。 将此错误报告给微软,因为这可能是微软核心打印机驱动模块的问题。

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

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

插件中的 WritePrinter 方法失败

可能的原因

当插件中的 WritePrinter 方法失败时,验证程序会停止运行。 这将导致打印任务中止。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处的插件模块造成的
  • 参数 1 - 插件中 WritePrinter 方法返回的 HRESULT。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

核心驱动程序向插件发送了无效的 PrintTicket

可能的原因

当从核心驱动程序发送到插件的 PrintTicket 文档不符合 PrintSchema 时,验证程序会停止运行。 由于核心驱动程序会解析驱动程序的 GPD/PPD 以构建发送给插件的 PrintTicket,因此这种停止通常表明驱动程序的 GPD/PPD 中存在错误。

应用程序验证程序显示的信息
  • 格式: - 当核心驱动程序调用插件的 %lS 方法时,验证程序停止运行。
  • 参数 1 - PTConform 返回的错误信息。 如果该参数不是 NULL,则使用 du 转储信息。
  • 参数 2 - PrintTicket XML 文本。 如果该参数不是 NULL,则使用 du 转储 XML。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

插件向核心驱动程序返回了无效的 PrintTicket

可能的原因

当插件返回给核心驱动程序的 PrintTicket 文档不符合 PrintSchema 时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处插件模块中的 %lS 方法造成的
  • 参数 1 - PTConform 返回的错误信息。 如果该参数不是 NULL,则使用 du 转储信息。
  • 参数 2 - PrintTicket XML 文本。 如果该参数不是 NULL,则使用 du 转储 XML。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

核心驱动程序向插件发送了无效的 PrintCapabilities 文档

可能的原因

当从核心驱动程序发送到插件的 PrintCapabilities 文档不符合 PrintSchema 时,验证程序会停止运行。 将此错误报告给微软,因为这可能是微软核心打印机驱动模块的问题。

应用程序验证程序显示的信息
  • 格式: - 当核心驱动程序调用插件的 %lS 方法时,验证程序停止运行。
  • 参数 1 - PTConform 返回的错误信息。 如果该参数不是 NULL,则使用 du 转储信息。
  • 参数 2 - PrintCapabilities XML 文本。 如果该参数不是 NULL,则使用 du 转储 XML。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

插件向核心驱动程序返回了无效的 PrintCapabilities 文档

可能的原因

当插件返回给核心驱动程序的 PrintCapabilities 文档不符合 PrintSchema 时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由 %lS 处插件模块中的 %lS 方法造成的
  • 参数 1 - PTConform 返回的错误信息。 如果该参数不是 NULL,则使用 du 转储信息。
  • 参数 2 - PrintCapabilities XML 文本。 如果该参数不是 NULL,则使用 du 转储 XML。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

PTConform 遇到意外错误

可能的原因

当 PrintVerifier 在尝试验证 PrintTicket/PrintCapabilities 是否符合 PrintSchema 时遇到意外错误时,验证程序会停止运行。 将此错误报告给 Microsoft,因为这可能是 PrintVerifier 的问题。

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

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

打印过滤器使用无效参数值调用管道管理器接口

可能的原因

当打印过滤器调用参数值不正确的管道方法时,验证程序会停止运行。 使用堆栈跟踪查找打印过滤器 DLL 的名称。

应用程序验证程序显示的信息
  • 格式: -  %s 方法 :%s 参数值无效。
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - 参数值。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

打印过滤器调用 IPrintPipelinePropertyBag 会覆盖或移除常用属性

可能的原因

当打印过滤器更改或删除打印管道属性包中的常用属性时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: -  %s 方法 :重写共同财产 %s
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - 属性值(变量)。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

打印过滤器调用管道管理器接口的顺序不对

可能的原因

当打印过滤器以意外的顺序调用管道管理器接口方法时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: -  %s 接口的调用顺序不正确 :%s
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

打印过滤器与管道管理器接口的 AddRef/Release 调用不匹配

可能的原因

当打印过滤器错误地管理管道管理器接口的引用计数时,验证程序就会停止运行。

应用程序验证程序显示的信息
  • 格式: -  接口 %s ref 计数为 %d,预计为 %s。
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

打印过滤器调用管道管理器接口方法不符合预期

可能的原因

当打印过滤器不必要或意外调用管道接口方法时,验证程序会停止运行。 例如,如果打印过滤器第二次调用 IPrintWriteStream::Close.Close.NET,那么打印过滤器就会关闭。

应用程序验证程序显示的信息
  • 格式: -  接口方法 %s :%s
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

管道管理器不按顺序调用打印过滤器接口方法

可能的原因

当管道管理器错误调用打印过滤器接口的方法时,验证程序就会停止运行。 将此错误报告给 Microsoft,因为这可能是打印过滤器管道服务出现了问题。

应用程序验证程序显示的信息
  • 格式: -  打印过滤器的无效调用顺序 :%s
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

管道管理器使用无效参数值调用打印过滤器接口方法

可能的原因

当管道管理器使用无效参数值调用打印过滤器接口时,验证程序会停止运行。 将此错误报告给 Microsoft,因为这可能是打印过滤器管道服务出现了问题。

应用程序验证程序显示的信息
  • 格式: -  方法 %s:%s
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - 参数值。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

管道管理器向打印过滤器返回无效值

可能的原因

当管道管理器向打印过滤器返回无效值时,验证程序会停止运行。 将此错误报告给 Microsoft,因为这可能是打印过滤器管道服务出现了问题。

应用程序验证程序显示的信息
  • 格式: -  方法 %s:%s
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - 值。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

调用打印机驱动程序改变了安全上下文。

可能的原因

当打印驱动程序调用 RevertToSelf() 或 RevertToPrinterSelf() 但未通过调用 ImpersonatePrinterClient() 将安全上下文改回模拟用户时,通常会出现此停止。 这是不允许的,发生这种情况后,打印后台处理程序的行为将无法定义。 这也会造成安全漏洞,允许远程验证权限提升类型的攻击。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止是由“%lS”处插件模块中的“%lS”方法造成的
  • 参数 1 - 驱动程序输入时的账户名。 键入 "du address",如果不是 NULL,则转储。
  • 参数 2 - 驱动程序退出时的账户名。 键入 "du address",如果不是 NULL,则转储。
  • 参数 3 - 驱动程序入口处的安全令牌
  • 参数 4 - 驱动程序退出时的安全令牌

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

打印过滤器向管道管理器发送了无效的 PrintTicket

可能的原因

当将 IPrintTicketPart 部分发送到 SetPrintTicket 方法,但其内容不符合 PrintSchema 时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止在 %lS 方法中。 使用 GUID 标识打印过滤器。
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - PTConform 返回的错误信息。 如果该参数不是 NULL,则使用 du 转储信息。
  • 参数 3 - PrintTicket XML 文本。 如果该参数不是 NULL,则使用 du 转储 XML。
  • 参数 4 - 未用。

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

打印过滤器从管道管理器接收到无效的 PrintTicket

可能的原因

当打印过滤器通过 GetPrintTicket 方法接收到 IPrintTicketPart 部分,但其内容不符合 PrintSchema 时,验证程序会停止运行。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止在 %lS 方法中。 使用 GUID 标识打印过滤器。
  • 参数 1 - 打印过滤器 GUID。 如果该参数不是空值,则使用 dd 转存。
  • 参数 2 - PTConform 返回的错误信息。 如果该参数不是 NULL,则使用 du 转储信息。
  • 参数 3 - PrintTicket XML 文本。 如果该参数不是 NULL,则使用 du 转储 XML。
  • 参数 4 - 未用。

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

卸载有当前 COM 回调的打印驱动程序 DLL。

可能的原因

目标模块卸载时检测到 COM 接口上的正引用计数。 可能是由于模块中 DllCanUnloadNow 导出的执行不正确或引用计数不正确造成的。

应用程序验证程序显示的信息
  • 格式: -  该校验程序停止的原因是 %lS 模块卸载,而系统仍持有 %lS 指针。
  • 参数 1 - COM 接口地址。
  • 参数 2 - 提供回调的堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

尝试使用已发布的 COM 接口

可能的原因

COM 接口发布后使用。 要排除此停止的故障:- 在调试器中使用“k”命令转存当前堆栈跟踪,确定试图使用已释放接口的例程。 - 使用 dps 命令,如果有停止的第二个参数,则转储释放例程的堆栈跟踪。

应用程序验证程序显示的信息
  • 格式: - 该验证程序停止的原因是 %lS 接口在发布后被使用。
  • 参数 1 - COM 接口地址。
  • 参数 2 - 引用计数归零时释放调用的堆栈跟踪。 如果堆栈跟踪不为空,则使用 dps 转储堆栈跟踪。
  • 参数 3 - 未用。
  • 参数 4  -  未使用。

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

名为 ExitThread 的打印驱动程序

可能的原因

名为 ExitThread 的打印驱动模块。 当打印驱动模块调用 ExitThread 时,会在调用析构函数或执行其他自动清理之前退出线程。 这会导致未定义的行为。 因此,打印驱动程序应始终从其线程功能返回。 要排除此停止的故障:使用调试器中的“k”命令转储当前堆栈跟踪,可确定调用 ExitThread 的例程。

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

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

打印驱动程序调用 TerminateThread

可能的原因

打印驱动程序模块调用 TerminateThread。 TerminateThread 用于使线程退出。 出现这种情况时,目标线程就没有机会执行任何用户模式代码。 附加到线程的 DLL 不会收到线程终止的通知。 系统会释放线程的初始堆栈。 TerminateThread 是一个危险的函数,只能在最极端的情况下使用。 例如,TerminateThread 会导致以下问题:- 如果目标线程拥有临界区段,临界区段将不会被释放。 - 如果目标线程正在从堆中分配内存,堆锁将不会被释放。 - 如果目标线程终止时正在执行某些 kernel32 调用,则该线程进程的 kernel32 状态可能不一致。 - 如果目标线程正在操作共享 DLL 的全局状态,DLL 的状态可能会被破坏,从而影响 DLL 的其他用户。 要排除此停止的故障:在调试器中使用“k”命令转储当前堆栈跟踪,确定调用 TerminateThread 的模块和例程。

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

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

打印过滤器更改了当前线程的 COM 单元类型。

可能的原因

当打印过滤器在其中一个方法(InitializeFilter(初始化过滤器)、StartOperation(开始运行)或 ShutdownOperation(关闭运行))中更改 COM 单元类型时,验证程序会停止运行。 在调试器中使用“ln poi(<Param1>)”命令确定打印过滤器 DLL 的名称。

应用程序验证程序显示的信息
  • 格式: -  由于打印过滤器的 %lS 方法将 COM 单元类型从 %lS(%d) 更改为 %lS(%d),导致验证程序停止。
  • 参数 1 - 过滤器接口指针。 使用“ln poi(<Param1>)”查找过滤器。
  • 参数 2 - 预期单元类型
  • 参数 3 - 实际单元类型
  • 参数 4 - 未用。

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

调用打印过滤器方法后,当前线程的 COM 未初始化。

可能的原因

当打印过滤器的 CoInitialize[Ex] 和 CoUninitialize 调用不平衡时,验证程序会停止运行。 这可能是由于 CoInitialize[Ex] 意外返回失败,例如当请求的单元类型与线程的当前类型不匹配时。 在调试器中使用“ln poi(<Param1>)”命令确定打印过滤器 DLL 的名称。

应用程序验证程序显示的信息
  • 格式: -  验证程序停止运行的原因可能是打印过滤器的 %lS 方法调用了 COM 的 CoUninitialize,但没有成功调用相应的 CoInitialize[Ex]。
  • 参数 1 - 过滤器接口指针。 使用“ln poi(<value>)”查找过滤器。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

打印驱动程序对 PT/PC XML 文档的 AddRef/Release 调用不匹配。

可能的原因

当打印驱动程序错误地管理 XML 文档(如 PrintTicket 或 PrintCapabilities)的引用计数时,验证程序会停止运行。 预计方法调用不会改变引用计数,这很可能会导致 XML DOC 中的泄漏和/或关键部分丢失。

应用程序验证程序显示的信息
  • 格式: -  %lS 方法调用后,%lS XML 文档 ref 计数为 %d,预计为 %d。
  • 参数 1 - 违规方法调用的名称。 如果不是 NULL,则使用“du”来显示。
  • 参数 2 - XML 文档类型。 如果不是 NULL,则使用“du”来显示。
  • 参数 3 - 当前参考计数。
  • 参数 4 - 预期引用计数。

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

调用了 FatalExit

可能的原因

调用了 FatalExit。 这是一种异常终止形式,可能会导致报告其他验证程序停止(如泄漏),但无法采取纠正措施(即,这些停止不可靠且杂乱)。 要排除此停止的故障:在调试器中使用“k”命令转储当前堆栈跟踪,确定调用 FatalExit 的模块和例程。

应用程序验证程序显示的信息
  • 参数 1 - 退出代码。
  • 参数 2 - 未用。
  • 参数 3  -  未使用。
  • 参数 4  -  未使用。

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

另请参阅

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

应用程序验证程序 - 概述

应用程序验证工具 - 功能

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

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

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

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