管理対象コードと非管理対象コードの両方を持つC++ CLRプロジェクトがあります。このプロジェクトでは、私はcryptoprovidersのリストをループし、適切なものを探します。"Aloaha Cryptographic Provider"のC++ CLRでCryptAcquireContextAが失敗する
だから私は、関数を使用
CryptEnumProvidersA
CryptAcquireContextA
私はC++プロジェクトを使用してC#プロジェクトを持っています。 メソッドを呼び出して、cryptoprovidersのリストを2回ループすると、アプリケーションがクラッシュします。そして、それはCryptAcquireContextAでクラッシュします。 「Aloaha Cryptographic Provider」のみ。
私はデバッグモードを使用すると、クラッシュします。 しかし、私はデバッグモードを使用してブレークポイントを設定し、F10でコードを渡すと正常に動作します。
プロジェクトを分離するためにC++コードを実行すると、すべての場合に正常に動作します。
ここに2つの質問があります。
1)どのようにクラッシュする可能性がありますか?なぜそれが起こるのですか?
2)CryptAcquireContextAをコールして、このようなクラッシュを処理するにはどうすればよいですか?
私の検討事項。
1)メモリのトラブル。私はメモリリークを探していたが、何も見つからなかった。
2)try-catchを使用しようとしましたが、結果がなくてもCryptAcquireContextAがクラッシュします。私は "CryptIsValidProvider"や "CryptPingProvider"のような関数を使いたいのですが、見つけられませんでした。
プロバイダーが見つかった後に「スリープ」を入れ、コードが正常に機能します。それは本当に競争状態のように見えます。さて、それを扱うよりエレガントな決定がありますか?私は 'CryptAcquireContextA'の後に 'CryptReleaseContext'を使用します。しかし、 'CryptReleaseContext'はハンドルや他の何かを即座に解放しないので、次の呼び出しで 'CryptAcquireContextA'が失敗するようです。 – Stanislav
あなたはそのCSPの開発者に苦情を言い渡すことができますが、注意を払っても、すべてのユーザが最新のパッチ適用バージョンを確実に得ることができない限り、ほとんどの場合、スリープコールが必要です。 'Sleep'コールがなぜ存在するのかという詳細なコメントを残すようにしてください。メンテナンス中に誰かがそれを削除しないようにしてください。 –
「Aloaha Cryptographic Provider」の場合、「CryptAcquireContextA」がcryptoproviderにNULLハンドルを返すことを発見しました。したがって、handleがNULLの場合、Sleepを呼び出すことです。ありがとう。 – Stanislav