標準の PKCS#11 を使用してスマート カードにアクセスするアプリケーションを開発しています。現時点では、アプリケーションは Ubuntu と OS X の両方で非常にうまく機能しています。現在、Windows に移植していますが、実行時にリンクされている pkcs#11 ライブラリから関数を呼び出すたびに、「アクセス違反」例外が発生します。 .
以下に、コードの SSCCE を再現しようとしました (例外が発生している場所はコメントで識別されます)。
void * libraryHandle = NULL;
CK_RV rv;
CK_C_GetFunctionList pC_GetFunctionList;
CK_FUNCTION_LIST_PTR functions;
libraryHandle = LoadLibrary(L"C:\\WINDOWS\\system32\\pteidpkcs11.dll");
if (libraryHandle == NULL)
{
printf("Library not loaded\n");
exit(1);
}
pC_GetFunctionList = (CK_C_GetFunctionList) GetProcAddress((HMODULE)libraryHandle, "C_GetFunctionList");
if (pC_GetFunctionList == NULL)
{
printf("Function not loaded\n");
FreeLibrary((HMODULE)libraryHandle);
exit(1);
}
rv = (*pC_GetFunctionList) (&functions);
assert(rv == CKR_OK);
printf("Point A\n");
if(functions == NULL)
{
printf("Functions not loaded\n");
FreeLibrary((HMODULE)libraryHandle);
exit(1);
}
printf("%u - %u\n",functions->version.major, functions->version.minor); // Prints without problems
rv = (*functions->C_Initialize) (NULL_PTR); //THIS IS THE PLACE WHERE I AM GETTING THE ACCESS VIOLATION
assert(rv == CKR_OK);
//printf("Point B\n");
FreeLibrary((HMODULE)libraryHandle);
アプリケーションをデバッグすると、構造「CK_FUNCTION_LIST_PTR functions」が有効なようです。
この例外の原因を知っている人はいますか?
Visual Studio 2010 Ultimate と Windows XP SP3 を使用しています。
ありがとう!
(PS:ライブラリから「GetProcAddress」を使用して関数「C_Initialize」をロードしようとしましたが、うまくいきました)
- - 編集
CK_FUNCTION_LIST 定義
struct CK_FUNCTION_LIST {
CK_VERSION version; /* Cryptoki version */
/* Pile all the function pointers into the CK_FUNCTION_LIST. */
/* pkcs11f.h has all the information about the Cryptoki
* function prototypes. */
#include "pkcs11f.h"
};