优化选项和windows dll调用的使用

时间:2017-10-25 18:46:28

标签: windows visual-studio makefile cng

我正在使用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似乎已定义:

定义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(),调用堆栈基本上被清除。

0 个答案:

没有答案