Пример #1
0
static DWORD smartcard_StatusW_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation, Status_Call* call)
{
	LONG status;
	Status_Return ret;
	DWORD cchReaderLen = 0;
	LPWSTR mszReaderNames = NULL;
	IRP* irp = operation->irp;

	if (call->cbAtrLen > 32)
		call->cbAtrLen = 32;

	ret.cbAtrLen = call->cbAtrLen;
	ZeroMemory(ret.pbAtr, 32);

	cchReaderLen = SCARD_AUTOALLOCATE;

	status = ret.ReturnCode = SCardStatusW(operation->hCard, (LPWSTR) &mszReaderNames, &cchReaderLen,
			&ret.dwState, &ret.dwProtocol, (BYTE*) &ret.pbAtr, &ret.cbAtrLen);

	ret.mszReaderNames = (BYTE*) mszReaderNames;
	ret.cBytes = cchReaderLen * 2;

	smartcard_trace_status_return(smartcard, &ret, TRUE);

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

	if (status != SCARD_S_SUCCESS)
		return status;

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

	return ret.ReturnCode;
}
Пример #2
0
static int testSCardStatusW(SCARDCONTEXT hCard)
{
    int errCount = 0;
    DWORD dwState;
    DWORD dwProt;

    wchar_t staticReader[250];
    DWORD staticReaderLen = (DWORD) (sizeof(staticReader) / sizeof(wchar_t));
    BYTE staticAtr[32];
    DWORD staticAtrLen = (DWORD) sizeof(staticAtr);
    long ret = SCardStatusW(hCard, staticReader, &staticReaderLen, &dwState, &dwProt, staticAtr, &staticAtrLen);
	CHECK_PCSC_RET("SCardStatusW(1)", ret);

    wchar_t *dynReader = NULL;
    DWORD dynReaderLen = 0;
    BYTE *dynAtr = NULL;
    DWORD dynAtrLen = 0;
    ret = SCardStatusW(hCard, dynReader, &dynReaderLen, &dwState, &dwProt, dynAtr, &dynAtrLen);
	CHECK_PCSC_RET("SCardStatusW(2)", ret);
    dynReader = new wchar_t[staticReaderLen];
    dynAtr = new BYTE[dynAtrLen];
    ret = SCardStatusW(hCard, dynReader, &dynReaderLen, &dwState, &dwProt, dynAtr, &dynAtrLen);
	CHECK_PCSC_RET("SCardStatusW(3)", ret);
    
    wchar_t *autoReader = NULL;
    DWORD autoReaderLen = SCARD_AUTOALLOCATE;
    BYTE *autoAtr = NULL;
    DWORD autoAtrLen = SCARD_AUTOALLOCATE;
    ret = SCardStatusW(hCard, (wchar_t *) &autoReader, &autoReaderLen, &dwState, &dwProt, (BYTE *) &autoAtr, &autoAtrLen);
	CHECK_PCSC_RET("SCardStatusW(4)", ret);
    
    wchar_t *auto2Reader = (wchar_t *) 1;
    DWORD auto2ReaderLen = SCARD_AUTOALLOCATE;
    BYTE *auto2Atr = (BYTE *) 2;
    DWORD auto2AtrLen = SCARD_AUTOALLOCATE;
    ret = SCardStatusW(hCard, (wchar_t *) &auto2Reader, &auto2ReaderLen, &dwState, &dwProt, (BYTE *) &auto2Atr, &auto2AtrLen);
	CHECK_PCSC_RET("SCardStatusW(5)", ret);
    
    if (staticReaderLen != dynReaderLen || dynReaderLen != autoReaderLen || auto2ReaderLen != autoReaderLen)
    {
		printf("ERR: SCardStatusW() returned buffers lengths of different reader size\n");
        printf("  (staticLen = %d, dynLen = %d, autoLen = %d, autoLen = %d\n",
            (int) staticReaderLen, (int) dynReaderLen, (int) autoReaderLen, (int) auto2ReaderLen);
        errCount++;
    }
    else if (memcmp(staticReader, dynReader, dynReaderLen) != 0 || memcmp(dynReader, autoReader, dynReaderLen) != 0 ||
        memcmp(dynReader, auto2Reader, dynReaderLen) != 0)
    {
		printf("ERR: SCardStatusW() returned different reader names\n");
        dump("  staticReader = '%S'\n", staticReader, dynReaderLen);
        dump("  dynReader = '%S'\n", dynReader, dynReaderLen);
        dump("  autoReader = '%S'\n", autoReader, dynReaderLen);
        dump("  auto2Reader = '%S'\n", auto2Reader, dynReaderLen);
        errCount++;
    }

    if (staticAtrLen != dynAtrLen || dynAtrLen != autoAtrLen || dynAtrLen != auto2AtrLen)
    {
		printf("ERR: SCardStatusA() returned buffers lengths of different ATR size\n");
        printf("  (staticLen = %d, dynLen = %d, autoLen = %d, auto2Len = %d\n",
            (int) staticAtrLen, (int) dynAtrLen, (int) autoAtrLen, (int) auto2AtrLen);
        errCount++;
    }
    else if (memcmp(staticAtr, dynAtr, dynAtrLen) != 0 || memcmp(dynAtr, autoAtr, dynAtrLen) != 0 ||
        memcmp(dynAtr, auto2Atr, dynAtrLen) != 0)
    {
		printf("ERR: SCardStatusA() returned different ATRs\n");
        errCount++;
    }

    return errCount;
}