Exemplo n.º 1
0
static int testListReadersW(SCARDCONTEXT hContext)
{
	int errCount = 0;

    wchar_t staticBuf[2000];
    DWORD staticLen = (DWORD) (sizeof(staticBuf) / sizeof(wchar_t));
    long ret = SCardListReadersW(hContext, NULL, staticBuf, &staticLen);
	CHECK_PCSC_RET("SCardListReadersW(1)", ret);

    wchar_t *dynBuf = NULL;
    DWORD dynLen = 0;
    ret = SCardListReadersW(hContext, NULL, dynBuf, &dynLen);
	CHECK_PCSC_RET("SCardListReadersW(2)", ret);

    dynBuf = (wchar_t *) malloc(dynLen * sizeof(wchar_t));
    ret = SCardListReadersW(hContext, NULL, dynBuf, &dynLen);
	CHECK_PCSC_RET("SCardListReadersW(3)", ret);

    wchar_t *autoBuf = NULL;
    DWORD autoLen = SCARD_AUTOALLOCATE;
    ret = SCardListReadersW(hContext, NULL, (wchar_t*) &autoBuf, &autoLen);
	CHECK_PCSC_RET("SCardListReadersW(4)", ret);

    wchar_t *auto2Buf = NULL;
    DWORD auto2Len = SCARD_AUTOALLOCATE;
    ret = SCardListReadersW(hContext, NULL, (wchar_t*) &auto2Buf, &auto2Len);
	CHECK_PCSC_RET("SCardListReadersW(5)", ret);

    if (staticLen != dynLen || dynLen != autoLen || dynLen != auto2Len)
    {
		printf("ERR: SCardListReadersW() returned buffers lengths of different size\n");
        printf("  (staticLen = %d, dynLen = %d, autoLen = %d, auto2Len = %d\n", staticLen, dynLen, autoLen, auto2Len);
        errCount++;
    }
    else if (memcmp(staticBuf, dynBuf, dynLen) != 0 || memcmp(dynBuf, autoBuf, dynLen) != 0 ||
        memcmp(dynBuf, auto2Buf, dynLen) != 0)
    {
		printf("ERR: SCardListReadersW() returned different data\n");
        dump("  staticBuf = '%S'\n", staticBuf, dynLen);
        dump("  dynBuf = '%S'\n", dynBuf, dynLen);
        dump("  autoBuf = '%S'\n", autoBuf, dynLen);
        dump("  auto2Buf = '%S'\n", auto2Buf, dynLen);
        errCount++;
    }

    free(dynBuf);

    ret = SCardFreeMemory(hContext, autoBuf);
	CHECK_PCSC_RET("SCardFreeMemory()", ret);

    return errCount;
}
Exemplo n.º 2
0
static UINT32 smartcard_ListReadersW_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation, ListReaders_Call* call)
{
	UINT32 status;
	ListReaders_Return ret;
	LPWSTR mszReaders = NULL;
	DWORD cchReaders = 0;
	IRP* irp = operation->irp;

	cchReaders = SCARD_AUTOALLOCATE;

	status = ret.ReturnCode = SCardListReadersW(operation->hContext, (LPCWSTR) call->mszGroups, (LPWSTR) &mszReaders, &cchReaders);

	ret.msz = (BYTE*) mszReaders;
	ret.cBytes = cchReaders * 2;

	if (status != SCARD_S_SUCCESS)
		return status;

	smartcard_trace_list_readers_return(smartcard, &ret, TRUE);

	status = smartcard_pack_list_readers_return(smartcard, irp->output, &ret);

	if (status != SCARD_S_SUCCESS)
		return status;

	if (mszReaders)
		SCardFreeMemory(operation->hContext, mszReaders);

	if (call->mszGroups)
		free(call->mszGroups);

	return ret.ReturnCode;
}