LONG IFDControl(READER_CONTEXT * rContext, DWORD ControlCode, LPCVOID TxBuffer, DWORD TxLength, LPVOID RxBuffer, DWORD RxLength, LPDWORD BytesReturned) { RESPONSECODE rv = IFD_SUCCESS; #ifndef PCSCLITE_STATIC_DRIVER RESPONSECODE(*IFDH_control) (DWORD, DWORD, LPCVOID, DWORD, LPVOID, DWORD, LPDWORD); #endif if (rContext->version < IFD_HVERSION_3_0) return SCARD_E_UNSUPPORTED_FEATURE; #ifndef PCSCLITE_STATIC_DRIVER IFDH_control = rContext->psFunctions.psFunctions_v3.pvfControl; #endif /* LOCK THIS CODE REGION */ (void)pthread_mutex_lock(rContext->mMutex); #ifndef PCSCLITE_STATIC_DRIVER rv = (*IFDH_control) (rContext->slot, ControlCode, TxBuffer, TxLength, RxBuffer, RxLength, BytesReturned); #elif defined(IFDHANDLERv3) rv = IFDHControl(rContext->slot, ControlCode, TxBuffer, TxLength, RxBuffer, RxLength, BytesReturned); #endif /* END OF LOCKED REGION */ (void)pthread_mutex_unlock(rContext->mMutex); if (rv == IFD_SUCCESS) return SCARD_S_SUCCESS; else { Log2(PCSC_LOG_ERROR, "Card not transacted: %ld", rv); Log3(PCSC_LOG_DEBUG, "ControlCode: 0x%.8lX BytesReturned: %ld", ControlCode, *BytesReturned); LogXxd(PCSC_LOG_DEBUG, "TxBuffer ", TxBuffer, TxLength); LogXxd(PCSC_LOG_DEBUG, "RxBuffer ", RxBuffer, *BytesReturned); if (rv == IFD_NO_SUCH_DEVICE) { (void)SendHotplugSignal(); return SCARD_E_READER_UNAVAILABLE; } if ((IFD_ERROR_NOT_SUPPORTED == rv) || (IFD_NOT_SUPPORTED == rv)) return SCARD_E_UNSUPPORTED_FEATURE; if (IFD_ERROR_INSUFFICIENT_BUFFER ==rv) return SCARD_E_INSUFFICIENT_BUFFER; return SCARD_E_NOT_TRANSACTED; } }
LONG IFDControl(PREADER_CONTEXT rContext, DWORD ControlCode, LPCVOID TxBuffer, DWORD TxLength, LPVOID RxBuffer, DWORD RxLength, LPDWORD BytesReturned) { RESPONSECODE rv = IFD_SUCCESS; #ifndef PCSCLITE_STATIC_DRIVER RESPONSECODE(*IFDH_control) (DWORD, DWORD, LPCVOID, DWORD, LPVOID, DWORD, LPDWORD); #endif if (rContext->dwVersion < IFD_HVERSION_3_0) return SCARD_E_UNSUPPORTED_FEATURE; #ifndef PCSCLITE_STATIC_DRIVER IFDH_control = rContext->psFunctions.psFunctions_v3.pvfControl; #endif /* LOCK THIS CODE REGION */ (void)SYS_MutexLock(rContext->mMutex); #ifndef PCSCLITE_STATIC_DRIVER rv = (*IFDH_control) (rContext->dwSlot, ControlCode, TxBuffer, TxLength, RxBuffer, RxLength, BytesReturned); #else rv = IFDHControl(rContext->dwSlot, ControlCode, TxBuffer, TxLength, RxBuffer, RxLength, BytesReturned); #endif /* END OF LOCKED REGION */ (void)SYS_MutexUnLock(rContext->mMutex); if (rv == IFD_SUCCESS) return SCARD_S_SUCCESS; else { Log2(PCSC_LOG_ERROR, "Card not transacted: %ld", rv); Log3(PCSC_LOG_DEBUG, "ControlCode: 0x%.8LX BytesReturned: %ld", ControlCode, *BytesReturned); LogXxd(PCSC_LOG_DEBUG, "TxBuffer ", TxBuffer, TxLength); LogXxd(PCSC_LOG_DEBUG, "RxBuffer ", RxBuffer, *BytesReturned); if (rv == IFD_NO_SUCH_DEVICE) { // (void)SendHotplugSignal(); return SCARD_E_READER_UNAVAILABLE; } return SCARD_E_NOT_TRANSACTED; } }
LONG IFDControl_v2(READER_CONTEXT * rContext, PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, PDWORD RxLength) { RESPONSECODE rv = IFD_SUCCESS; #ifndef PCSCLITE_STATIC_DRIVER RESPONSECODE(*IFDH_control_v2) (DWORD, PUCHAR, DWORD, /*@out@*/ PUCHAR, PDWORD); #endif if (rContext->version != IFD_HVERSION_2_0) return SCARD_E_UNSUPPORTED_FEATURE; #ifndef PCSCLITE_STATIC_DRIVER IFDH_control_v2 = rContext->psFunctions.psFunctions_v2.pvfControl; #endif /* LOCK THIS CODE REGION */ (void)pthread_mutex_lock(rContext->mMutex); #ifndef PCSCLITE_STATIC_DRIVER rv = (*IFDH_control_v2) (rContext->slot, TxBuffer, TxLength, RxBuffer, RxLength); #elif defined(IFDHANDLERv2) rv = IFDHControl(rContext->slot, TxBuffer, TxLength, RxBuffer, RxLength); #endif /* END OF LOCKED REGION */ (void)pthread_mutex_unlock(rContext->mMutex); if (rv == IFD_SUCCESS) return SCARD_S_SUCCESS; else { Log2(PCSC_LOG_ERROR, "Card not transacted: %ld", rv); LogXxd(PCSC_LOG_DEBUG, "TxBuffer ", TxBuffer, TxLength); LogXxd(PCSC_LOG_DEBUG, "RxBuffer ", RxBuffer, *RxLength); return SCARD_E_NOT_TRANSACTED; } }
PCSC_API LONG SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer, DWORD cbSendLength, LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned) { return responsecode2long( IFDHControl (hCard, dwControlCode, (PUCHAR) pbSendBuffer, cbSendLength, pbRecvBuffer, cbRecvLength, lpBytesReturned)); }