我正在使用make.exe使用cl.exe为Windows构建一个dll。我正在使用VS2015 ..这个dll使用CNG(bcrypt)进行加密操作,而bcryptr是使用loadlibrary调用动态加载的。
当我使用/ Od选项构建以禁用优化时,我对任何功能都没有任何问题。但如果我使用任何优化选项/ O1,/ O2,/ Ox,我看到最奇怪的事情发生..一旦我使用GetProcAddress检索bcrypt函数的地址,如BCryptGetFipsAlgorithmMode,然后我调用该函数ptr,调用栈就消失了。当调用函数尝试返回时,这会导致异常..它看起来几乎就像当一个调用回调时没有CALLBACK前缀,但我没有看到连接..
bcrypt函数的原型如下所示:
NTSTATUS WINAPI BCryptGetFipsAlgorithmMode(__out BOOLEAN * pfEnabled)
和WINAPI似乎已定义:
我有什么遗失的吗?优化与此有什么关系?
任何帮助将不胜感激..谢谢!
下面是代码:
NTSTATUS GetFipsAlgorithmMode(BOOLEAN *pfEnabled )
{
FARPROC pBCryptGetFipsAlgorithmMode = NULL;
NTSTATUS (*_BCryptGetFipsAlgorithmMode)( __out BOOLEAN *);
NTSTATUS status = SPGC_ERR_LIBRARY_ADDRESS_LOOKUP_FAILURE;
if(g_hBCRYPTDLL != NULL)
{
pBCryptGetFipsAlgorithmMode = GetProcAddress(g_hBCRYPTDLL, _T("BCryptGetFipsAlgorithmMode"));
if(pBCryptGetFipsAlgorithmMode != NULL)
{
_BCryptGetFipsAlgorithmMode = (NTSTATUS (*)( __out BOOLEAN *)) pBCryptGetFipsAlgorithmMode;
status = _BCryptGetFipsAlgorithmMode(pfEnabled);
}
}
return status;
}
逐步调用_BCryptGetFipsAlgorithmMode(),调用堆栈基本上被清除。