我正在写在C一些WINHTTP代码我送过SSL请求,并以处理SSL错误,我注册WINHTTP_STATUS_CALLBACK function,通过使用设置为WINHTTP_CALLBACK_STATUS_SECURE_FAILURE的dwNotificationFlags调用WinHttpSetStatusCallback。澄清WINHTTP_STATUS_CALLBACK功能的使用,对SSL状态代码
为WINHTTP_STATUS_CALLBACK文档说,当回调与dwInternetStatus
= WINHTTP_CALLBACK_STATUS_SECURE_FAILURE调用,则表明在检索来自服务器的安全套接字层(SSL)证书遇到
一个或多个错误。 lpvStatusInformation参数包含一个标志。有关更多信息,请参阅lpvStatusInformation的说明。
现在,lpvStatusInformation
参数被输入为LPVOID。但是我从文档中的这个陈述中了解到,在WINHTTP_CALLBACK_STATUS_SECURE_FAILURE的情况下它不被当作指针。
为lpvStatusInformation
的医生说:
如果dwInternetStatus参数WINHTTP_CALLBACK_STATUS_SECURE_FAILURE,这个参数可以是下列值之一。
...而这些值是这些十六进制值之一:1,2,4,8,10,20,40。 (见WinHttp.h)
这对我来说似乎很清楚。我不应该去引用指针来获取值。 lpvStatusInformation
保存十六进制值,而不是指针。
我解释正确吗?
我已经写了我的代码,它已经工作在过去。我认为!但是现在我得到0x0104f288的lpvStatusInformation
。这不像任何这些十六进制值。通过OR'可能的值来创建这个值也是不可能的(尽管doc没有提到同一个DWORD中的多个状态项)。它确实看起来像一个指向我的指针。当我去掉指针时,我得到0x8,这对应于WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA
,这至少是合理的。
问题是,我应该去引用那个指针吗?
这里的回调代码:
void CALLBACK Iirf_WinHttpSslStatusCallback(HINTERNET hInternet,
DWORD_PTR context,
DWORD code,
void * pInfo,
DWORD infoLength)
{
if (code == WINHTTP_CALLBACK_STATUS_SECURE_FAILURE) {
ConfigInfo * cfg = (ConfigInfo *) context; // app-specific structure
DWORD details = (DWORD) pInfo; // do not de-reference??
CHAR buffer[32];
CHAR * statusDescription = NULL;
switch (details) {
case WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED:
statusDescription = "CERT_REV_FAILED";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT:
statusDescription = "INVALID_CERT";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED:
statusDescription = "CERT_REVOKED";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA:
statusDescription = "INVALID_CA";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID:
statusDescription = "CERT_CN_INVALID";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID:
statusDescription = "CERT_DATE_INVALID";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR:
statusDescription = "SECURITY_CHANNEL_ERROR";
break;
default:
statusDescription = buffer;
sprintf_s(buffer, 32, "stat(0x%08X) len(%d)",
details, infoLength);
break;
}
LogMessage(cfg, 1, "SslStatusCallback: %s", statusDescription);
}
}