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