static const char *listReaders(SCARDCONTEXT ctx, char *readerList, size_t readerListSize, bool printList, int readerNr) { DWORD dwLen = (DWORD) readerListSize; const char *readerName = NULL; long ret = SCardListReadersA(ctx, NULL, readerList, &dwLen); CHECK_PCSC_RET("SCardListReaders", ret); if (SCARD_S_SUCCESS == ret) { if (dwLen < 2) printf("No reader found, exiting\n"); else { if (printList) printf("Reader list:\n"); int readerCount = 0; while (readerList[0] != '\0') { if (printList) printf(" %d : %s\n", readerCount, readerList); if (readerCount == readerNr) readerName = readerList; readerList += strlen(readerList) + 1; readerCount++; } } } if (readerNr > 0 && NULL == readerName) printf("ERR: readernr (%d) too high, not enough readers present\n", readerNr); return readerName; }
static UINT32 smartcard_ListReadersA_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation, ListReaders_Call* call) { UINT32 status; ListReaders_Return ret; LPSTR mszReaders = NULL; DWORD cchReaders = 0; IRP* irp = operation->irp; cchReaders = SCARD_AUTOALLOCATE; status = ret.ReturnCode = SCardListReadersA(operation->hContext, (LPCSTR) call->mszGroups, (LPSTR) &mszReaders, &cchReaders); ret.msz = (BYTE*) mszReaders; ret.cBytes = cchReaders; if (status) return status; smartcard_trace_list_readers_return(smartcard, &ret, FALSE); status = smartcard_pack_list_readers_return(smartcard, irp->output, &ret); if (status) return status; if (mszReaders) SCardFreeMemory(operation->hContext, mszReaders); if (call->mszGroups) free(call->mszGroups); return ret.ReturnCode; }
static int testListReadersA(SCARDCONTEXT hContext) { int errCount = 0; char staticBuf[2000]; DWORD staticLen = (DWORD) sizeof(staticBuf); long ret = SCardListReadersA(hContext, NULL, staticBuf, &staticLen); CHECK_PCSC_RET("SCardListReadersA(1)", ret); char *dynBuf = NULL; DWORD dynLen = 0; ret = SCardListReadersA(hContext, NULL, dynBuf, &dynLen); CHECK_PCSC_RET("SCardListReadersA(2)", ret); dynBuf = (char *) malloc(dynLen); ret = SCardListReadersA(hContext, NULL, dynBuf, &dynLen); CHECK_PCSC_RET("SCardListReadersA(1)", ret); #ifndef MAC_OS_X char *autoBuf = NULL; DWORD autoLen = SCARD_AUTOALLOCATE; ret = SCardListReadersA(hContext, NULL, (char*) &autoBuf, &autoLen); CHECK_PCSC_RET("SCardListReadersA(3)", ret); if (staticLen != dynLen || dynLen != autoLen) { printf("ERR: SCardListReadersA() returned buffers lengths of different size\n"); errCount++; } else if (memcmp(staticBuf, dynBuf, dynLen) != 0 || memcmp(dynBuf, autoBuf, dynLen) != 0) { printf("ERR: SCardListReadersA() returned different data\n"); errCount++; } ret = SCardFreeMemory(hContext, autoBuf); CHECK_PCSC_RET("SCardFreeMemory()", ret); #endif free(dynBuf); return errCount; }
bool CPCSCClass::ListReadernames(CComboBox* m_cblist) { char *pReaderList = NULL; DWORD ReaderListSize = SCARD_AUTOALLOCATE; char *pch; if(m_cblist == NULL) { mylog.AddToLogs(m_logobj,"error: NULL combobox class"); return false; } //save the combobox to class m_cbListObj = m_cblist; m_cblist->ResetContent(); RetCode = SCardListReadersA( hContext, NULL, (LPSTR)&pReaderList, &ReaderListSize); if (RetCode != SCARD_S_SUCCESS) { mylog.AddToLogs(m_logobj,"error: SCardListReaders Failed"); mylog.AddToLogs(m_logobj,TranslatePCSCError()); return false; } else { mylog.AddToLogs(m_logobj,"SCardListReaders Success"); } pch = pReaderList; while (*pch != 0) { m_cblist->AddString (pch); pch += strlen (pch) + 1; } m_cblist->SetCurSel(0); RetCode = SCardFreeMemory( hContext, pReaderList ); if (RetCode != SCARD_S_SUCCESS) { mylog.AddToLogs(m_logobj,"error: SCardFreeMemory Failed"); } return true; }