Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}