// wraps SCardTransmit func (card *Card) Transmit(cmd []byte) ([]byte, error) { var sendpci *C.SCARD_IO_REQUEST var recvpci C.SCARD_IO_REQUEST switch card.activeProtocol { case PROTOCOL_T0: sendpci = &C.g_rgSCardT0Pci case PROTOCOL_T1: sendpci = &C.g_rgSCardT1Pci case PROTOCOL_RAW: sendpci = &C.g_rgSCardRawPci default: panic("unknown protocol") } var recv [C.MAX_BUFFER_SIZE_EXTENDED]byte var recvlen C.DWORD = C.DWORD(len(recv)) r := C.SCardTransmit(card.handle, sendpci, (*C.BYTE)(&cmd[0]), C.DWORD(len(cmd)), &recvpci, (*C.BYTE)(&recv[0]), &recvlen) if r != C.SCARD_S_SUCCESS { return nil, newError(r) } rsp := make([]byte, recvlen) copy(rsp, recv[0:recvlen]) return rsp, nil }
// wraps SCardTransmit func (card *Card) Transmit(cmd []byte) ([]byte, error) { var sendpci C.SCARD_IO_REQUEST var recvpci C.SCARD_IO_REQUEST switch card.activeProtocol { case PROTOCOL_T0: sendpci.dwProtocol = C.SCARD_PROTOCOL_T0 case PROTOCOL_T1: sendpci.dwProtocol = C.SCARD_PROTOCOL_T1 default: panic("unknown protocol") } sendpci.cbPciLength = C.sizeof_SCARD_IO_REQUEST var recv [C.MAX_BUFFER_SIZE_EXTENDED]byte var recvlen C.DWORD = C.DWORD(len(recv)) r := C.SCardTransmit(card.handle, &sendpci, (*C.BYTE)(&cmd[0]), C.DWORD(len(cmd)), &recvpci, (*C.BYTE)(&recv[0]), &recvlen) if r != C.SCARD_S_SUCCESS { return nil, scardError(r) } rsp := make([]byte, recvlen) copy(rsp, recv[0:recvlen]) return rsp, nil }