CryptAcquireCertificatePrivateKey得到的hCryptProv到底要不要释放?

Tommy Tommy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
BOOL WINAPI CryptAcquireCertificatePrivateKey(
PCCERT_CONTEXT pCert,
DWORD dwFlags,
void* pvReserved,
HCRYPTPROV* phCryptProv,
DWORD* pdwKeySpec,
BOOL* pfCallerFreeProv
);

在MSDN中说明了如果×pfCallerFreeProv是TRUE,就要调用CryptReleaseContext()释放hCryptProv,但是我看MSDN中的例子Example C Program: Sending and Receiving a Signed and Encrypted Message是不释放的,而我试了,如果释放的话,会出现“capi2.exe 中的 0x02ff2215 处最可能的异常: 0xC0000005: 读取位置 0xfeeeff06 时发生访问冲突”的错。

如果使用CRYPT_ACQUIRE_CACHE_FLAG标志,则fCallerFreeProv=FALSE,不用释放,但是在调用CertCloseStore时同样会出一样的错。

HCERTSTORE hCertStore = NULL;
if(!(hCertStore=CertOpenStore(CERT_STORE_PROV_SYSTEM,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER ,L"MY")))
{
// printf("open system store failed(errno=%x)\n",GetLastError());
return;
}

PCCERT_CONTEXT pCertContext = NULL;
HCRYPTPROV hProv;
DWORD dwKeySpec=AT_KEYEXCHANGE;
BOOL fCallerFreeProv;

while(pCertContext=CertEnumCertificatesInStore(hCertStore,pCertContext))
{
char subject[256];
if(CertGetNameString(
pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
subject,
sizeof(subject)))
{
printf("subject: %s\n", subject);
}

if(!CryptAcquireCertificatePrivateKey(pCertContext,CRYPT_ACQUIRE_CACHE_FLAG,0,&hProv,&dwKeySpec,&fCallerFreeProv))
{
printf("CryptAcquireCertificatePrivateKey failed(err=%x)",GetLastError());
continue;
}

std::vector<BYTE> provider;
if (!GetProvParam(hProv, PP_NAME, provider))
{
//printf("get provider name failed(err=%x)\n", err);
if(fCallerFreeProv)
CryptReleaseContext(hProv,0);
continue;
}

printf("Provider: %s\n", &provider[0]);

if(!providerName.empty())
{
if(strncmp(providerName.c_str(), (const char *)&provider[0], provider.size())!=0)
{
if(fCallerFreeProv)
CryptReleaseContext(hProv,0);
continue;
}

}

if(fCallerFreeProv)
CryptReleaseContext(hProv,0);

break;
}

if(pCertContext)
CertFreeCertificateContext(pCertContext);

if(hCertStore)
CertCloseStore(hCertStore, CERT_CLOSE_STORE_CHECK_FLAG);

...全文

相关推荐

PFX证书导入

PFX证书导入到USBKEY

vinilla2009

产教融合实训基地与实践中心建设逻辑图-可编辑版

产教融合实训基地与实践中心建设逻辑图-可编辑版

龙猫与奥特曼

idea2025-free.zip

idea2025-free.zip

qq_45190508

sop基于灵敏度分析的有源配电网智能软开关优化配置升级1(Matlab代码实现)

内容概要:本文提出了一种基于灵敏度分析的有源配电网智能软开关(SOP)优化配置方法,旨在应对高比例分布式电源接入带来的电压波动与网络损耗加剧等问题。研究以IEEE33节点系统为算例,通过改进的灵敏度分析模型量化各节点对电压和功率流动的影响程度,进而构建SOP选址与定容的优化模型,实现降低网损、改善电压分布及提升系统运行灵活性的目标。全文详细阐述了灵敏度指标的数学推导、目标函数与约束条件的建模过程,并基于Matlab实现了完整的仿真求解流程,具备良好的工程实用性与学术参考价值。; 适合人群:电力系统及其自动化、电气工程等相关专业的硕士博士研究生、科研机构研究人员,以及从事智能配电网规划、运行与优化的工程技术人员。; 使用场景及目标:①研究分布式电源大规模接入背景下配电网的主动调控与优化策略;②指导智能软开关在实际配电网中的科学选址与容量配置;③为相关科研课题提供可复现的仿真案例,支撑学术论文撰写与算法验证。; 阅读建议:建议读者结合提供的Matlab代码与IEEE33节点标准模型进行动手实践,重点理解灵敏度指标的物理意义及其在优化模型中的应用逻辑,关注求解过程中的约束设置与算法收敛性,并可进一步拓展至SOP与储能联合配置、多时间尺度优化等复杂场景进行二次开发与研究。

荔枝科研社

Ubuntu安装Latex

关于Ubuntu安装Latex的详细记录和排错指南

Leers Ting
评论 1
收藏 已收藏
分享
返回顶部
Tommy
硬件/系统 2,644 成员 17,229 内容