@@ -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+
25092608static 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