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
입력하신 내용을 확인하십시오. 내 질문을 호출 코드로 업데이트했습니다. –
@DanielPersson recvLen 매개 변수의 형식을 변경하는 것만으로는 충분하지 않습니다. ** 상호 운용성 코드 **의 영향을받는 모든 부분의 유형을 변경해야합니다. SCardTransmit 메서드에 대해 구체적으로 말하면 적어도 변경해야하는 sendLen 매개 변수가 있습니다. SCardIoRequest 회원도 마찬가지입니다. – jariq