Skip to content

Commit 5c7aae2

Browse files
authored
Merge pull request FreeRDP#12213 from akallabeth/winpr-scard
[winpr,smartcard] implement some attributes
2 parents 1825fa8 + 19b8e80 commit 5c7aae2

1 file changed

Lines changed: 108 additions & 2 deletions

File tree

winpr/libwinpr/smartcard/smartcard_pcsc.c

Lines changed: 108 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2506,6 +2506,105 @@ static LONG WINAPI PCSC_SCardGetAttrib_FriendlyName(SCARDHANDLE hCard, DWORD dwA
25062506
return status;
25072507
}
25082508

2509+
static LONG PCSC_ReadDeviceSystemName(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
2510+
LPDWORD pcbAttrLen)
2511+
{
2512+
/* Get reader name from SCardStatus */
2513+
CHAR* szReader = NULL;
2514+
PCSC_DWORD cchReader = 0;
2515+
PCSC_DWORD dwState = 0;
2516+
PCSC_DWORD dwProtocol = 0;
2517+
LONG status = 0;
2518+
2519+
const DWORD cbAttrLen = *pcbAttrLen;
2520+
if (cbAttrLen == SCARD_AUTOALLOCATE)
2521+
return SCARD_E_UNEXPECTED;
2522+
else
2523+
{
2524+
PCSC_DWORD cbAtr = 0;
2525+
const PCSC_LONG rc =
2526+
g_PCSC.pfnSCardStatus(hCard, NULL, &cchReader, &dwState, &dwProtocol, NULL, &cbAtr);
2527+
status = WINPR_ASSERTING_INT_CAST(LONG, rc);
2528+
if (status != SCARD_S_SUCCESS)
2529+
return status;
2530+
switch (dwAttrId)
2531+
{
2532+
case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
2533+
if (cchReader > cbAttrLen)
2534+
return SCARD_E_INSUFFICIENT_BUFFER;
2535+
break;
2536+
case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
2537+
if (cchReader > cbAttrLen / sizeof(WCHAR))
2538+
return SCARD_E_INSUFFICIENT_BUFFER;
2539+
break;
2540+
default:
2541+
return SCARD_E_INVALID_PARAMETER;
2542+
}
2543+
2544+
if (cchReader == 0)
2545+
{
2546+
*pcbAttrLen = 0;
2547+
return SCARD_S_SUCCESS;
2548+
}
2549+
2550+
if (!pbAttr)
2551+
return SCARD_E_INVALID_VALUE;
2552+
2553+
szReader = calloc(cchReader, sizeof(CHAR));
2554+
if (!szReader)
2555+
return SCARD_E_NO_MEMORY;
2556+
}
2557+
2558+
{
2559+
PCSC_DWORD rlen = cchReader;
2560+
PCSC_DWORD cbAtr = 0;
2561+
const PCSC_LONG rc =
2562+
g_PCSC.pfnSCardStatus(hCard, szReader, &rlen, &dwState, &dwProtocol, NULL, &cbAtr);
2563+
status = WINPR_ASSERTING_INT_CAST(LONG, rc);
2564+
if (status != SCARD_S_SUCCESS)
2565+
goto out;
2566+
2567+
if (cchReader != rlen)
2568+
{
2569+
status = SCARD_E_INVALID_VALUE;
2570+
goto out;
2571+
}
2572+
}
2573+
*pcbAttrLen = cchReader;
2574+
2575+
switch (dwAttrId)
2576+
{
2577+
case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
2578+
if (!strncpy((char*)pbAttr, szReader, *pcbAttrLen))
2579+
{
2580+
status = SCARD_E_NO_MEMORY;
2581+
goto out;
2582+
}
2583+
break;
2584+
case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
2585+
if (cchReader > cbAttrLen / sizeof(WCHAR))
2586+
{
2587+
status = SCARD_E_INSUFFICIENT_BUFFER;
2588+
goto out;
2589+
}
2590+
if (ConvertUtf8NToWChar(szReader, *pcbAttrLen, (WCHAR*)pbAttr, *pcbAttrLen) !=
2591+
*pcbAttrLen)
2592+
{
2593+
status = SCARD_E_NO_MEMORY;
2594+
goto out;
2595+
}
2596+
*pcbAttrLen *= sizeof(WCHAR);
2597+
break;
2598+
default:
2599+
status = SCARD_E_INVALID_PARAMETER;
2600+
break;
2601+
}
2602+
2603+
out:
2604+
free(szReader);
2605+
return status;
2606+
}
2607+
25092608
static LONG WINAPI PCSC_SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
25102609
LPDWORD pcbAttrLen)
25112610
{
@@ -2589,8 +2688,8 @@ static LONG WINAPI PCSC_SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE
25892688
PCSC_DWORD cbAtrLen = 0;
25902689
PCSC_DWORD dwProtocol = 0;
25912690
PCSC_DWORD cchReaderLen = 0;
2592-
status = (LONG)g_PCSC.pfnSCardStatus(hCard, NULL, &cchReaderLen, &dwState,
2593-
&dwProtocol, NULL, &cbAtrLen);
2691+
status = g_PCSC.pfnSCardStatus(hCard, NULL, &cchReaderLen, &dwState, &dwProtocol,
2692+
NULL, &cbAtrLen);
25942693

25952694
if (status == SCARD_S_SUCCESS)
25962695
{
@@ -2642,6 +2741,13 @@ static LONG WINAPI PCSC_SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE
26422741
}
26432742
else if (dwAttrId == SCARD_ATTR_DEVICE_SYSTEM_NAME_A)
26442743
{
2744+
if (!pcbAttrLenAlloc)
2745+
status = PCSC_ReadDeviceSystemName(hCard, dwAttrId, pbAttr, pcbAttrLen);
2746+
}
2747+
else if (dwAttrId == SCARD_ATTR_DEVICE_SYSTEM_NAME_W)
2748+
{
2749+
if (!pcbAttrLenAlloc)
2750+
status = PCSC_ReadDeviceSystemName(hCard, dwAttrId, pbAttr, pcbAttrLen);
26452751
}
26462752
else if (dwAttrId == SCARD_ATTR_DEVICE_UNIT)
26472753
{

0 commit comments

Comments
 (0)