智能卡 Reader,无法读取某些卡
Smart Card Reader, can't read some cards
我有一个应用程序使用智能卡 reader 允许用户访问部分系统。在一个地方我没有问题。但是另一个,拥有不同类型卡的制造商有很多问题。它不断得到一个 id 为零的返回。然后查看事件日志我看到了这个:
这是代码:
card.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1);
var apduGetID = new APDUCommand(0xFF, 0xCA, 0, 0, null, 4);
var apduRespGetID = card.Transmit(apduGetID);
long cardId = BitConverter.ToUInt32(apduRespGetID.Data.Reverse().ToArray(), 0);
第二个问题是,然后尝试调试代码,它运行完美,只有删除断点才能看到问题,但看不到问题所在。有人可以帮帮我吗?
P.S。我找到了这个线程,但它不起作用:https://superuser.com/questions/715688/smart-card-errors
更新:这里是传输class
public override APDUResponse Transmit(APDUCommand ApduCmd)
{
var RecvLength = (uint)(ApduCmd.Le + APDUResponse.SW_LENGTH);
byte[] ApduBuffer;
var ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH];
var ioRequest = new SCard_IO_Request
{
m_dwProtocol = m_nProtocol,
m_cbPciLength = 8
};
// Build the command APDU
if (ApduCmd.Data == null)
{
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)];
if (ApduCmd.Le != 0)
{
ApduBuffer[4] = ApduCmd.Le;
}
}
else
{
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length];
for (var nI = 0; nI < ApduCmd.Data.Length; nI++)
{
ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI];
}
ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte)ApduCmd.Data.Length;
}
ApduBuffer[0] = ApduCmd.Class;
ApduBuffer[1] = ApduCmd.Ins;
ApduBuffer[2] = ApduCmd.P1;
ApduBuffer[3] = ApduCmd.P2;
m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength);
if (m_nLastError != 0)
{
var msg = "SCardTransmit error: " + m_nLastError;
throw new SmartCardException(msg, m_nLastError);
}
var apduData = new byte[RecvLength];
for (var nI = 0; nI < RecvLength; nI++)
{
apduData[nI] = ApduResponse[nI];
}
return new APDUResponse(apduData);
}
更新 2:我也试过放一些 Thread.Sleep()
请检查您在第二台机器上是否安装了所有最新的智能卡驱动程序。此外,有时将制造商提供的驱动程序替换为 "Microsoft WUDF driver" - https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85).aspx
会有所帮助
请注意,插入时 OS 会检测到两种类型的设备 - 智能卡枚举器设备(智能卡 reader)和智能卡(有时称为智能卡容器)本身。一张智能卡 reader 可以包含多张智能卡。
为了使客户端应用程序 (iBank2) 正常工作,将驱动程序强制替换为 Microsoft WUDF 的智能卡示例:
四个智能卡驱动程序已被强制替换为基本的 Microsoft 驱动程序,以使应用程序正常运行。
如果其他系统不接受您的智能卡,只需检查 BIOS
设置,smartcard.There 在某些系统中 disable/enable 是一个选项。
我有一个应用程序使用智能卡 reader 允许用户访问部分系统。在一个地方我没有问题。但是另一个,拥有不同类型卡的制造商有很多问题。它不断得到一个 id 为零的返回。然后查看事件日志我看到了这个:
card.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1);
var apduGetID = new APDUCommand(0xFF, 0xCA, 0, 0, null, 4);
var apduRespGetID = card.Transmit(apduGetID);
long cardId = BitConverter.ToUInt32(apduRespGetID.Data.Reverse().ToArray(), 0);
第二个问题是,然后尝试调试代码,它运行完美,只有删除断点才能看到问题,但看不到问题所在。有人可以帮帮我吗?
P.S。我找到了这个线程,但它不起作用:https://superuser.com/questions/715688/smart-card-errors
更新:这里是传输class
public override APDUResponse Transmit(APDUCommand ApduCmd)
{
var RecvLength = (uint)(ApduCmd.Le + APDUResponse.SW_LENGTH);
byte[] ApduBuffer;
var ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH];
var ioRequest = new SCard_IO_Request
{
m_dwProtocol = m_nProtocol,
m_cbPciLength = 8
};
// Build the command APDU
if (ApduCmd.Data == null)
{
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)];
if (ApduCmd.Le != 0)
{
ApduBuffer[4] = ApduCmd.Le;
}
}
else
{
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length];
for (var nI = 0; nI < ApduCmd.Data.Length; nI++)
{
ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI];
}
ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte)ApduCmd.Data.Length;
}
ApduBuffer[0] = ApduCmd.Class;
ApduBuffer[1] = ApduCmd.Ins;
ApduBuffer[2] = ApduCmd.P1;
ApduBuffer[3] = ApduCmd.P2;
m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength);
if (m_nLastError != 0)
{
var msg = "SCardTransmit error: " + m_nLastError;
throw new SmartCardException(msg, m_nLastError);
}
var apduData = new byte[RecvLength];
for (var nI = 0; nI < RecvLength; nI++)
{
apduData[nI] = ApduResponse[nI];
}
return new APDUResponse(apduData);
}
更新 2:我也试过放一些 Thread.Sleep()
请检查您在第二台机器上是否安装了所有最新的智能卡驱动程序。此外,有时将制造商提供的驱动程序替换为 "Microsoft WUDF driver" - https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85).aspx
会有所帮助请注意,插入时 OS 会检测到两种类型的设备 - 智能卡枚举器设备(智能卡 reader)和智能卡(有时称为智能卡容器)本身。一张智能卡 reader 可以包含多张智能卡。
为了使客户端应用程序 (iBank2) 正常工作,将驱动程序强制替换为 Microsoft WUDF 的智能卡示例:
四个智能卡驱动程序已被强制替换为基本的 Microsoft 驱动程序,以使应用程序正常运行。
如果其他系统不接受您的智能卡,只需检查 BIOS
设置,smartcard.There 在某些系统中 disable/enable 是一个选项。