2012-02-03 117 views
2

私はMicrosoft SmartCard APIsを使用しているSCM非接触型RFIDカードリーダーで作業しています。SCardTransmit()は常にエラーを返します

スマートカードとineractする通常のプロセス、私は理解しているものを、次のとおりです。
1. SCardEstablishContextを使用してコンテキストを確立()
2.リストのすべての読者は、SCardListReaders()
を使用してシステムに接続されています3.リーダーを選択し、カードが挿入されるのを待ちます。
4.カードが検出されると、SCardGetStatusChange()関数が戻ります。
5. SCardConnectを(使用して、選択した読者によるカードに接続)
6.話しSCardTransmitを(使用してカードに)

5までのすべてのステップは、私が正しいカードのハンドルを得たことを意味して正常に動作しています。交渉されたプロトコルと正しいカードのATRを返すSCardStatus()関数を発行することによって、カードをさらに検証することができます。しかし、SCardTransmit()を使用してAPDUコマンドを送信しようとすると、エラー(エラーコード14、SCARD_E_CANT_DISPOSEと思われます)が返されます。

何が間違っているのか、何が欠けているのかわかりません。私は、例えば、 {0xFF、0xCA、0x00、0x00、0x00}を発行してカードUIDを読み取る非常に基本的なAPDUです。私はSCM TestResManデバッグツールを使用してこのAPDUを確認し、私にカードの正しいUIDを返します。 MiFARE 1kカードとSCM非接触SCL011リーダーを使用しています。

下記のSCardTransmit()コードスニペットが見つかりました(すべての以前の関数が成功を返しました)。

SCARD_IO_REQUEST sioreq; 
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1 
sioreq.cbPciLength = 8; 

SCARD_IO_REQUEST rioreq; 
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1 
rioreq.cbPciLength = 8; 

byte sendbuffer[256], receivebuffer[256]; 
ULONG sendbufferLen, receivebufferLen, sizeofUID; 

sendbuffer[0] = 0xFF; // CLA - Instruction Class 
sendbuffer[1] = 0xCA; // Instruction code 
sendbuffer[2] = 0x00; // P1 - 1st parameter 
sendbuffer[3] = 0x00; // P2 - 2nd parameter 
sendbuffer[4] = 0x00; 
sendbufferLen = 0x05; 

retval = objScWrapper->SCardTransmit(hCardHandle, &sioreq, sendbuffer, 
            sendbufferLen, NULL, receivebuffer, 
            &receivebufferLen); 


TIA ...誰もが任意の手掛かりまたはポインタを持っている場合は私に知らせてください!ほとんどの部分について

答えて

0

はこちらからよさそうだ...あなたは私たちがどこでも得ることができるかどうかを確認するために質問に答えることができますカップルの質問...

1)あなたがに接続されている/ SCardConnect wを接続する場合排他、共有、または直接アクセス? 2)カードに接続するときに、カードが接続されているプロトコルがT1ですか。 3)SCARD_IO_REQUESTの目的は何ですか?このオブジェクトが使用されていないサンプルの行? 4)API呼び出しを行うためにラッパーを経由しているのがわかります。あなたはラッパーの内部SCardTrasmit実装を共有できますか?

この回答は、更新された質問に基づいて編集します。

4

受信バッファサイズは256バイトですが、256バイト(Le = 00h)を要求しており、受信バッファにもステータスワード(2バイトのSW1とSW2)が必要です。

あなたの14エラーコードは、受信バッファ用の汎用OUT_OF_MEMORYだと思います。

コマンドバッファーも5バイトヘッダー+最大255バイトのコマンドデータに収まらないほど小さすぎます。もちろん、どちらも長さの長いADPUを処理するには小さすぎます。

Windowsは現在、PCSC互換リーダーのスマートカードリーダーのバッファサイズに関してはかなり厄介です。コマンドバッファには少なくとも5 + 255 = 260バイト、受信バッファには256 + 2バイトを使用してください。バッファを再利用するか、バッファを安全に廃棄してください。そうしないと、メモリリークが発生します。

関連する問題