2011-01-06 181 views
3


我正在写在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); 
    } 
} 

回答

6

的文档是有点误导。 lpvStatusInformation是一个指向标志值的指针。我们已经将它转换为DWORD *并将其解除引用,并且我们得到的值与文档中的标志值相匹配。