MSDN文档WinVerifyTrust()
和WinVerifyTrustEx()
函数,它们之间的区别是不是很清楚。
除最后一个参数外,function签名是相同的:
LONG WINAPI WinVerifyTrust( _In_ HWND hWnd, _In_ GUID *pgActionID, _In_ LPVOID pWVTData );
HRESULT WinVerifyTrustEx( _In_ HWND hwnd, _In_ GUID *pgActionID, _In_ WINTRUST_DATA *pWinTrustData );
但是, WinVerifyTrust()
的LPVOID pWVTData
参数实际上是WINTRUST_DATA*
,就像WinVerifyTrustEx()
:
pWVTData [in]
作为WINTRUST_DATA结构强制转换的指针包含信任提供程序处理指定操作标识符所需的信息。
我分析了两个文档页面以寻找其他差异,下面是我发现的,忽略了微不足道的差异:
WinVerifyTrust()
:
如果信任提供程序未validation主题是否受指定操作的信任,则该函数会从信任提供程序返回状态代码。 注意返回值是一个长,而不是以前logging的HRESULT。 不要使用诸如SUCCEEDED之类的HRESULTmacros来确定函数是否成功。 相反,检查等于零的返回值。
备注
WinVerifyTrust函数使应用程序能够调用信任提供程序来validation指定对象是否满足指定validation操作的条件。 pgActionID参数标识validation操作,而pWinTrustData参数标识要validation其信任的对象。 信任提供者是在操作系统中注册的DLL。 对WinVerifyTrust的调用会将该调用转发给注册的信任提供程序(如果有的话)支持该指定的操作标识符。
例如,Software Publisher Trust Provider可以validation可执行映像文件来自受信任的软件发布者,并且该文件自发布以来未被修改。 在这种情况下,pWinTrustData参数指定文件的名称和文件types,例如Microsoft便携式可执行文件。
每个信任提供者都支持一组可以评估的特定操作。 每个操作都有一个GUID来标识它。 信任提供者可以支持任意数量的动作标识符,但是两个信任提供者不能支持相同的动作标识符。
有关演示如何使用此函数validation可移植可执行文件(PE) 的签名的示例 ,请参见示例C程序:validationPE文件的签名 。
WinVerifyTrustEx()
:
这个函数没有关联的导入库。 您必须使用LoadLibrary和GetProcAddress函数dynamic链接到Wintrust.dll。
WINTRUST_ACTION_GENERIC_CERT_VERIFY
仅validation证书链。 这只有在WinVerifyTrustinput结构中传递证书上下文时才有效。
注意:我们不build议使用此function来执行证书validation。 要执行证书validation,请使用CertGetCertificateChain和CertVerifyCertificateChainPolicy函数。如果信任提供程序validation主题是否被指定的操作所信任,则返回值为ERROR_SUCCESS。 否则,该函数将返回来自信任提供者的状态码。
作为一个testing,我拿着WinVerifyTrust()
列出的示例程序,并改为使用WinVerifyTrustEx()
。 它与任何API调用都可以得到相同的结果。
如果有人熟悉这两个function,并且知道他们之间真的有什么不同,那么我们将不胜感激!