2011-01-06 178 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 *並將其解除引用,並且我們得到的值與文檔中的標誌值相匹配。