Сбой API Windows CryptAcquireContext с кодом ошибки 127 - PullRequest
0 голосов
/ 22 июня 2019

Ошибка 127: «ERROR_PROC_NOT_FOUND» («Указанная процедура не найдена»).

Я работаю на Windows Server 2016 под управлением Citrix XenApp со службами удаленных рабочих столов. CryptAcquireContext API находится в advapi32.dll. Я запустил на нем файл Microsoft Depends32.exe, и функции CryptAcquireContextA и CryptAcquireContextW равны определенно в файле DLL. Похоже, такая же ошибка происходит со всеми функциями crypto 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, но если тот же код помещается в DLL, которая вызывается из VB6, он не работает. Как будто любое приложение 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

1 Ответ

0 голосов
/ 28 июня 2019

Вы передаете 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)

Попробуйте вместо этого (также для 2-го вызова CryptAcquireContext):

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