2014-04-11 1 views
1

winscard/pcsclite를 사용하여 스마트 카드와 통신하는 .Net 콘솔 응용 프로그램이 있습니다. Windows 및 32 비트 Linux에서는 문제없이 작동하지만 64 비트 Linux에서는 실패합니다. SCardTransmit 함수는 0을 반환하지만 RecvLength는 업데이트되지 않고 데이터가 수신되지 않습니다.64 비트 Linux에서 모노를 사용하여 pcsclite 호출

업데이트 :

문제는 SCardTransmit 함수 호출 것 같다. Dllimport는 다음과 같이 지정됩니다. 동일한 결과를 사용하여 recvLen을 IntPtr로 지정하려고했습니다.

[StructLayout(LayoutKind.Sequential)] 
internal struct SCardIoRequest 
{ 
    internal SCardIoRequest(CardProtocol protocol) 
    { 
     Protocol = (uint)protocol; 
     Length = (uint)Marshal.SizeOf(typeof(SCardIoRequest)); 
    } 

    public uint Protocol; 
    public uint Length; 
} 

[DllImport("Winscard.dll", SetLastError = true)] 
private static extern int SCardTransmit(IntPtr card, [In] ref SCardIoRequest sendPci, byte[] sendBuffer, uint sendLen, IntPtr recvPci, [Out] byte[] recvBuffer, ref int recvLen); 

추가 정보 및 로그 : 당신은 당신의 코드를 게시하지 않았다

 
mono version 2.10.8 
pcsc-lite version 1.4.4 

[[email protected] ~]$ mono pcsctest.exe 
Test PC/CS 
SCardEstablishContext - returned 0 
SCardListReaders - returned 0 
SCardListReaders - returned 0 
After GetReaders 
Reader: OmniKey CardMan 6121 00 00 
SCardConnect - returned 0 
Connect to Card, protocol: 2 
SCardTransmit - returned 0 
recvlen = 256 
    Serial: 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
SCardTransmit - returned 0 

winscard_msg_srv.c:217:SHMProcessEventsServer() Common channel packet arrival 
winscard_msg_srv.c:226:SHMProcessEventsServer() SHMProcessCommonChannelRequest detects: 7 
pcscdaemon.c:174:SVCServiceRunLoop() A new context thread creation is requested: 7 
winscard_svc.c:131:ContextThread() Thread is started: 7 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard_svc.c:179:ContextThread() Client is protocol version 2:2 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard.c:242:SCardEstablishContext() Establishing Context: 16985718 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard.c:298:SCardConnect() Attempting Connect to OmniKey CardMan 6121 00 00 using protocol: 2 
prothandler.c:130:PHSetProtocol() Attempting PTS to T=1 
ifdhandler.c:488:IFDHSetProtocolParameters() lun: 0, protocol T=1 
winscard.c:433:SCardConnect() Active Protocol: T=1 
winscard.c:443:SCardConnect() hCard Identity: eaf1 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate 
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7 
winscard.c:253:SCardReleaseContext() Releasing Context: 16985718 
winscard.c:848:SCardDisconnect() Active Contexts: 1 
winscard_msg_srv.c:276:SHMProcessEventsContext() Client has disappeared: 7 
winscard_svc.c:144:ContextThread() Client die: 7 

답변

2

그래서 이것은 단지 추측하지만 문제는 데이터를 관리 사이에 마샬링되는 방법을 지정하여 상호 운용성 코드에있는 것 같습니다 - C# - 관리되지 않는 -C 메모리. 당신은 가장 가능성이 높습니다 famous C 'long' type marshaling problem 나는 또한 멀티 플랫폼 Pkcs11Interop 프로젝트의 개발 중에 발생했습니다.

PCSC API는 .NET에서 모든 플랫폼의 크기와 일치하는 형식이 없으므로 마샬링하기가 매우 어려운 C 'long'형식을 사용합니다. 문제는 C 'long'타입이 일부 플랫폼 (Win32, Win64 및 Unix32)에서 4 바이트 길이가 될 수 있고 동시에 다른 플랫폼 (Unix64)에서 8 바이트 길이가 될 수 있다는 것입니다. .NET에는 'int'타입이 있는데, 플랫폼에 관계없이 4 바이트 길이이며, 플랫폼에 관계없이 8 바이트 길이의 'long'타입이 있습니다. 둘 다 C 'long'유형의 다중 플랫폼 대안으로 사용할 수 없으며 유일한 해결책은 'int'유형의 두 가지 기능과 구조를 사용하고 마샬링하는 것입니다. C 'long'유형 길이가 4 바이트이고 다른 하나는 C 'long'유형이 8 바이트 인 플랫폼의 경우 'long'.NET 유형입니다.

정리하십시오 : 마샬링 코드를 수정해야하며, C 'long'형식이 8 바이트 인 플랫폼도 지원하는 더 나은 관리 PCSC interop 라이브러리를 사용해야합니다. pcsc-sharp처럼 보이지만 아직 테스트하지 않았습니다.

+0

입력하신 내용을 확인하십시오. 내 질문을 호출 코드로 업데이트했습니다. –

+0

@DanielPersson recvLen 매개 변수의 형식을 변경하는 것만으로는 충분하지 않습니다. ** 상호 운용성 코드 **의 영향을받는 모든 부분의 유형을 변경해야합니다. SCardTransmit 메서드에 대해 구체적으로 말하면 적어도 변경해야하는 sendLen 매개 변수가 있습니다. SCardIoRequest 회원도 마찬가지입니다. – jariq

관련 문제