4

MSDN はWinVerifyTrust()およびWinVerifyTrustEx()関数を文書化していますが、それらの違いが何であるかはあまり明確ではありません。

関数のシグネチャは、最後のパラメーターを除いて同じです。

LONG WINAPI WinVerifyTrust(
  _In_ HWND   hWnd,
  _In_ GUID   *pgActionID,
  _In_ LPVOID pWVTData
);
HRESULT WinVerifyTrustEx(
  _In_ HWND          hwnd,
  _In_ GUID          *pgActionID,
  _In_ WINTRUST_DATA *pWinTrustData
);

ただし、LPVOID pWVTDataパラメーター toWinVerifyTrust()は、実際には次のWINTRUST_DATA*ようになり WinVerifyTrustEx()ます。

pWVTData [入力]
WINTRUST_DATA 構造体としてキャストされたときに、信頼プロバイダーが指定されたアクション識別子を処理するために必要な情報を含むポインター。

私は他の違いを探すために 2 つのドキュメント ページを比較しました。ここに私が見つけたものを示します。

WinVerifyTrust():

サブジェクトが指定されたアクションに対して信頼されていることを信頼プロバイダーが検証しない場合、関数は信頼プロバイダーからステータス コードを返します。注: 戻り値は、前述の HRESULT ではなく、LONG です。関数が成功したかどうかを判断するために、SUCCEEDED などの HRESULT マクロを使用しないでください。代わりに、戻り値がゼロに等しいかどうかを確認してください。

備考

WinVerifyTrust 関数を使用すると、アプリケーションは信頼プロバイダーを呼び出して、指定されたオブジェクトが指定された検証操作の基準を満たしていることを検証できます。pgActionID パラメータは検証操作を識別し、pWinTrustData パラメータは信頼を検証するオブジェクトを識別します。トラスト プロバイダーは、オペレーティング システムに登録されている DLL です。WinVerifyTrust への呼び出しは、指定されたアクション識別子をサポートする登録済みの信頼プロバイダーが存在する場合、その呼び出しをその信頼プロバイダーに転送します。
たとえば、Software Publisher Trust Provider は、実行可能イメージ ファイルが信頼できるソフトウェア発行元からのものであり、ファイルが発行されてから変更されていないことを確認できます。この場合、pWinTrustData パラメーターは、ファイルの名前とファイルの種類 (Microsoft Portable Executable イメージ ファイルなど) を指定します。
各信頼プロバイダーは、評価できる特定の一連のアクションをサポートしています。各アクションには、それを識別する GUID があります。信頼プロバイダーは任意の数のアクション ID をサポートできますが、2 つの信頼プロバイダーが同じアクション ID をサポートすることはできません。
この関数を使用してポータブル実行可能 (PE) ファイルの署名を検証する方法を示す例については、「サンプル C プログラム: PE ファイルの署名を検証する」を参照してください。

WinVerifyTrustEx():

この関数には関連するインポート ライブラリがありません。Wintrust.dll に動的にリンクするには、LoadLibrary および GetProcAddress 関数を使用する必要があります。

WINTRUST_ACTION_GENERIC_CERT_VERIFY
証明書チェーンのみを検証します。これは、WinVerifyTrust 入力構造で証明書コンテキストを渡す場合にのみ有効です。
注: この関数を使用して証明書の検証を実行することはお勧めしません。証明書の検証を実行するには、CertGetCertificateChain および CertVerifyCertificateChainPolicy 関数を使用します。

信頼プロバイダーが、サブジェクトが指定されたアクションに対して信頼されていることを確認した場合、戻り値は ERROR_SUCCESS です。それ以外の場合、関数は信頼プロバイダーからステータス コードを返します。

テストとして、リストされているサンプル プログラムを代わりWinVerifyTrust()に使用するように変更しました。WinVerifyTrustEx()どちらの API 呼び出しでも同じ結果が得られます。

誰かがこれら 2 つの機能に精通しており、それらの実際の違いを知っている場合は、洞察をいただければ幸いです。

4

0 に答える 0