3

標準の 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"

};

完全なヘッダー: http://www.rsa.com/rsalabs/node.asp?id=2133

4

1 に答える 1

0

CK_FUNCTION_LIST_PTRそのイメージから、実行可能ファイルとDLLの間の構造のレイアウトに何らかの不一致があるように見えます。実行可能ファイルとDLLの両方が同じコンパイラ設定などでコンパイルされていることを確認してください。

の定義(周囲のプラグマ/マクロを含む)はCK_FUNCTION_LIST_PTR何ですか?sizeof(CK_FUNCTION_LIST_PTR)実行可能ファイルとDLL内(たとえば)の両方からその値を出力する場合も同じですかC_GetFunctionList()

于 2012-08-16T18:59:00.410 に答える