<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">PrintVerifier Team Blog</title><subtitle type="html">Blog to communicate details about PrintVerifier</subtitle><id>http://blogs.msdn.com/b/printverifier/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/printverifier/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2007-05-10T18:56:44Z</updated><entry><title>Attaching a debugger to the print filter pipeline service</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2009/03/24/attaching-a-debugger-to-the-print-filter-pipeline-service.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2009/03/24/attaching-a-debugger-to-the-print-filter-pipeline-service.aspx</id><published>2009-03-24T21:46:31Z</published><updated>2009-03-24T21:46:31Z</updated><content type="html">&lt;p&gt;As you should know by now, Application Verifier (and Print Verifier) works by sending error messages to the debugger that is attached to the associated process. For XPSDrv drivers, the filters are hosted by the print filter pipeline service, so you must attach a debugger to printfilterpipelinesvc.exe. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Note: &lt;/b&gt;I am making the assumption that you are generally familiar with how to use WinDbg to debug user-mode applications. If not, you should first read the help documentation that is included with the Debugging Tools for Windows package. Since print drivers are user-mode components only the sections on user-mode debugging are relevant. You can skip those parts of the documentation that are specific to kernel-mode debugging.&lt;/p&gt;  &lt;p&gt;There are two basic ways to attach WinDbg to a process.&lt;/p&gt;  &lt;p&gt;· Use WinDbg from the command line to start the process.&lt;/p&gt;  &lt;p&gt;· Attach WinDbg to an existing process.&lt;/p&gt;  &lt;p&gt;The filter pipeline host must be started by the print spooler, so you must use the second option to attach WinDbg to the process. However, the filter pipeline host is not persistent. A new instance of the service is started when an application submits a job to the print queue and the service is terminated shortly after the job is complete. It is difficult, at best, to attach WinDbg to printfilterpipelinesvc.exe after the print job is submitted but before the filter that you are trying to debug starts running, especially if you want to debug the filter’s startup or initialization code.&lt;/p&gt;  &lt;p&gt;To work around this problem, you can modify the amount of time that printfilterpipelinesvc.exe persists after a print job is finished. That value is controlled by the &lt;b&gt;PipelineHostTimeout&lt;/b&gt; value of the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print registry key.&lt;/p&gt;  &lt;p&gt;To change the filter pipeline service timeout value:&lt;/p&gt;  &lt;p&gt;1. Run &lt;b&gt;RegEdit&lt;/b&gt; and navigate to HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print.&lt;/p&gt;  &lt;p&gt;2. Add a &lt;b&gt;PipelineHostTimeout&lt;/b&gt; REG_DWORD value to the key, if it is not already present.&lt;/p&gt;  &lt;p&gt;3. Set &lt;b&gt;PipelineHostTimeout&lt;/b&gt; to the timeout value, in milliseconds.&lt;/p&gt;  &lt;p&gt;Set a large enough value to give yourself ample time to attach the process and set breakpoints. This paper assumes a 1.5 minute timeout, so &lt;b&gt;PipelineHostTimeout&lt;/b&gt; is set to 90000.&lt;/p&gt;  &lt;p&gt;After setting the &lt;b&gt;PipelineHostTimeout&lt;/b&gt; value, use the following procedure to attach WinDbg to the pipeline filter service:&lt;/p&gt;  &lt;p&gt;To Attach WinDbg to the filter pipeline service&lt;/p&gt;  &lt;p&gt;1. Run WinDbg with elevated privileges, but do not attach it to a process.&lt;/p&gt;  &lt;p&gt;2. Submit a print job to your driver and wait for it to complete.&lt;/p&gt;  &lt;p&gt;The filter pipeline service continues running for the specified timeout value.&lt;/p&gt;  &lt;p&gt;3. On the WinDbg &lt;b&gt;File&lt;/b&gt; menu, click &lt;b&gt;Attach to a Process&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;4. In the &lt;b&gt;Attach to Process&lt;/b&gt; dialog box, select printfilterpipelinesvc.exe and click &lt;b&gt;OK&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Tip:&lt;/b&gt; If the process is listed as “Access Denied”, it probably means that WinDbg is not running with elevated privileges.&lt;/p&gt;  &lt;p&gt;5. Set breakpoints, as appropriate.&lt;/p&gt;  &lt;p&gt;6. Submit the print job again.&lt;/p&gt;  &lt;p&gt;The filter host process should break into the debugger at the first breakpoint or the first verifier stop, whichever comes first. From there, you can step through code, examine variables, and so on.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9504961" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author><category term="XPSDrv" scheme="http://blogs.msdn.com/b/printverifier/archive/tags/XPSDrv/" /></entry><entry><title>Enabling PrintVerifier for XPSDrv</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2009/03/24/enabling-printverifier-for-xpsdrv.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2009/03/24/enabling-printverifier-for-xpsdrv.aspx</id><published>2009-03-24T21:37:02Z</published><updated>2009-03-24T21:37:02Z</updated><content type="html">&lt;p&gt;I wanted to use the next couple of posts to cover PrintVerifier in the context of XPSDrv. I don’t plan on covering the workflow involved in debugging individual stops since the troubleshooting steps for stops that you encounter in the XPSDrv scenario are exactly the same as other stops. Identify the stop code from the debugger, look up the details for the stop code in the Application Verifier documentation and take it from there.&lt;/p&gt;  &lt;p&gt;But there are some things that are different when it comes to XPSDrv and these differences lie mainly in the setup and configuration phase. So let’s discuss these differences in the next couple of posts. First up is, of course, to enable PrintVerifier.&lt;/p&gt;  &lt;p&gt;1. Click &lt;b&gt;Start&lt;/b&gt; and run Application Verifier from the &lt;b&gt;All Programs&lt;/b&gt; menu.&lt;/p&gt;  &lt;p&gt;The program initially displays the following window:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/printverifier/WindowsLiveWriter/EnablingPrintVerifierforXPSDrv_A030/appverif_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="appverif" border="0" alt="appverif" src="http://blogs.msdn.com/blogfiles/printverifier/WindowsLiveWriter/EnablingPrintVerifierforXPSDrv_A030/appverif_thumb.png" width="520" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Figure 1. Application Verifier before configuration&lt;/p&gt;  &lt;p&gt;2. Press Ctrl-A and open PrintFilterPipelineSvc.exe, which is located in Windows\System32.&lt;/p&gt;  &lt;p&gt;PrintFilterPipelineSvc.exe is the filter pipeline service. This action adds PrintFilterPipelineSvc.exe to the list of images in the Applications pane and displays a set of associated Application Verifier tests in the Tests pane.&lt;/p&gt;  &lt;p&gt;3. Select the &lt;b&gt;Printing&lt;/b&gt; test, which enables Print Verifier. This test has two components:&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;PrintAPI&lt;/b&gt; tests the interface between applications and the print spooler.&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;PrintDriver&lt;/b&gt; tests the interface between the core print driver and its plugins as well as the filter pipeline manager and XPSDrv filters.&lt;/p&gt;  &lt;p&gt;4. In the Tests pane, under &lt;b&gt;Basics&lt;/b&gt;, select all the tests except &lt;b&gt;Threadpool&lt;/b&gt;. The configured Application Verifier should look like Figure 5.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/printverifier/WindowsLiveWriter/EnablingPrintVerifierforXPSDrv_A030/appverif_printfilterpipeline_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="appverif_printfilterpipeline" border="0" alt="appverif_printfilterpipeline" src="http://blogs.msdn.com/blogfiles/printverifier/WindowsLiveWriter/EnablingPrintVerifierforXPSDrv_A030/appverif_printfilterpipeline_thumb.png" width="520" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Figure 2. Application Verifier configured for print verification.&lt;/p&gt;  &lt;p&gt;For information on the other tests, use the &lt;b&gt;Help&lt;/b&gt; menu to view the help documentation.&lt;/p&gt;  &lt;p&gt;5. Click &lt;b&gt;Save&lt;/b&gt; to enable this Application Verifier configuration.&lt;/p&gt;  &lt;p&gt;Note that you might have to restart the print filter pipeline process in order for these settings to persist. You can do this either via the task manager and kill printfilterpipelinesvc.exe or restart your system. After either of these steps, Application Verifier will be enabled for the print filter pipeline process.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9504934" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author><category term="XPSDrv" scheme="http://blogs.msdn.com/b/printverifier/archive/tags/XPSDrv/" /></entry><entry><title>New stops</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2009/02/24/new-stops.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2009/02/24/new-stops.aspx</id><published>2009-02-24T10:24:56Z</published><updated>2009-02-24T10:24:56Z</updated><content type="html">&lt;p&gt;We just released a &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c4a25ab9-649d-4a1b-b4a7-c9d8b095df18&amp;amp;DisplayLang=en" target="_blank"&gt;new version&lt;/a&gt; of Application Verifier. As part of this release, we added a number of stops to Print Verifier. Unfortunately, we neglected to document these stops in the recent release of App Verifier. By the time we discovered this mistake, it was too late for the doc writers to update the documentation. We will definitely get this rectified in the next release. But in the meantime, we thought we’d publish the documentation for the new stops here.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A020&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Async Notify handle returned by RegisterForPrintAsyncNotifications was not released properly&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Handle allocated by RegisterForPrintAsyncNotifications function had not been released until the program exited. Most likely, it needs to be released by calling UnRegisterForPrintAsyncNotifications() before exiting.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop:&lt;/p&gt;  &lt;p&gt;o Determine the routine that called winspool to allocate the handle on its behalf by using the second parameter of this verifier stop.&lt;/p&gt;  &lt;p&gt;o Dump the initialization stack trace using the dps command in the debugger.&lt;/p&gt;  &lt;p&gt;o Find the first non-winspool and non-vfPrint module name that called vfPrint!VfHookRegisterForPrintAsyncNotifications. This routine is typically found in the 3rd stack frame.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Parameter 1 - Handle value. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Initialization stack trace. Use dps to dump the stack trace if it is not NULL. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A020&lt;/p&gt;  &lt;p&gt;Stop code: 032&lt;/p&gt;  &lt;p&gt;Severity: Warning&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: None&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A021&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Attempt to use an invalid handle in UnRegisterForPrintAsyncNotifications.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The handle was not opened by the RegisterForPrintAsyncNotifications Win32 API function.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the stack trace of the routine that attempted this action using the 'k' command in the debugger.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Parameter 1 - Handle value. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A021&lt;/p&gt;  &lt;p&gt;Stop code: 033&lt;/p&gt;  &lt;p&gt;Severity: Error&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: Break&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A022&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Attempt to use a closed handle in UnRegisterForPrintAsyncNotifications API function.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;An async notify handle was used after it has been closed.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop:&lt;/p&gt;  &lt;p&gt;o Use the 'k' command in the debugger to view the current stack trace. This will indicate the routine that tried to use the closed handle.&lt;/p&gt;  &lt;p&gt;o Use the 'dps' debugger command on the second parameter of the stop to view the stack trace of the routine that closed the handle.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Parameter 1 - Handle value. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Stack trace of the closing. Use dps to dump the stack trace if it is not NULL. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A022&lt;/p&gt;  &lt;p&gt;Stop code: 034&lt;/p&gt;  &lt;p&gt;Severity: Error&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: Break&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A023&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Third-party function reports failure but increases reference count for input interface.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A third-party method receives interface pointer as input. When such method returns a failure code, the interface reference count should remain the same. But in this case the reference count was increased.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace using the 'k' command in the debugger.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Format: The %lS method returns %x error code but increases ref count of %lS parameter.&lt;/p&gt;  &lt;p&gt;Parameter 1 - Called interface pointer. If NULL, called function is static. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Input interface pointer. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A023&lt;/p&gt;  &lt;p&gt;Stop code: 035&lt;/p&gt;  &lt;p&gt;Severity: Error&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: Break&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A024&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Windows API function reports failure but increases reference count for input interface.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;An API method receives interface pointer as input. When such method returns fail code, interface ref count should remain the same. But in this case reference count was increased. Please report this error to Microsoft because it could be a problem in API code.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace using the 'k' command in the debugger.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Parameter 1 - Called interface pointer. If NULL, called function is static. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Input interface pointer. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A024&lt;/p&gt;  &lt;p&gt;Stop code: 036&lt;/p&gt;  &lt;p&gt;Severity: Warning&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: None&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A025&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;IPrintAsyncNotifyChannel contract violation by the operating system.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The platform implementation of IPrintAsyncNotifyChannel violated part of the special contract implied or defined by IPrintAsyncNotifyChannel. IPrintAsyncNotifyChannel has special exceptions to AddRef and Release. This requires that the platform calls OnEventNotify and ChannelClosed with the same pointer value as the channel was created with. Please report this error to Microsoft.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace using the 'k' command in the debugger.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Format: %s was called with the wrong interface pointer.&lt;/p&gt;  &lt;p&gt;Parameter 1 - Actual interface pointer. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Expected interface pointer. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A025&lt;/p&gt;  &lt;p&gt;Stop code: 037&lt;/p&gt;  &lt;p&gt;Severity: Warning&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: None&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A026&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;IPrintAsyncNotifyChannel contract violation by channel consumer.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;On bidirectional channels, calling SendNotification, CloseChannel, or making the final Release on the interface pointer relinquishes 'ownership'. After creating the channel and sending the first notification, you cannot call Release until your callback's OnEventNotify is invoked. If either you invoke CloseChannel or get a ChannelClosed notification, then you must not perform the final Release call.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace using the 'k' command in the debugger.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Format: %s was called, but channel 'ownership' currently belongs to print spooler&lt;/p&gt;  &lt;p&gt;Parameter 1 - IPrintAsyncNotifyChannel interface pointer. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A026&lt;/p&gt;  &lt;p&gt;Stop code: 038&lt;/p&gt;  &lt;p&gt;Severity: Error&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: Break&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A027&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Race detected during closing of IPrintAsyncNotifyChannel.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This stop indicates that a notification arrives _during_ the call to CloseChannel. If this condition occurs, it may be imposible for the consumer to correctly release the channel.&lt;/p&gt;  &lt;p&gt;This stop should not be frequently encountered. It can be prevented by always ensuring a listener is available before a bidirectional channel is created, AND/OR ensuring that no listener can be started before attempting closing a channel that has already sent a notification but not recieved the callback.&lt;/p&gt;  &lt;p&gt;Please report this error to Microsoft.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace using the 'k' command in the debugger.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Format: In function %s, a call is already in progress on a different thread. See help for more info.&lt;/p&gt;  &lt;p&gt;Parameter 1 - IPrintAsyncNotifyChannel interface pointer. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Thread id of member function called. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Thread id of callback event function. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A027&lt;/p&gt;  &lt;p&gt;Stop code: 039&lt;/p&gt;  &lt;p&gt;Severity: Warning&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: None&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A028&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Calling a print API that makes network calls on a GUI thread. This can lead to unbound in time UI hangs.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A print API was called that makes network calls on a GUI thread. This can lead to unbound in time UI hangs. Typically such APIs need to be called on a worker thread, with no message pumps.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace using the 'k' command in the debugger.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Format: %s was called on a thread that is a GUI thread. This can lead to unbound in time UI hangs.&lt;/p&gt;  &lt;p&gt;Parameter 1 - HWND of the top-level visible window. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Current thread ID. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A028&lt;/p&gt;  &lt;p&gt;Stop code: 040&lt;/p&gt;  &lt;p&gt;Severity: Warning&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: None&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A029&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Calling an API that will pop up user interface is Session0.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A call was made to an API that will pop up user interface is Session0.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace using the 'k' command in the debugger.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Format: The illegal-to-call in Session0 API: %s&lt;/p&gt;  &lt;p&gt;Parameter 1 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintAPI&lt;/p&gt;  &lt;p&gt;Stop ID: 0000A029&lt;/p&gt;  &lt;p&gt;Stop code: 041&lt;/p&gt;  &lt;p&gt;Severity: Error&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: Break&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;D02A&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A print driver called ExitThread.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A print driver module called ExitThread. When a print driver module calls ExitThread, the thread is exited before any destructors can be called or any other automatic cleanup can be performed. This can lead to undefined behavior. Therefore, print drivers should always return from their thread function.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace by using the 'k' command in the debugger to identify the print driver module and routine that invoked ExitThread.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Parameter 1 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintDriver&lt;/p&gt;  &lt;p&gt;Stop ID: 0000D02A&lt;/p&gt;  &lt;p&gt;Stop code: 042&lt;/p&gt;  &lt;p&gt;Severity: Error&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: Break&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;D02B&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Application Verifier break message&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A print driver called TerminateThread.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Probable cause&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A print driver module called TerminateThread. TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code. DLLs attached to the thread are not notified that the thread is terminating. The system frees the thread's initial stack. TerminateThread is a dangerous function that should only be used in the most extreme cases.&lt;/p&gt;  &lt;p&gt;For example, TerminateThread can result in the following problems:&lt;/p&gt;  &lt;p&gt;o If the target thread owns a critical section, the critical section will not be released. &lt;/p&gt;  &lt;p&gt;o If the target thread is allocating memory from the heap, the heap lock will not be released. &lt;/p&gt;  &lt;p&gt;o If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent. &lt;/p&gt;  &lt;p&gt;o If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Troubleshooting Steps&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To troubleshoot this stop, view the current stack trace by using the 'k' command in the debugger to identify the print driver module and routine that invoked TerminateThread.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Information displayed by Application Verifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Parameter 1 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 2 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 3 - Not used. &lt;/p&gt;  &lt;p&gt;Parameter 4 - Not used. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Additional information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test Layer: PrintDriver&lt;/p&gt;  &lt;p&gt;Stop ID: 0000D02B&lt;/p&gt;  &lt;p&gt;Stop code: 043&lt;/p&gt;  &lt;p&gt;Severity: Error&lt;/p&gt;  &lt;p&gt;One-time error: no &lt;/p&gt;  &lt;p&gt;Error report: Break&lt;/p&gt;  &lt;p&gt;Log to file: yes &lt;/p&gt;  &lt;p&gt;Create backtrace: yes &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9442280" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Unintended hibernation</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2009/02/12/unintended-hibernation.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2009/02/12/unintended-hibernation.aspx</id><published>2009-02-12T10:53:26Z</published><updated>2009-02-12T10:53:26Z</updated><content type="html">&lt;p&gt;Sorry for what might have seemed like terminal hibernation. We’ve just been busy working on PrintVerifier and other components of Windows that we haven’t had time to update this blog. We hope to be more active in this space in the coming weeks and months.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9414273" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>PrintVerifier Philosophy</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2007/05/11/printverifier-philosophy.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2007/05/11/printverifier-philosophy.aspx</id><published>2007-05-12T01:37:24Z</published><updated>2007-05-12T01:37:24Z</updated><content type="html">&lt;p&gt;&lt;/p&gt; &lt;p&gt;I thought I'd spend the rest of the afternoon penning my thoughts on &lt;a href="http://en.wikipedia.org/wiki/Metaphysics" target="_blank"&gt;metaphysics&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Epistemology" target="_blank"&gt;epistemology&lt;/a&gt; and associated topics. Nah! Just kidding!&lt;/p&gt; &lt;p&gt;Our philosophy when it comes to PrintVerifier is that when in doubt DO NOT break.&amp;nbsp;In other words, during the verification process if PrintVerifier detects a potential problem but is not 100% certain about the legality/seriousness of the problem, then no stop will be issued.&amp;nbsp;PrintVerifier stops are&amp;nbsp;very indicative of a&amp;nbsp;real problem in the code being verified and need to be investigated.&lt;/p&gt; &lt;p&gt;PrintVerifier stop == There IS a problem&lt;/p&gt; &lt;p&gt;PrintVerifier stop != There MAYBE a problem&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2554515" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author><category term="Philosophy" scheme="http://blogs.msdn.com/b/printverifier/archive/tags/Philosophy/" /></entry><entry><title>WinHEC is almost here</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2007/05/11/winhec-is-almost-here.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2007/05/11/winhec-is-almost-here.aspx</id><published>2007-05-11T22:13:31Z</published><updated>2007-05-11T22:13:31Z</updated><content type="html">&lt;p&gt;Whew! The long wait is finally over. One last working day before it is time to leave for WinHEC. Eagerly looking forward to meeting everyone and unveiling PrintVerifier.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2551478" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>PrintTicket/PrintCapabilities verification</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2007/05/11/printticket-printcapabilities-verification.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2007/05/11/printticket-printcapabilities-verification.aspx</id><published>2007-05-11T03:21:24Z</published><updated>2007-05-11T03:21:24Z</updated><content type="html">&lt;p&gt;One of the really cool features in PrintVerifier is runtime verification of PrintTicket and PrintCapabilities documents. Let's talk a little more about this feature.&lt;/p&gt; &lt;p&gt;We have integrated the essence of the PTConform tool into PrintVerifier. While the PTConform tool is invaluable in its own way, it has certain drawbacks. In order to effectively verify the PrintTicket functionality of your print driver, you have to first save the set of PrintTickets/PrintCapabilities that your driver can potentially produce as static XML files and then run PTConform on these files. Needless to say, this can be a tedious task. PrintVerifier gives you the ability to perform this verification at runtime. PrintVerifier validates the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;PrintTickets that are passed in by the application  &lt;li&gt;PrintTickets/PrintCapabilities that are returned by the plug-in/filter.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If any of the above are found to be non-conformant to the Print Schema, a PrintVerifier stop is issued. The stop will contain the error message returned by PTConform as well as the PrintTicket/PrintCapabilities XML text.&lt;/p&gt; &lt;p&gt;PrintVerifier also offers you the flexibility to turn off just the PT/PC verification but get all the other benefits of the PrintAPI and PrintDriver layer checks. This could be of use in a scenario where you want to focus on a portion of your code that is not related to PT/PC and don't want to be randomized by PT/PC related stops. Although this flexibility is made available for a reason, we recommend that you stick to the default settings.&lt;/p&gt; &lt;p&gt;In summary,&amp;nbsp;the PTConform integration with PrintVerifier allows you to validate&amp;nbsp;your PrintTicket handling code simply by enabling PrintVerifier for the processes that host your print component.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2533247" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author><category term="PrintCapabilities" scheme="http://blogs.msdn.com/b/printverifier/archive/tags/PrintCapabilities/" /><category term="PrintTicket" scheme="http://blogs.msdn.com/b/printverifier/archive/tags/PrintTicket/" /><category term="PTConform" scheme="http://blogs.msdn.com/b/printverifier/archive/tags/PTConform/" /></entry><entry><title>What is a verifier stop?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2007/05/11/what-is-a-verifier-stop.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2007/05/11/what-is-a-verifier-stop.aspx</id><published>2007-05-11T02:25:25Z</published><updated>2007-05-11T02:25:25Z</updated><content type="html">&lt;p&gt;I was in the process of writing up a few blog posts to do with debugging specific PrintVerifier stops when I realized that we haven't covered the basic concept of a verifier stop. So let's do that.&lt;/p&gt; &lt;div class="CodeFormatContainer" align="left"&gt;&lt;pre class="csharpcode"&gt;&lt;font size="2"&gt;=======================================
VERIFIER STOP 0000A012 : pid 0xD68: Leaked PrintTicket provider&lt;br&gt;handle detected

