首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >澄清WINHTTP_STATUS_CALLBACK函数的用法,用于SSL状态代码

澄清WINHTTP_STATUS_CALLBACK函数的用法,用于SSL状态代码
EN

Stack Overflow用户
提问于 2011-01-06 18:05:22
回答 1查看 6.7K关注 0票数 4

我正在用C编写一些WinHttp代码,我通过SSL发送请求,为了处理SSL错误,我通过调用WinHttpSetStatusCallback (将dwNotificationFlags设置为WINHTTP_CALLBACK_STATUS_SECURE_FAILURE )注册了一个dwNotificationFlags。

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,则此参数可以是下列值之一。

...And这些值是这些十六进制值之一: 1,2,4,8,10,20,40。(见WinHttp.h)

我觉得这很清楚。我不应该为了得到值而取消引用指针。lpvStatusInformation保存十六进制值,而不是指针。

我解释得对吗?

我用这种方式编写了我的代码,而且它在过去也起过作用。我认为!然而,现在我得到了0x0104f288的lpvStatusInformation。这一点都不像那些十六进制值。也不可能通过OR‘in可能的值来创建这个值(尽管文档没有提到同一个DWORD中的多个状态项)。对我来说确实是个指针。当我删除指针时,得到0x8,它对应于WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA,这至少是有意义的。

问题是,我是否应该取消引用那个指针?

以下是回调代码:

代码语言:javascript
运行
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-17 22:53:26

医生们有点误导人。lpvStatusInformation是指向标志值的指针。我们一直将其转换为DWORD*并取消引用它,我们得到的值与文档中的标志值匹配。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4618121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档