0

我正在为 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()的调用,调用堆栈基本上被清除了。

4

0 回答 0