CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gasparini
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.09.2012 (Чт) 14:42

CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Gasparini » 14.11.2012 (Ср) 16:21

Код: Выделить всё
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


На некоторых машинах с ОС Windows XP — Vista — Seven (не зависит от разрядности и версии) при вызове CryptAcquireContext возвращает ноль.
GetLastDllError говорит об ошибке 127.
MSDN говорит, что 127 - это: ERROR_PROC_NOT_FOUND 127 (0x7F): The specified procedure could not be found.

Пример вызова:
Код: Выделить всё
'Обозначения, отметил здесь чтобы понятно было, что передаётся
Key_Container = "Test"
Service_Provider = "Microsoft Base Cryptographic Provider v1.0"
PROV_RSA_FULL = 1
'Вызов
if CryptAcquireContext(hCryptProv, Key_Container, Service_Provider, PROV_RSA_FULL, 0) = 0 then MsgBox Err.GetLastDLLError 'Выдаст MsgBox "127" в проблемных случаях


Весь гугл прогулил и голову сломал, скорее всего туплю, но не могу понять, что означает данная ошибка в моем случае?
На большинстве машин код работает и как на зло - на моей тоже.
Только завтра смогу попасть на проблемные машины, сейчас вот пытаюсь повторить ошибку на своей.
Возникло предположение, что на тех машинах нарушена работа службы криптографии.
Отключал "Службы криптографии", пытался regsvr32.exe /u косвенные библиотеки криптографии, чтобы понять в этом ли проблема.
Все как на зло работает, кажется, что я не в ту степь лезу.
Ни у кого мыслей нету или может кто-нибудь сталкивался с подобной проблемой?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Хакер » 14.11.2012 (Ср) 16:59

Ну так а сама функция CryptAquireContext в экспортах у advapi32 на проблемных машинах есть?
Нужно взять отладчик и посмотреть, доходит ли дело до вызова этой функции, и же всё обламывается на GetProcAddress.

Просто первым делом нужно смотреть документацию по CryptAquireContext в MSDN и обращать там внимание на то, какие коды ошибок может выставить CryptAquireContext. Поскольку среди перечисленных кодов там нет кода 127, делаем вывод, что 127 выставляет скорее всего не CryptAquireContext, а GetProcAddress, вызванная из рантаймовой DllFunctionCall, обслуживающей самый первый вызов этой API-функции (вернее резолвинг ячейки таблицы отложенного импорта VB).

Соответственно, GetProcAddress не находит запрошенную функцию («CryptAquireContext») и выставляет код ERROR_PROC_NOT_FOUND.

С каких щей GetProcAddress не может найти эту функцию там, где она в принципе должна быть — это уже отдельная история. Нужно посмотреть сперва есть ли такая сущность в таблице экспорта advapi32.dll на целевых машинах. Если она там есть, у меня есть куча версий сценариев того, почему может быть, что функция там есть, а GetProcAddress её не находит.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gasparini
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.09.2012 (Чт) 14:42

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Gasparini » 14.11.2012 (Ср) 19:00

Завтра же, как только появится доступ к одной из проблемных машин - проверю есть ли CryptAcquireContext в местной advapi32.dll.
Но что-то подсказывает мне, что есть.
Она должна там быть.

Хакер, не могли бы вы, забегая вперёд, высказать свои версии сценариев почему функция есть, а GetProcAddress её не находит?
Это очень поможет мне.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Хакер » 14.11.2012 (Ср) 20:23

Ну вообще-то я немного сглупил. Я думал у тебя On Error Resume Next — в этом случае мы бы не получили «Can't find DLL entry point CryptAquireContext in advapi32», но я чего-то предположил, что в этом случае LastDllError будет содержать этот код.

На самом деле, конечно, нет.

И функцию CryptAcquireContext искать не надо, она точно есть. Это она внутри себя пытается вызвать GetProcAddress, и это внутри ней такой вызов обламывается и код ошибки в конечном счёте приходит тебе.

Решение простое: поставить брекпоинт на GetProccAddress (желательно условный) и посмотреть, что же ищет и чего не находит наша проблемная функция.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.11.2012 (Чт) 7:48

Gasparini писал(а):На некоторых машинах с ОС Windows XP — Vista — Seven (не зависит от разрядности и версии) при вызове CryptAcquireContext возвращает ноль.

А от наличия админских прав у пользователя случайно не зависит?

Gasparini
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.09.2012 (Чт) 14:42

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Gasparini » 15.11.2012 (Чт) 11:26

Программа работает только при наличии админских прав.
Так что это исключено.

К сожалению сегодня не удалось попасть на проблемные машины, попасть удастся только завтра утром.

Ещё один момент:
Я тут думал пока жду доступа к проблемной машине.
Мне кажется, что эта проблема вроде возникла после того, как в очередной версии началось использование функции Wow64DisableWow64FsRedirection http://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365743(v=vs.85).aspx в x64 версиях ОС.

Эта функция необходима по ряду причин для работы программы на x64 системах, поскольку программа довольно тесно работает с системой и без ее использования даже банальная функция PathFileExists может выдать результат отличающийся от реального, поскольку в некоторых случаях сработает перенаправление 32-битных приложений в целях совместимости.

При использовании этой функции всё работает корректно.
Но кажется (мое предположение), что проблемы начались после ее использования.

При доступе к проблемной машине, попробую убрать её и проверить работоспособность.
Мысль, что в x64 системах advapi32.dll лежит и в "\system32" и в "\SysWOW64" для разных типов приложений.
И работа идет не с той библиотекой, хотя в таком случае вызов функции вполне должен рушить приложение.
Да и все другие API-функции работают без проблем, маловероятно, но все таки проверю.

Gasparini
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.09.2012 (Чт) 14:42

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Gasparini » 15.11.2012 (Чт) 11:27

Начальство ругается, 4-ый день не могу пофиксить - беда :(

Gasparini
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.09.2012 (Чт) 14:42

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Gasparini » 16.11.2012 (Пт) 13:53

Сегодня попал буквально на несколько минут за проблемный компьютер (человек уже уходил).
Успел поставить среду VB6.
В среде IDE код работает.
В скомпилированном видел та же ошибка.
Кроме CryptAcquireContext в скомпилированном виде не может выполнить ни одну функцию связанную с провайдерами криптографии, например CryptEnumProviders.
Т.е. даже получить список доступных провайдеров криптографии не получается.
Бред какой-то.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Хакер » 16.11.2012 (Пт) 14:01

Блин, ну я же русским языком сказал, что нужно делать. При этом я не говорил, что нужно ставить среду. Не нужно было ставить среду.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gasparini
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.09.2012 (Чт) 14:42

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Gasparini » 16.11.2012 (Пт) 14:27

Я с дебаггерами ни разу в жизни не работал :(
Боюсь за отведенное время я просто бы не разобрался как отловить ошибку с помощью отладчика.
Завтра будет больше времени за этой машиной, попробую с отладчиком.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: CryptAcquireContext и ошибка 127 (ERROR_PROC_NOT_FOUND)

Сообщение Хакер » 16.11.2012 (Пт) 14:32

Gasparini писал(а):с отладчиками ни разу в жизни не работал

Это должно быть не причиной, чтобы им не пользоваться, а поводом, чтобы наконец воспользоваться.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот] и гости: 34

    TopList