トレーニング
モジュール
Manage drivers and device peripherals - Training
This module introduces device drivers. Student will learn how drivers work and the tools used to manage common peripheral devices such as printers.
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
この一連のテストには、次の停止コードが含まれています。
考えられる原因アプリケーションが終了したときに、開いているプリンター ハンドルが検出されました。 多くの場合、作成スレッドがプリンター ハンドルを閉じるには ClosePrinter() を呼び出しませんでした。 この停止のトラブルシューティングを行うには、この検証ツール停止の 2 番目のパラメーターを使用して、プリンター ハンドルを開いたスレッドを特定して、スタック トレースを提供します。 デバッガーで dps コマンドを使用してスタック トレースをダンプします。 vfPrint を呼び出した最初の非 winspool モジュール名と vfPrint 以外のモジュール名を見つけます。VfHookOpenPrinter* または vfPrint!VfHookAddPrinter* - これは通常、リスト内の 4 番目または 6 番目のスタック フレームです。
アプリケーション検証ツールによって表示される情報アプリケーションが終了したときに、閉じられなかったプリンター変更通知ハンドルが検出されました。 ほとんどの場合、ハンドルを開いたスレッドは、スレッドが終了する前に FindClosePrinterChangeNotification() を呼び出してハンドルを閉じませんでした。 この停止のトラブルシューティングを行うには、プリンター変更通知ハンドルを開いたスレッドを特定します。この停止の 2 番目のパラメーターはスタック アドレスを提供します。 dps コマンドを使用してスタック トレースをダンプします。 vfPrint!VfHookFindFirstPrinterChangeNotificationを呼び出した最初の非 winspool モジュール名と vfPrint 以外のモジュール名を見つけます。 これは通常、4 番目のスタック フレームにあります。
アプリケーション検証ツールによって表示される情報プログラムの終了時に、解放されなかった割り当てられたPRINTER_NOTIFY_INFO オブジェクトが検出されました。 ほとんどの場合、終了する前に FreePrinterNotifyInfo() を呼び出して解放する必要があります。 この停止のトラブルシューティングを行うには:winspool を呼び出し、この検証ツール停止の 2 番目のパラメーターを使用して、PRINTER_NOTIFY_INFO オブジェクトをその代わりに割り当てるルーチンを決定します。 デバッガーで dps コマンドを使用して初期化スタック トレースをダンプします。 vfPrint!VfHookFindNextPrinterChangeNotification を呼び出した最初の非 winspool モジュール名と vfPrint 以外のモジュール名を見つけます。 通常、このルーチンは 3 番目のスタック フレームにあります。
アプリケーション検証ツールによって表示される情報1 つのプリンター ハンドルが複数のスレッドで同時に使用されています。 プリンター ハンドルはスレッド セーフではありません。つまり、複数のスレッドでプリンター ハンドルを同時に使用することは、ハンドルへのアクセスを安全に調整するためのアプリケーション レベルの同期なしでは許可されません。 アプリケーションは、各スレッドで個別のプリンター ハンドルを開くか、Win32 同期 API を使用してプリンター ハンドルへのカスタム同期アクセスを提供する必要があります。 Win32 同期 API の詳細については、 https://learn.microsoft.com/windows/win32/sync/synchronization-functions.に記載しました
アプリケーション検証ツールによって表示される情報プリンター ハンドルは、プリンター ハンドルを作成したスレッドとは異なるスレッドで使用されました。 プリンター ハンドルはスレッド セーフではありません。つまり、複数のスレッドでプリンター ハンドルを同時に使用することは、ハンドルへのアクセスを安全に調整するためのアプリケーション レベルの同期なしでは許可されません。 アプリケーションは、各スレッドで個別のプリンター ハンドルを開くか、Win32 同期 API を使用してプリンター ハンドルへのカスタム同期アクセスを提供する必要があります。 Win32 同期 API の詳細については、 https://learn.microsoft.com/windows/win32/sync/synchronization-functions.に記載しました
アプリケーション検証ツールによって表示される情報閉じた後、プリンター ハンドルが使用されました。 閉じた プリンタ ハンドルを使用しようとしたルーチンを識別するには、デバッガーで 'k' コマンドを使用して、現在のスタック トレースをダンプします。 ハンドルを閉じたルーチンのスタック・トレースをダンプするには、停止の 2 番目のパラメーターと共に dps コマンドを使用します。
アプリケーション検証ツールによって表示される情報OpenPrinterA、OpenPrinterW、OpenPrinter2W (Windows Vista の場合)、AddPrinterA、または AddPrinterW を呼び出して開かなかったプリンター ハンドルを使用しようとしました。 このアクションを試行したルーチンのスタック トレースを表示するには、デバッガーで 'k' コマンドを使用します。
アプリケーション検証ツールによって表示される情報プリンター変更通知ハンドルは、閉じられた後に使用されました。 閉じた プリンタ変更通知ハンドルを使用しようとしたルーチンを表示するには、デバッガーで 'k' コマンドを使用して、現在のスタック トレースをダンプします。 ハンドルを閉じたルーチンのスタック・トレースをダンプするには、停止の 2 番目のパラメーターと共に dps コマンドを使用します。
アプリケーション検証ツールによって表示される情報FindFirstPrinterChangeNotification Win32 API 関数で開かれないハンドルが、プリンター変更通知ハンドルとして渡されました。 このアクションを試行したルーチンのスタック トレースを表示するには、デバッガーで 'k' コマンドを使用します。
アプリケーション検証ツールによって表示される情報PRINTER_NOTIFY_INFO オブジェクトは、解放された後に使用されました。 解放されたPRINTER_NOTIFY_INFO オブジェクトを使用しようとしたルーチンを確認するには、デバッガーで 'k' コマンドを使用して、現在のスタック トレースをダンプします。 ハンドルを閉じたルーチンのスタック・トレースをダンプするには、停止の 2 番目のパラメーターと共に dps コマンドを使用します。
アプリケーション検証ツールによって表示される情報PRINTER_NOTIFY_INFO オブジェクトが FindNextPrinterChangeNotification Win32 API 関数によって開かれていました。 このアクションを試行したルーチンのスタック トレースを表示するには、デバッガーで 'k' コマンドを使用します。
アプリケーション検証ツールによって表示される情報開かれたプリンター ハンドルが多すぎます。 リソース リークが発生している可能性があります。
アプリケーション検証ツールによって表示される情報不明。 このエラーを Microsoft に報告します。
アプリケーション検証ツールによって表示される情報PTOpenProvider(Ex) を呼び出して開かれた PrintTicket プロバイダー ハンドルが多すぎます。 これは、ハンドルが不要になったときに PTCloseProvider を呼び出さなくなり、リソース リークが発生した結果である可能性があります。
アプリケーション検証ツールによって表示される情報PrintTicket プロバイダー ハンドルは、解放された後に使用されました。 閉じた PrintTicket プロバイダー ハンドラーを使用しようとしたルーチンを表示するには、デバッガーで 'k' コマンドを使用して現在のスタック トレースをダンプします。 ハンドルを閉じたルーチンのスタック・トレースをダンプするには、停止の 2 番目のパラメーターと共に dps コマンドを使用します。
アプリケーション検証ツールによって表示される情報PtOpenProvider または PTOpenProviderEx を呼び出して開かれていない PrintTicket プロバイダー ハンドルが使用されました。
アプリケーション検証ツールによって表示される情報PrintTicket プロバイダー ハンドルが複数のスレッドで同時に使用されていました。 これには、ハンドルへのアクセスのアプリケーション レベルの同期が必要です。 PrintTicket プロバイダー ハンドルはスレッド セーフではありません。つまり、複数のスレッドで PrintTicket プロバイダー ハンドルを同時に使用することはできません。 代わりに、アプリケーションは、各スレッドで個別の PrintTicket プロバイダー ハンドルを開くか、Win32 同期 API を使用して PrintTicket プロバイダー ハンドルへのカスタム同期アクセスを提供する必要があります。 Win32 同期 API の詳細については、 https://learn.microsoft.com/windows/win32/sync/synchronization-functions.に記載しました
アプリケーション検証ツールによって表示される情報これは、PrintTicket プロバイダー ハンドルが、それを作成したスレッドとは異なるスレッドで使用されたことを示す警告です。 ハンドルに安全にアクセスするには、アプリケーション レベルの同期が必要になる場合があります。 PrintTicket プロバイダー ハンドルはスレッド セーフではありません。つまり、複数のスレッドで PrintTicket プロバイダー ハンドルを同時に使用することはできません。 代わりに、アプリケーションは、各スレッドで個別の PrintTicket プロバイダー ハンドルを開くか、Win32 同期 API を使用して PrintTicket プロバイダー ハンドルへのカスタム同期アクセスを提供する必要があります。 Win32 同期 API の詳細については、 https://learn.microsoft.com/windows/win32/sync/synchronization-functions.に記載しました
アプリケーション検証ツールによって表示される情報スレッドが終了したときに、開いている PrintTicket プロバイダー ハンドルが検出されました。 作成ルーチンは、終了する前に PTCloseProvider() を呼び出して閉じなかった可能性があります。 この停止のトラブルシューティングを行うには、この検証ツール停止の 2 番目のパラメーターを使用して、PrintTicket プロバイダーを開いたスレッドを特定して、スタック トレースを提供します。 デバッガーで dps コマンドを使用してスタック トレースをダンプします。 vfPrint を呼び出した最初の非 prntvpt モジュール名と vfPrint 以外のモジュール名を見つけます。VfPTOpenProvider または vfPrint!VfPTOpenProviderEx - これは通常、リスト内の 4 番目または 6 番目のスタック フレームです。
アプリケーション検証ツールによって表示される情報開かれたプリンター変更通知ハンドルが多すぎます。 リソース リークが発生している可能性があります。 リソース リークの一般的な形式の 1 つは、ルーチンがプリンター変更通知ハンドルを開き、終了する前に閉じない場合です。
アプリケーション検証ツールによって表示される情報開かれたPRINTER_NOTIFY_INFOオブジェクトが多すぎます。 リソース リークが発生している可能性があります。 リソース リークの一般的な形式の 1 つは、ルーチンがPRINTER_NOTIFY_INFO オブジェクトを開き、終了する前に閉じない場合です。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、アプリケーションが PrintTicket メソッドを無効な PrintTicket で呼び出したときに発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、アプリケーションが PrintTicket メソッドを無効な PrintCapabilities ドキュメントで呼び出したときに発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、アプリケーションが PrintTicket メソッドを無効な NULL 引数で呼び出したときに発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、PrintTicket/PrintCapabilities が PrintSchema に準拠していることを確認しようとしたときに、PrintVerifier で予期しないエラーが発生したときに発生します。 このエラーは、PrintVerifier で問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報DllMain 内からの呼び出しをサポートしていないプリント API への呼び出しが行われました。 Win32 プリント API だけでなく、多くの Win32 API を DllMain から呼び出すことはできません。 詳細については、MSDN ライブラリの DllMain に関するドキュメントを参照してください。
アプリケーション検証ツールによって表示される情報アプリケーションが終了したときに、開いているスプール ファイル ハンドルが検出されました。 ほとんどの場合、CloseSpoolFileHandle() が呼び出されませんでした。 この停止のトラブルシューティングを行うには:プリンター ハンドルを開いたスレッドを特定します。 パラメーター 2 が NULL でない場合は、dps を使用してダンプします。 vfPrint を呼び出した最初の非 winspool モジュール名と vfPrint 以外のモジュール名を見つけます。VfHookOpenPrinter* または vfPrint!VfHookAddPrinter*. 通常、このルーチンはリスト内の 4 番目または 6 番目のスタック フレームです。
アプリケーション検証ツールによって表示される情報スプール・ファイル・ハンドルは、クローズされた後に使用されました。 この停止のトラブルシューティングを行うには、デバッガーで 'k' コマンドを使用して現在のスタック トレースをダンプし、閉じたハンドルを使用しようとしたルーチンを識別します。 停止の 2 番目のパラメーターと共に dps コマンドを使用して、ハンドルを閉じたルーチンのスタック・トレースをダンプします。
アプリケーション検証ツールによって表示される情報GetSpoolFileHandle または CommitSpoolData を呼び出して開かなかったスプール ファイル ハンドルを使用しようとしました。 このアクションを試行したルーチンのスタック トレースを確認するには、デバッガーで 'k' コマンドを使用します。
アプリケーション検証ツールによって表示される情報開かれたスプール・ファイル・ハンドルが多すぎます。 リソース リークが発生している可能性があります。
アプリケーション検証ツールによって表示される情報この停止は、DEVMODE バッファーが既に解放されていること、DMSize メンバーと dmDriverExtra メンバーに必要以上の値を割り当てることによって DEVMODE バッファーが正しく構築されなかった、NULL 以外のバッファーが想定されている場合に NULL 開発モード バッファーが使用された、といういくつかの条件が原因で発生する可能性があります。
アプリケーション検証ツールによって表示される情報ターゲット モジュールのアンロード中に COM インターフェイスの正の refcount が検出されました。 モジュールでの DllCanUnloadNow エクスポートの不適切な実装または正しくない参照カウントが原因である可能性があります。
アプリケーション検証ツールによって表示される情報RegisterForPrintAsyncNotifications API 関数によって割り当てられたハンドルは、プログラムが終了するまで解放されませんでした。 ほとんどの場合、終了する前に UnRegisterForPrintAsyncNotifications() を呼び出して解放する必要があります。 この停止のトラブルシューティングを行うには:この検証ツール停止の 2 番目のパラメーターを使用して、winspool を呼び出してハンドルを割り当てるルーチンを決定します。 デバッガーで dps コマンドを使用して初期化スタック トレースをダンプします。 vfPrint!VfHookRegisterForPrintAsyncNotifications を呼び出した最初の非 winspool モジュール名と vfPrint 以外のモジュール名を見つけます。 通常、このルーチンは 3 番目のスタック フレームにあります。
アプリケーション検証ツールによって表示される情報ハンドルが RegisterForPrintAsyncNotifications Win32 API 関数によって開かれていました。 このアクションを試行したルーチンのスタック トレースを表示するには、デバッガーで 'k' コマンドを使用します。
アプリケーション検証ツールによって表示される情報非同期通知ハンドルは、閉じられた後に使用されました。 閉じた プリンタ ハンドルを使用しようとしたルーチンを表示するには、デバッガーで 'k' コマンドを使用して、現在のスタック トレースをダンプします。 ハンドルを閉じたルーチンのスタック・トレースをダンプするには、停止の 2 番目のパラメーターと共に dps コマンドを使用します。
アプリケーション検証ツールによって表示される情報サードパーティのメソッドは、インターフェイス ポインターを入力として受け取ります。 このようなメソッドが失敗したコードを返す場合は、インターフェイスの ref カウントメイン同じである必要があります。 しかし、この場合、参照カウントが増加しました。
アプリケーション検証ツールによって表示される情報API メソッドは、インターフェイス ポインターを入力として受け取ります。 このようなメソッドが失敗したコードを返す場合は、インターフェイスの ref カウントメイン同じである必要があります。 しかし、この場合、参照カウントが増加しました。 API コードで問題が発生する可能性があるため、このエラーを Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報IPrintAsyncNotifyChannel のプラットフォーム実装が、IPrintAsyncNotifyChannel によって暗黙的または定義されている特別なコントラクトの一部に違反しました。 IPrintAsyncNotifyChannel には、AddRef と Release に対する特別な例外があります。 そのためには、プラットフォームが OnEventNotify と ChannelClosed を、チャネルの作成時と同じポインター値で呼び出す必要があります。
アプリケーション検証ツールによって表示される情報双方向チャネルでは、SendNotification、CloseChannel を呼び出すか、インターフェイス ポインターで最後のリリースを行うと、"所有権" が放棄されます。 チャネルを作成して最初の通知を送信した後、コールバックの OnEventNotify が呼び出されるまで Release() を呼び出すことはできません。 CloseChannel() を呼び出すか、ChannelClosed 通知を取得する場合は、最終的な Release() 呼び出しを実行しないでください。
アプリケーション検証ツールによって表示される情報*** この停止を Microsoft に報告してください。 *** この停止は、通知が CloseChannel への呼び出しを _during_ に到着したことを示します。 この状態が発生した場合、コンシューマーがチャネルを正しく解放できない可能性があります。 この停止は頻繁に発生しないようにしてください。 これは、双方向チャネルが作成される前に常にリスナーが使用可能であることを確認すること、および、既に通知を送信しているがコールバックを受信していないチャネルを閉じない限りリスナーが開始できないようにすることで、防ぐことができます。
アプリケーション検証ツールによって表示される情報GUI スレッドでネットワーク呼び出しを行う 印刷 API が呼び出されました。 これにより、時間 UI がハングするバインドが解除される可能性があります。 通常、このような API は、メッセージ ポンプなしでワーカー スレッドで呼び出す必要があります。
アプリケーション検証ツールによって表示される情報ユーザー インターフェイスが Session0 としてポップアップ表示される API に対して呼び出しが行われました。
アプリケーション検証ツールによって表示される情報この停止は、プリンター ドライバーが非実行可能、解放またはコミット解除、または予約されているがコミットされていないためにアクセスできない仮想メモリ アドレスにアクセスしようとしたときに生成されます。 この停止をデバッグするには: $ u パラメータ 2 - 疑わしいコードをアンアセンブルします。 $ .exr パラメータ 3 - 例外情報を表示します。 $ .cxr パラメータ4 - 例外コンテキスト情報を表示します。 $ kb - 例外が発生した時刻のスタック トレースを表示します。
アプリケーション検証ツールによって表示される情報この停止は、プリンター ドライバーが整数値を 0 の整数除数で除算しようとしたときに生成されます。 この停止をデバッグするには: $ u パラメータ1 - 疑わしいコードをアンアセンブルします。 $ .exr パラメータ2 - 例外情報を表示します。 $ .cxr パラメータ3 - 例外コンテキスト情報を表示します。 $ kb - 例外が発生した時刻のスタック トレースを表示します。
アプリケーション検証ツールによって表示される情報この停止は、ドライバーが、配置を提供しないハードウェア上の不適切なデータを読み取りまたは書き込もうとしたときに生成されます。 たとえば、16 ビット値は 2 バイト境界に配置する必要があります。4 バイト境界の 32 ビット値など。 この停止をデバッグするには: $ u パラメータ1 - 原因コードをアンアセンブルします。 $ .exr パラメータ2 - 例外情報を表示します。 $ .cxr パラメータ3 - 例外コンテキスト情報を表示します。 $ kb - 例外が発生した時刻のスタック トレースを表示します。
アプリケーション検証ツールによって表示される情報この停止は、スタックの上部にある関数が無効なハンドルをシステム ルーチンに渡すと生成されます。 通常、kb コマンドは、呼び出し履歴で渡されたハンドルの値を表示します。 ハンドルは、呼び出しのパラメーターの 1 つになります。 多くの場合、これは最初のパラメーターです。 null ハンドル値は、無効なハンドル値の 1 つの例です。 ハンドル値が有効と思われる場合は、!htrace デバッガー拡張機能を使用して、ハンドル値を含む操作の履歴を表示します。 ハンドルが閉じられた後に使用されると、有効と思われるハンドル値が無効になる場合があります。
アプリケーション検証ツールによって表示される情報コア ドライバーは、既に閉じられているプリンター ハンドルをプラグインに送信しています。 このエラーは、Microsoft のコア プリンター ドライバー モジュールで問題になる可能性があるため、Microsoft に報告してください。 閉じた プリンタ ハンドルを使用しようとしたルーチンを識別するには、デバッガーで 'k' コマンドを使用して、現在のスタック トレースをダンプします。 ハンドルを閉じたルーチンのスタック・トレースをダンプするには、停止の 2 番目のパラメーターと共に dps コマンドを使用します。
アプリケーション検証ツールによって表示される情報コア ドライバーは、Windows Vista、AddPrinterA、または AddPrinterW で OpenPrinterA、OpenPrinterW、OpenPrinter2W を呼び出して開かなかったプリンター ハンドルをプラグインに送信しています。 このエラーは、Microsoft のコア プリンター ドライバー モジュールで問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報プラグインは、コア ドライバーからの入力として受け取ったプリンター ハンドルを閉じました。 これは、コア ドライバーからプラグインへの呼び出しの WDK 規則に違反します。 ハンドルを閉じたルーチンのスタック トレースをダンプするには、停止の 2 番目のパラメーターと共に dps を使用します。
アプリケーション検証ツールによって表示される情報PrintTicket プロバイダー プラグインは、サポートされている印刷スキーマのメジャー バージョンの数が無効です。 プラグインの IPrintOemPrintTicketProvider::GetSupportedVersions メソッドは、少なくとも 1 つのサポートされているメジャー バージョンを返す必要があります。 Windows Vista では印刷スキーマのメジャー バージョンが 1 つしかサポートされていないため、プラグインは 1 の値を返す必要があります。
アプリケーション検証ツールによって表示される情報PrintTicket プロバイダー プラグインは、サポートされている印刷スキーマ バージョンが少なくとも 1 つ返されたが、返されなかったことを示しました。 プラグインで IPrintOemPrintTicketProvider::GetSupportedVersions メソッドを呼び出すと、2 つの out ポインターが引数として受け入れられます。 ppVersions 引数は、印刷スキーマのサポートされているメジャー バージョンを表す整数の配列を指します。 cVersions 引数は、返される整数の配列内の要素の数を指します。 この検証ツールの停止は、プラグインが cVersions で有効な数値を返すが、ppVersions 配列内の何も返されない場合に発生します。
アプリケーション検証ツールによって表示される情報PrintTicket プロバイダー プラグインから、無効な印刷スキーマメジャー バージョンが返されました。 Windows Vista でサポートされている印刷スキーマのメジャー バージョンは 1 のみであるため、プラグインの IPrintOemPrintTicketProvider::GetSupportedVersions メソッドの呼び出しは 1 の値を返す必要があります。
アプリケーション検証ツールによって表示される情報PrintTicket プロバイダー プラグインから無効な OEMPTOPTS 値が返されました。 プラグインの IPrintOemPrintTicketProvider::BindPrinter メソッドの引数の 1 つは、OEMPTOPTS 列挙型へのポインターです。 プラグインは、この引数の値を Windows Vista でサポートされている値のいずれかに設定することが想定されています。 Windows Vista でサポートされる値は、OEMPT_DEFAULTとOEMPT_NOSNAPSHOTです。 この検証ツールの停止は、プラグインがこれらのサポートされている値の 1 つではない値を返したときに発生します。
アプリケーション検証ツールによって表示される情報PrintTicket プロバイダー プラグインは、少なくとも 1 つの Print Schema プライベート名前空間を返しているが、何も返さないことを示しました。 プラグインの IPrintOemPrintTicketProvider::BindPrinter メソッドの呼び出しには、プラグインがサポートする印刷スキーマのプライベート名前空間に関する情報を返すことができる 2 つの out ポインター引数が含まれています。 ppNamespaces 引数は、サポートされている印刷スキーマのプライベート名前空間を表す文字列の配列を指します。 cNamespaces 引数は、返される文字列の配列内の要素の数を指します。 この検証ツールの停止は、プラグインが cNamespaces で有効な数値を返すが、ppNamespaces 配列内の何も返さない場合に発生します。
アプリケーション検証ツールによって表示される情報WDK は、プラグインが IUnknown::AddRef および IUnknown::Release メソッドの実装で正確な参照カウントを実行する必要があることを示しています。 プラグインのインターフェイス オブジェクトの有効期間は、正確な参照カウントに依存します。 参照カウントが不正確な場合は、リソースリークが発生したり、プラグインの早期アンロードが発生したりしてドライバーが失敗する可能性があります。 この検証ツールの停止は、プラグインで正しくない参照カウントが検出されたときに発生します。
アプリケーション検証ツールによって表示される情報コア ドライバーによってプラグインの OEMNextBand フックに渡された pptl は NULL でした。 コア ドライバーは、常に有効な pptl をプラグインの OEMNextBand フックに送信する必要があります。 このエラーは、Microsoft のコア プリンター ドライバー モジュールで問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報プラグインによって返されたプライベート PDEV は NULL でしたが、EnablePDEV メソッドからの戻り値は成功を示S_OK。 WDK は、プラグインの EnablePDEV メソッドがS_OKの状態を返す場合、プライベート PDEV 構造体のインスタンスを割り当て、初期化し、メソッドの pDevOem パラメーターでこの構造体のアドレスを返す必要があることを示します。 この検証ツールの停止は、EnablePDEV メソッドの実装からS_OKの状態を返すときに、プラグインが有効なプライベート PDEV 構造体を返さない場合に発生します。
アプリケーション検証ツールによって表示される情報プラグインによって返されるプライベート DEVMODE は、少なくとも OEM_DMEXTRAHEADER のサイズである必要があります。 プラグインの DevMode メソッドは、OEMDM_SIZE モードで呼び出されたときにプライベート DEVMODE メンバーを格納するために必要なサイズを返す必要があります。 この値は、メソッドが初めて呼び出されるときに設定されます。 プラグインの DevMode メソッドは、OEMDMPARAM 構造体の cbBufSize メンバーの値を必要なバイト数に設定する必要があり、その値はOEM_DMEXTRAHEADERのサイズ以上である必要があります。 この検証ツールの停止は、OEMDMPARAM 構造体の cbBufSize メンバーで返されるサイズがOEM_DMEXTRAHEADERのサイズよりも小さい場合に発生します。
アプリケーション検証ツールによって表示される情報プラグインは、OEMDM_SIZE モードの DevMode 呼び出しによって返されるのと同じサイズのプライベート DEVMODE を返す必要があります。 プラグインの DevMode メソッドは、DevModeメソッドが OEMDM_SIZE モードで呼び出されたときにプライベート DEVMODE メンバーを格納するために必要なサイズを返す必要があります。 この値は定数であり、メソッドが初めて呼び出されるときに設定されます。 プラグインの DevMode メソッドに対して後続の呼び出しが行われるときに変更することはできません。 この検証ツールの停止は、プラグインの DevMode メソッドが最初に呼び出されたときに返された値とは異なる値を返す場合に発生します。
アプリケーション検証ツールによって表示される情報プラグインは、getInfo 呼び出し中に OEMGI_GETSIGNATURE モードで呼び出されたときに、有効な 0 以外のシグネチャを返す必要があります。 プラグインの GetInfo メソッドは、一意の 4 バイト識別シグネチャを返す必要があります。 この検証ツールの停止は、プラグインの GetInfo(OEMGI_GETSIGNATURE) メソッドが 0 個のシグネチャを返したときに発生します。
アプリケーション検証ツールによって表示される情報プラグインは、プラグインの GetInfo メソッドのOEMGI_GETSIGNATURE呼び出しで返されたのと同じ一意の 4 バイト識別シグネチャを含むプライベート DEVMODE を返す必要があります。 この検証ツールの停止は、これら 2 つの署名が同一でない場合に発生します。
アプリケーション検証ツールによって表示される情報プラグインの EnableDriver メソッドは、例外的な状況では失敗する可能性がありますが、失敗することは想定されていません。
アプリケーション検証ツールによって表示される情報プラグインの EnableDriver メソッドは、例外的な状況では失敗する可能性がありますが 失敗することは想定されていません。 失敗した場合は、SetLastError を呼び出して最後のエラー コードを設定する必要があります。 この検証ツールの停止は、プラグインの EnableDriver メソッドが最後のエラーを設定せずに失敗した場合に発生します。
アプリケーション検証ツールによって表示される情報プラグインが DriverDMS メソッドを実装し、DriverDMS メソッドの実装がS_OKを返す場合、コア ドライバーは SetBandSize を呼び出す必要はありません。 このエラーは、Microsoft のコア プリンター ドライバー モジュールで問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報WritePrinter の初期化呼び出し中は、pdevobj 引数と pBuf 引数を NULL にし、cbBuf をゼロにする必要があります。 コア ドライバーがプラグインの WritePrinter メソッドの初期化呼び出しを行った場合、これらの条件の 1 つが当てはまらなかった。 このエラーは、Microsoft のコア プリンター ドライバー モジュールで問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、プラグインの WritePrinter メソッドが失敗したときに発生します。 これにより、印刷ジョブが中止されます。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、コア ドライバーからプラグインに送信された PrintTicket ドキュメントが PrintSchema に準拠していない場合に発生します。 コア ドライバーはドライバーの GPD/PPD を解析してプラグインに送信される PrintTicket を構築するため、通常、この停止はドライバーの GPD/PPD のバグを示します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、プラグインからコア ドライバーに返された PrintTicket ドキュメントが PrintSchema に準拠していない場合に発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、コア ドライバーからプラグインに送信された PrintCapabilities ドキュメントが PrintSchema に準拠していない場合に発生します。 このエラーは、Microsoft のコア プリンター ドライバー モジュールで問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、プラグインからコア ドライバーに返された PrintCapabilities ドキュメントが PrintSchema に準拠していない場合に発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、PrintTicket/PrintCapabilities が PrintSchema に準拠していることを確認しようとしたときに、PrintVerifier で予期しないエラーが発生したときに発生します。 このエラーは、PrintVerifier で問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、出力フィルターが正しくない引数値を持つパイプライン メソッドを呼び出したときに発生します。 スタック トレースを使用して、印刷フィルター DLL の名前を検索します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、印刷フィルターが変更または印刷パイプラインのプロパティ バッグから共通プロパティを削除するときに発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、印刷フィルターが予期しないシーケンスでパイプライン マネージャー インターフェイス メソッドを呼び出したときに発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、パイプライン マネージャー インターフェイスの参照カウントが印刷フィルターによって誤って管理された場合に発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、印刷フィルターがパイプライン インターフェイス メソッドに対して不要または予期しない呼び出しを行ったときに発生します。 たとえば、印刷フィルターが IPrintWriteStream::Close を 2 回目に呼び出した場合です。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、パイプライン マネージャーが印刷フィルター インターフェイスのメソッドを誤って呼び出した場合に発生します。 このエラーは、印刷フィルター パイプライン サービスで問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、パイプライン マネージャーが無効な引数値を持つ印刷フィルター インターフェイスを呼び出すときに発生します。 このエラーは、印刷フィルター パイプライン サービスで問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、パイプライン マネージャーが印刷フィルターに無効な値を返したときに発生します。 このエラーは、印刷フィルター パイプライン サービスで問題になる可能性があるため、Microsoft に報告してください。
アプリケーション検証ツールによって表示される情報通常、この停止は、印刷ドライバーが RevertToSelf() または RevertToPrinterSelf() を呼び出したが、ImpersonatePrinterClient() を呼び出してユーザーを偽装するようにセキュリティ コンテキストを変更しなかった場合に発生します。 これは許可されず、印刷スプーラーの動作は、この処理が行われると未定義になります。 これにより、セキュリティの脆弱性が発生し、リモートで認証された特権の昇格の種類の攻撃が可能になる場合もあります。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、IPrintTicketPart パーツが SetPrintTicket メソッドに送信されたが、その内容が PrintSchema に準拠していない場合に発生します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、IPrintTicketPart パーツが GetPrintTicket メソッドを介して Print フィルターから受信されたが、その内容が PrintSchema に準拠していない場合に発生します。
アプリケーション検証ツールによって表示される情報ターゲット モジュールのアンロード中に COM インターフェイスの正の reference count が検出されました。 モジュールでの DllCanUnloadNow エクスポートの不適切な実装または正しくない参照カウントが原因である可能性があります。
アプリケーション検証ツールによって表示される情報COM インターフェイスは、リリース後に使用されました。 この停止のトラブルシューティング: - デバッガーで 'k' コマンドを使用して現在のスタック トレースをダンプし、開放されたインターフェイスを使用しようとしたルーチンを識別します。 - 使用可能な場合は、stop の 2 番目のパラメーターと共に dps コマンドを使用して、ルーチンを解放したルーチンのスタック トレースをダンプします。
アプリケーション検証ツールによって表示される情報ExitThread という名前の印刷ドライバー モジュール。 印刷ドライバー モジュールが ExitThread を呼び出すと、デストラクターを呼び出すか、その他の自動クリーンup を実行する前にスレッドが終了します。 これは未定義の動作につながる可能性があります。 したがって、印刷ドライバーは常にスレッド関数から戻る必要があります。 この停止のトラブルシューティングを行うには、デバッガーで 'k' コマンドを使用して現在のスタック トレースをダンプし、ExitThread を呼び出したルーチンを識別します。
アプリケーション検証ツールによって表示される情報TerminateThread という名前の印刷ドライバー モジュール。 TerminateThread は、スレッドを終了するために使用されます。 これが発生した場合、ターゲット スレッドはユーザー モード コードを実行する機会がありません。 スレッドにアタッチされている DLL は、スレッドが終了していることを通知しません。 システムはスレッドの初期スタックを解放します。 TerminateThread は危険な関数であり、最も極端な場合にのみ使用する必要があります。 たとえば、TerminateThread では次の問題が発生する可能性があります。ターゲット スレッドがクリティカル セクションを所有している場合、クリティカル セクションは解放されません。 - ターゲット スレッドがヒープからメモリを割り当てる場合、ヒープ ロックは解放されません。 - ターゲット スレッドが終了したときに特定の kernel32 呼び出しを実行している場合、スレッドのプロセスの kernel32 状態に不整合が生じる可能性があります。 - ターゲット スレッドが共有 DLL のグローバル状態を操作している場合、DLL の状態が破棄され、DLL の他のユーザーに影響を与える可能性があります。 この停止のトラブルシューティングを行うには、デバッガーで 'k' コマンドを使用して現在のスタック トレースをダンプし、TerminateThread を呼び出したモジュールとルーチンを識別します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、印刷フィルターが COM アパートメントの種類をいずれかのメソッド (InitializeFilter、StartOperation、または ShutdownOperation) で変更したときに発生します。 デバッガーで 'ln poi(<Param1>)' コマンドを使用して、印刷フィルター DLL の名前を識別します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、印刷フィルターで CoInitialize[Ex] 呼び出しと CoUninitialize 呼び出しが不均衡な場合に発生します。 これは、要求アパートメントの種類がスレッドの現在の型と一致しない場合など、CoInitialize[Ex] が予期せずエラーを返したことが原因である可能性があります。 デバッガーで 'ln poi(<Param1>)' コマンドを使用して、印刷フィルター DLL の名前を識別します。
アプリケーション検証ツールによって表示される情報この検証ツールの停止は、印刷ドライバーが XML ドキュメント (PrintTicket や PrintCapabilities など) の参照カウントを誤って管理した場合に発生します。 参照カウントはメソッド呼び出しによって変更されることが想定されておらず、XML DOC のリークや孤立したクリティカル セクションにつながる可能性があります。
アプリケーション検証ツールによって表示される情報FatalExit が呼び出されました。 これは異常終了の一種であり、他の検証者の停止 (リークなど) が報告される可能性がありますが、是正措置は不可能です (つまり、停止は信頼性が低く、ノイズが多い)。 この停止のトラブルシューティングを行うには、デバッガーで 'k' コマンドを使用して現在のスタック トレースをダンプし、FatalExit を呼び出したモジュールとルーチンを識別します。
アプリケーション検証ツールによって表示される情報アプリケーション検証ツール - アプリケーション検証ツール内のテスト
トレーニング
モジュール
Manage drivers and device peripherals - Training
This module introduces device drivers. Student will learn how drivers work and the tools used to manage common peripheral devices such as printers.