2011-12-29 68 views
0

我的C++ CLR項目包含託管代碼和非託管代碼。在這個項目中,我循環通過一系列暗示供體並尋找合適的。CryptAcquireContextA在C++ CLR for「Aloaha加密提供程序」中失敗

所以我使用的功能
CryptEnumProvidersA
CryptAcquireContextA

我有一個使用C++項目C#項目。 當我調用該方法循環兩次加密加速器的列表時,我的應用程序崩潰。它在CryptAcquireContextA上崩潰。僅限於「Aloaha密碼提供商」。

當我使用調試模式時,它也崩潰。 但是,當我使用調試模式,設置斷點並通過代碼與F10,它工作正常。

當我執行C++代碼來分離項目時,它在任何情況下都可以正常工作。

所以,我在這裏有兩個問題:
1)如何這樣的崩潰可能?爲什麼會發生?
2)我怎樣才能調用CryptAcquireContextA來處理這樣的崩潰?

我的考慮。
1)記憶有些麻煩。我正在尋找內存泄漏,但我沒有找到任何內存泄漏。
2)我試圖使用try-catch,但沒有結果,CryptAcquireContextA無論如何都崩潰了。我想使用像「CryptIsValidProvider」或「CryptPingProvider」的功能,但我沒有找到它。

回答

0

如果它在單步執行時有效,它可能是一個競爭條件(您在調試器中暫停了足夠長的時間,以便某些其他進程或驅動程序取得進展)。

重要的是你單步完成多少代碼?在CryptAcquireContextA調用還可以正常工作之前是否將Sleep而不是一個斷點?

+0

我找到了提供程序後的'睡眠',代碼工作正常。看起來它確實是競爭狀態。現在,是否有更優雅的決定來處理這個問題? 'CryptAcquireContextA'後使用'CryptReleaseContext'。但似乎'CryptReleaseContext'沒有立即釋放句柄或其他東西,所以'CryptAcquireContextA'在下次調用時失敗。 – Stanislav 2011-12-30 05:51:30

+0

您可以向該CSP的開發者投訴,但即使他們注意了,除非您可以確保所有用戶都擁有最新的補丁版本,否則您很可能不得不通過「睡眠」調用。請務必留下詳細的評論,說明爲什麼「睡眠」電話在那裏,所以有人在維護過程中最終不會將其移除。 – 2011-12-30 07:05:42

+0

我發現在「Aloaha Cryptographic Provider」的情況下,CryptAcquireContextA'向cryptoprovider返回NULL句柄。所以我的決定是如果句柄爲NULL,則調用'Sleep'。謝謝。 – Stanislav 2011-12-30 09:24:14

相關問題