03320FE8 : PrintTicket provider handle being leaked.
0312FF48 : Initialization stack trace. Use dps to dump the stack&lt;br&gt;trace &lt;span class="kwrd"&gt;if&lt;/span&gt; it &lt;span class="kwrd"&gt;is&lt;/span&gt; not NULL.
00000CC0 : Thread id of the thread that opened the handle.
00000000 : Not used.
=======================================&lt;/font&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What you see above is what is referred to commonly as a verifier stop. The concept of a verifier stop is common to Application Verifier and not specific to PrintVerifier. All checks/verifications in AppVerifier issue a verifier stop to indicate a problem in the code/component being verified. Let's go over the important pieces of information that are part of a verifier stop.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stop code ID: The stop code ID is very important since this is what you use to look up additional information about the stop in the documentation. The numbering scheme will also give you a rough idea about what type of verification caused the stop. For example, all PrintAPI layer stops are numbered starting from 0000A000 and all PrintDriver layer stops are numbered starting from 0000D000. So in the snippet shown above, you can right away tell that it is a PrintAPI layer stop. 
&lt;li&gt;Stop code title: The stop code title gives you rough idea about the root cause of the stop. For example, in the snippet shown above you can tell from the title that the root cause of the stop is the component being verified leaking a PrintTicket provider handle. 
&lt;li&gt;Parameters: The parameters of a verifier stop provide the additional information you need to troubleshoot/debug the stop and pinpoint the root cause. A verifier stop can have a maximum of 4 parameters although not all might be used. For instance, in the snippet shown above you will see that only the first 3 parameters are used. The documentation for each verifier stop lists specific troubleshooting steps (inclusive of debugger commands) that you can take to display the additional information represented by the parameters.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;So that's as far as pieces of information that are common to all verifier stops. But there is additional piece of information that only PrintDriver layer stops display.&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;=======================================&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;VERIFIER STOP 0000D006 : pid 0x1644: The plugin driver closed the printer handle.&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;00000000018F6898 : Printer handle that was closed.&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;0000000001E733B0 : Stack trace of the closing. Use dps to dump the stack trace if it is not NULL.&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;0000000000000000 : Not used.&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;0000000000000000 : Not used.&lt;br&gt;&lt;br&gt;This verifier stop was caused by the GetSupportedVersions method in the plug-in module at C:\WINDOWS\system32\spool\DRIVERS\x64\3\PTPlug_GetSupVersions_1.dll&lt;br&gt;=======================================&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;In the&amp;nbsp;snippet shown above, you will see the additional line stating that the GetSupportedVersions method in the PTPlug_GetSupVersions_1.dll&amp;nbsp;caused the PrintVerifier&amp;nbsp;stop to occur. This will allow you to isolate the problem area in your driver's code to&amp;nbsp;a small manageable section.&amp;nbsp;This feature is specific to the PrintDriver layer stops. The reason for including this information only for PrintDriver stops is that in most cases, the plug-in/filter being verified is not on the call stack at the time of the stop. As explained &lt;a href="http://blogs.msdn.com/printverifier/archive/2007/02/16/printverifier-architecture.aspx" target="_blank"&gt;here&lt;/a&gt;, the PrintDriver hooks perform checks both before and after calling the plug-in/filter's COM interface methods. Since a number of checks are performed (and stops issued) after the plug-in/filter method has returned, the module being verified is no longer on the call stack. Therefore, the need to display the additional information for PrintDriver stops.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2532017" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author><category term="Print Driver" scheme="http://blogs.msdn.com/b/printverifier/archive/tags/Print+Driver/" /></entry><entry><title>PrintVerifier demo</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2007/05/10/printverifier-demo.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2007/05/10/printverifier-demo.aspx</id><published>2007-05-10T23:25:40Z</published><updated>2007-05-10T23:25:40Z</updated><content type="html">&lt;p&gt;We&amp;nbsp;will be presenting a demo of the PrintVerifier workflow at WinHEC 2007. You can find a screencast of the demo &lt;a href="http://channel9.msdn.com/Showpost.aspx?postid=306647" target="_blank"&gt;here&lt;/a&gt;. The demo illustrates how to enable PrintVerifier for a process and walks you through the troubleshooting steps to be taken for debugging a PrintVerifier stop.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2529574" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author><category term="Demo" scheme="http://blogs.msdn.com/b/printverifier/archive/tags/Demo/" /></entry><entry><title>Simple yet powerful</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/printverifier/archive/2007/05/10/simple-yet-powerful.aspx" /><id>http://blogs.msdn.com/b/printverifier/archive/2007/05/10/simple-yet-powerful.aspx</id><published>2007-05-10T20:56:44Z</published><updated>2007-05-10T20:56:44Z</updated><content type="html">&lt;p&gt;I came across this nugget while&amp;nbsp;reading &lt;a href="http://www.microsoft.com/presspass/exec/ssinofsky/default.mspx" target="_blank"&gt;Steven Sinofsky's&lt;/a&gt; internal blog.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I am helping a company design an entirely new approach to one of their standard products. It looks simple. During a user test, one person said that he really liked it, but it was too bad he wouldn't use it.&amp;nbsp; &lt;br&gt;"Why not?" we asked. &lt;br&gt;"Because it isn't powerful enough for my particular problem," he replied.&lt;br&gt;"Try it," we suggested, "we would like to see where it fails so we can make it better."&lt;br&gt;Well, it didn't fail. it handled his problem just fine. Looking simple was the culprit. if it looks simple, he seemed to think, it must not be powerful.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;PrintVerifier&amp;nbsp;could very&amp;nbsp;easily be the product discussed in the example.&amp;nbsp;At times&amp;nbsp;(both thru this blog as well as thru WinHEC presentations) we might put a lot of emphasis on the simplicity of PrintVerifier. But make no mistake...PrintVerifier is a very powerful tool that will enable you to develop quality drivers and applications.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2527336" width="1" height="1"&gt;</content><author><name>vfPrint</name><uri>http://blogs.msdn.com/vfPrint/ProfileUrlRedirect.ashx</uri></author></entry></feed>