2011-12-29 4 views
0

У меня есть проект C++ CLR с управляемым и неуправляемым кодом. В этом проекте я просматриваю список криптопровайдеров и ищу подходящий.CryptAcquireContextA терпит неудачу в C++ CLR для «Поставщика криптографии Aloaha»

Поэтому я использую функцию
CryptEnumProvidersA
CryptAcquireContextA

У меня есть C# проекта, который использует проект C++. Когда я вызываю метод циклически перебирать список криптопровайдеров дважды, мое приложение падает. И он падает на CryptAcquireContextA. И только на «Aloaha Cryptographic Provider».

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

Когда я выполняю код на C++ для разделения проекта, он отлично работает во всех случаях.

Итак, у меня есть два вопроса:
1) Как такая авария возможна? И почему это происходит?
2) Как я могу вызвать CryptAcquireContextA для обработки такого сбоя?

Мои соображения.
1) Некоторые проблемы с памятью. Я искал утечки памяти, но я не нашел.
2) Я попытался использовать try-catch, но без результата CryptAcquireContextA все равно сработает. Я хотел бы использовать функцию типа «CryptIsValidProvider» или «CryptPingProvider», но я ее не нашел.

ответ

0

Если это работает при одношаговом режиме, это, вероятно, условие гонки (вы приостановлены в отладчике достаточно долго, чтобы какой-то другой процесс или драйвер достигли прогресса).

Имеет ли значение, сколько кода вы выполняете на одном шаге? Помещает ли Sleep вместо точки останова прямо перед вызовом CryptAcquireContextA?

+0

Я положил «Сон» после того, как поставщик найден, и код работает нормально. Похоже, это действительно состояние гонки. Теперь, есть ли более элегантное решение справиться с этим? Я использую 'CryptReleaseContext' после 'CryptAcquireContextA'. Но похоже, что «CryptReleaseContext» не освобождает дескриптор или что-то еще сразу, поэтому «CryptAcquireContextA» терпит неудачу при следующем вызове. – Stanislav

+0

Вы можете пожаловаться разработчику этого CSP, но даже если они обратят внимание, вам, скорее всего, придется отправить вызов «Сон», если вы не сможете гарантировать, что все ваши пользователи будут иметь последнюю исправленную версию. Не забудьте оставить подробный комментарий, почему существует вызов 'Sleep', поэтому кто-то не удаляет его во время обслуживания. –

+0

Я обнаружил, что в случае «поставщика криптографии Aloaha» 'CryptAcquireContextA' возвращает NULL-дескриптор криптопровайдеру. Поэтому мое решение - вызвать «Сон», если дескриптор NULL. Благодарю. – Stanislav