【问题标题】:Windows CryptAcquireContext API failing with error code 127Windows CryptAcquireContext API 失败,错误代码为 127
【发布时间】:2019-06-22 17:43:45
【问题描述】:

错误 127 是“ERROR_PROC_NOT_FOUND”(“找不到指定的过程”)。

我正在运行带有远程桌面服务的 Citrix XenApp 的 Windows Server 2016 上运行。 CryptAcquireContext API 位于 advapi32.dll 中。我在上面运行了 Microsoft 的 Depends32.exe,函数 CryptAcquireContextA 和 CryptAcquireContextW 在 DLL 文件中肯定。所有加密 api 函数似乎都发生了同样的错误。我测试了 CryptDestroyHash,它还返回错误 127 (ERROR_PROC_NOT_FOUND)。

这是我的 C++ 代码:

    HCRYPTPROV hProv = 0;
    BOOL bCryptAcquireContext = CryptAcquireContext(&hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0);
    dwError = GetLastError();

这个 C++ 可以在 EXE 中工作,但如果将相同的代码放入从 VB6 调用的 DLL 中,它就不起作用。几乎就像任何 vb6 应用都被这些 API 屏蔽了一样?

这是VB6代码:

Private Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" (ByRef phProv As Long, ByVal pszContainer As String, ByVal pszProvider As String, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
Private Sub Form_Load()
    Dim sProvider As String
    Dim rv as Long
    Dim sContainer As String
    Dim m_lProvider As Long
    Const PROV_RSA_FULL = 1
    Const CRYPT_VERIFYCONTEXT  As Long = &HF0000000
    Const MS_DEF_PROV As String = "Microsoft Base Cryptographic Provider v1.0"
    sProvider = MS_DEF_PROV & vbNullChar
    sContainer = vbNullChar
    rv = CryptAcquireContext(m_lProvider, 0, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)
    dwError = Err.LastDllError

    If rv = 0 and dwError <> 127 Then
        rv = CryptAcquireContext(m_lProvider, 0&, ByVal sProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET)
    End If
End Sub

【问题讨论】:

  • 在GetLastError之前检查BOOL返回值了吗?
  • 是的,FALSE (0),表示函数失败。
  • 调试它,看看 GetProcAddress 失败的地方。
  • 你甚至可以使用 Dependency Walker;尝试记录功能...
  • 这些工作:lb = LoadLibrary("advapi32.dll") / pa = GetProcAddress(lb, "CryptAcquireContextA"),但是当我从 Declare 语句中调用 CryptAcquireContext 时,它失败了。如何在 loadlibrary 和 getprocaddress 之后直接调用 CryptAcquireContextA?

标签: windows api cryptography vb6 citrix


【解决方案1】:

您将 Long 传递给您定义为字符串的参数 (pszContainer):

Private Declare Function CryptAcquireContext Lib "advapi32.dll" _
   Alias "CryptAcquireContextA" _
   (ByRef phProv As Long, ByVal pszContainer As String, _
   ByVal pszProvider As String, ByVal dwProvType As Long, _
   ByVal dwFlags As Long) As Long

rv = CryptAcquireContext(m_lProvider, 0, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)

试试这个(也适用于 CryptAcquireContext 的第二次调用):

rv = CryptAcquireContext(m_lProvider, vbNullString, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)

【讨论】:

  • 两种方法我都试过了。它接受两者,但我得到一个 127,这意味着找不到 API。
【解决方案2】:

我可以说我在客户机器上观察到了类似的问题(错误代码 127 - ERROR_PROC_NOT_FOUND - 由 CryptAcquireContextA Windows API 函数设置)。谷歌搜索将我带到了讨论相同问题的http://tracker.firebirdsql.org/browse/CORE-6154 页面。该页面称该问题“已通过 Windows Update 更新 Windows Server 2016 得到解决”。与我合作的客户报告说,安装 Windows 更新后问题就消失了。

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2021-09-08
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多