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
to 的参数WinVerifyTrust()
实际上是 a WINTRUST_DATA*
,就像 WinVerifyTrustEx()
:
pWVTData [in]
一个指针,当转换为 WINTRUST_DATA 结构时,它包含信任提供者处理指定操作标识符所需的信息。
我比较了两个文档页面以查找任何其他差异,这就是我发现的内容,省略了微不足道的差异:
WinVerifyTrust()
:
如果信任提供者未验证指定操作的主题是否受信任,则该函数从信任提供者返回状态代码。注意返回值是 LONG,而不是之前记录的 HRESULT。不要使用 SUCCEEDED 等 HRESULT 宏来判断函数是否成功。相反,检查返回值是否等于零。
评论
WinVerifyTrust 函数使应用程序能够调用信任提供程序来验证指定对象是否满足指定验证操作的条件。pgActionID 参数标识验证操作,pWinTrustData 参数标识要验证其信任的对象。信任提供程序是向操作系统注册的 DLL。对 WinVerifyTrust 的调用将该调用转发给已注册的信任提供者(如果有的话)支持该指定的操作标识符。
例如,软件发布者信任提供者可以验证可执行映像文件是否来自受信任的软件发布者,并且该文件自发布以来未被修改。在这种情况下,pWinTrustData 参数指定文件的名称和文件的类型,例如 Microsoft 可移植可执行映像文件。
每个信任提供者都支持它可以评估的一组特定操作。每个操作都有一个标识它的 GUID。一个信任提供者可以支持任意数量的动作标识符,但两个信任提供者不能支持相同的动作标识符。
有关演示如何使用此函数来验证可移植可执行 (PE) 文件的签名的示例,请参阅示例 C 程序:验证 PE 文件的签名。
WinVerifyTrustEx()
:
此函数没有关联的导入库。您必须使用 LoadLibrary 和 GetProcAddress 函数动态链接到 Wintrust.dll。
WINTRUST_ACTION_GENERIC_CERT_VERIFY
仅验证证书链。这仅在 WinVerifyTrust 输入结构中传入证书上下文时有效。
注意:我们不建议使用此功能进行证书验证。要执行证书验证,请使用 CertGetCertificateChain 和 CertVerifyCertificateChainPolicy 函数。如果信任提供者验证指定操作的主题是受信任的,则返回值为 ERROR_SUCCESS。否则,该函数会从信任提供者返回状态代码。
作为测试,我采用了列出的示例程序WinVerifyTrust()
并将其改为使用WinVerifyTrustEx()
。它与任一 API 调用都给出相同的结果。
如果有人熟悉这两个功能并知道它们之间的真正区别,任何见解将不胜感激!