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; }
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; }