我正在为 Windows 构建一个 dll,使用 Makefile,使用 cl.exe。我正在使用VS2015 ..这个dll使用CNG(bcrypt)进行加密操作,并且bcryptr是使用loadlibrary调用动态加载的。
当我使用 /Od 选项构建以禁用优化时,我对任何功能都没有问题。但是如果我使用任何优化选项/O1、/O2、/Ox,我会看到最奇怪的事情发生。一旦我使用 GetProcAddress 检索 bcrypt 函数的地址,例如 BCryptGetFipsAlgorithmMode,然后我调用该函数ptr,调用堆栈消失。当调用函数尝试返回时,这会导致异常..看起来几乎就像当一个回调没有 CALLBACK 前缀时,但我没有看到连接..
该 bcrypt 函数的原型如下所示:
NTSTATUS WINAPI BCryptGetFipsAlgorithmMode( __out BOOLEAN *pfEnabled)
和 WINAPI 似乎被定义:
定义 WINAPI __stdcall
有什么我想念的吗?优化与此有什么关系?
任何帮助将不胜感激..谢谢!
继承人的代码:
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()的调用,调用堆栈基本上被清除了。