channels/smartcard: add more debug output, make distinction between reader and card...
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Sat, 12 Apr 2014 18:31:54 +0000 (14:31 -0400)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Sat, 12 Apr 2014 18:31:54 +0000 (14:31 -0400)
channels/smartcard/client/smartcard_pack.c
winpr/include/winpr/smartcard.h
winpr/libwinpr/smartcard/smartcard.c
winpr/libwinpr/smartcard/smartcard_pcsc.c

index 8d765e1..c04422d 100644 (file)
@@ -418,7 +418,8 @@ void smartcard_trace_establish_context_call(SMARTCARD_DEVICE* smartcard, Establi
 
        WLog_Print(smartcard->log, WLOG_DEBUG, "EstablishContext_Call {");
 
-       WLog_Print(smartcard->log, WLOG_DEBUG, "dwScope: 0x%08X", call->dwScope);
+       WLog_Print(smartcard->log, WLOG_DEBUG, "dwScope: %s (0x%08X)",
+                       SCardGetScopeString(call->dwScope), call->dwScope);
 
        WLog_Print(smartcard->log, WLOG_DEBUG, "}");
 }
@@ -1146,6 +1147,8 @@ void smartcard_trace_get_status_change_a_call(SMARTCARD_DEVICE* smartcard, GetSt
 {
        BYTE* pb;
        UINT32 index;
+       char* szEventState;
+       char* szCurrentState;
        LPSCARD_READERSTATEA readerState;
 
        if (!WLog_IsLevelActive(smartcard->log, WLOG_DEBUG))
@@ -1174,9 +1177,22 @@ void smartcard_trace_get_status_change_a_call(SMARTCARD_DEVICE* smartcard, GetSt
                readerState = &call->rgReaderStates[index];
 
                WLog_Print(smartcard->log, WLOG_DEBUG,
-                       "\t[%d]: szReader: %s dwCurrentState: 0x%08X dwEventState: 0x%08X cbAtr: %d",
-                       index, readerState->szReader, readerState->dwCurrentState,
-                       readerState->dwEventState, readerState->cbAtr);
+                       "\t[%d]: szReader: %s cbAtr: %d",
+                       index, readerState->szReader, readerState->cbAtr);
+
+               szCurrentState = SCardGetReaderStateString(readerState->dwCurrentState);
+               szEventState = SCardGetReaderStateString(readerState->dwEventState);
+
+               WLog_Print(smartcard->log, WLOG_DEBUG,
+                       "\t[%d]: dwCurrentState: %s (0x%08X)",
+                       index, szCurrentState, readerState->dwCurrentState);
+
+               WLog_Print(smartcard->log, WLOG_DEBUG,
+                       "\t[%d]: dwEventState: %s (0x%08X)",
+                       index, szEventState, readerState->dwEventState);
+
+               free(szCurrentState);
+               free(szEventState);
        }
 
        WLog_Print(smartcard->log, WLOG_DEBUG, "}");
@@ -1295,6 +1311,8 @@ void smartcard_trace_get_status_change_w_call(SMARTCARD_DEVICE* smartcard, GetSt
 {
        BYTE* pb;
        UINT32 index;
+       char* szEventState;
+       char* szCurrentState;
        LPSCARD_READERSTATEW readerState;
 
        if (!WLog_IsLevelActive(smartcard->log, WLOG_DEBUG))
@@ -1327,9 +1345,22 @@ void smartcard_trace_get_status_change_w_call(SMARTCARD_DEVICE* smartcard, GetSt
                ConvertFromUnicode(CP_UTF8, 0, readerState->szReader, -1, &szReaderA, 0, NULL, NULL);
 
                WLog_Print(smartcard->log, WLOG_DEBUG,
-                       "\t[%d]: szReader: %s dwCurrentState: 0x%08X dwEventState: 0x%08X cbAtr: %d",
-                       index, szReaderA, readerState->dwCurrentState,
-                       readerState->dwEventState, readerState->cbAtr);
+                       "\t[%d]: szReader: %s cbAtr: %d",
+                       index, szReaderA, readerState->cbAtr);
+
+               szCurrentState = SCardGetReaderStateString(readerState->dwCurrentState);
+               szEventState = SCardGetReaderStateString(readerState->dwEventState);
+
+               WLog_Print(smartcard->log, WLOG_DEBUG,
+                       "\t[%d]: dwCurrentState: %s (0x%08X)",
+                       index, szCurrentState, readerState->dwCurrentState);
+
+               WLog_Print(smartcard->log, WLOG_DEBUG,
+                       "\t[%d]: dwEventState: %s (0x%08X)",
+                       index, szEventState, readerState->dwEventState);
+
+               free(szCurrentState);
+               free(szEventState);
 
                free(szReaderA);
        }
@@ -1380,16 +1411,16 @@ void smartcard_trace_get_status_change_return(SMARTCARD_DEVICE* smartcard, GetSt
                rgReaderState = &(ret->rgReaderStates[index]);
                pb = (BYTE*) &rgReaderState->rgbAtr;
 
-               szCurrentState = SCardGetStateString(rgReaderState->dwCurrentState);
-               szEventState = SCardGetStateString(rgReaderState->dwEventState);
+               szCurrentState = SCardGetReaderStateString(rgReaderState->dwCurrentState);
+               szEventState = SCardGetReaderStateString(rgReaderState->dwEventState);
 
                WLog_Print(smartcard->log, WLOG_DEBUG,
-                       "\t[%d]: dwCurrentState: 0x%08X (%s)",
-                       index, rgReaderState->dwCurrentState, szCurrentState);
+                       "\t[%d]: dwCurrentState: %s (0x%08X)",
+                       index, szCurrentState, rgReaderState->dwCurrentState);
 
                WLog_Print(smartcard->log, WLOG_DEBUG,
-                       "\t[%d]: dwEventState: 0x%08X (%s)",
-                       index, rgReaderState->dwCurrentState, szEventState);
+                       "\t[%d]: dwEventState: %s (0x%08X)",
+                       index, szEventState, rgReaderState->dwEventState);
 
                WLog_Print(smartcard->log, WLOG_DEBUG,
                        "\t[%d]: cbAtr: %d rgbAtr: "
@@ -1564,7 +1595,6 @@ void smartcard_trace_status_return(SMARTCARD_DEVICE* smartcard, Status_Return* r
        BYTE* pb;
        UINT32 index;
        UINT32 length;
-       char* szState = NULL;
        char* mszReaderNamesA = NULL;
 
        if (!WLog_IsLevelActive(smartcard->log, WLOG_DEBUG))
@@ -1590,14 +1620,13 @@ void smartcard_trace_status_return(SMARTCARD_DEVICE* smartcard, Status_Return* r
 
        pb = (BYTE*) &ret->pbAtr;
 
-       szState = SCardGetStateString(ret->dwState);
-
        WLog_Print(smartcard->log, WLOG_DEBUG, "Status%s_Return {", unicode ? "W" : "A");
 
        WLog_Print(smartcard->log, WLOG_DEBUG, "ReturnCode: 0x%08X", ret->ReturnCode);
 
        WLog_Print(smartcard->log, WLOG_DEBUG, "dwState: %s (0x%08X) dwProtocol: %s (0x%08X)",
-               szState, ret->dwState, SCardGetProtocolString(ret->dwProtocol), ret->dwProtocol);
+               SCardGetCardStateString(ret->dwState), ret->dwState,
+               SCardGetProtocolString(ret->dwProtocol), ret->dwProtocol);
 
        WLog_Print(smartcard->log, WLOG_DEBUG, "cBytes: %d mszReaderNames: %s",
                        ret->cBytes, mszReaderNamesA);
@@ -1606,7 +1635,7 @@ void smartcard_trace_status_return(SMARTCARD_DEVICE* smartcard, Status_Return* r
                "cbAtrLen: %d pbAtr: "
                "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X"
                "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
-               index, ret->cbAtrLen,
+               ret->cbAtrLen,
                pb[0], pb[1], pb[2], pb[3], pb[4], pb[5], pb[6], pb[7],
                pb[8], pb[9], pb[10], pb[11], pb[12], pb[13], pb[14], pb[15],
                pb[16], pb[17], pb[18], pb[19], pb[20], pb[21], pb[22], pb[23],
@@ -1615,7 +1644,6 @@ void smartcard_trace_status_return(SMARTCARD_DEVICE* smartcard, Status_Return* r
        WLog_Print(smartcard->log, WLOG_DEBUG, "}");
 
        free(mszReaderNamesA);
-       free(szState);
 }
 
 UINT32 smartcard_unpack_get_attrib_call(SMARTCARD_DEVICE* smartcard, wStream* s, GetAttrib_Call* call)
index 462d316..db52976 100644 (file)
@@ -1108,7 +1108,9 @@ WINSCARDAPI const char* WINAPI SCardGetAttributeString(DWORD dwAttrId);
 WINSCARDAPI const char* WINAPI SCardGetProtocolString(DWORD dwProtocols);
 WINSCARDAPI const char* WINAPI SCardGetShareModeString(DWORD dwShareMode);
 WINSCARDAPI const char* WINAPI SCardGetDispositionString(DWORD dwDisposition);
-WINSCARDAPI char* WINAPI SCardGetStateString(DWORD dwEventState);
+WINSCARDAPI const char* WINAPI SCardGetScopeString(DWORD dwScope);
+WINSCARDAPI const char* WINAPI SCardGetCardStateString(DWORD dwCardState);
+WINSCARDAPI char* WINAPI SCardGetReaderStateString(DWORD dwReaderState);
 
 #ifdef __cplusplus
 }
index e4840e4..9d75856 100644 (file)
@@ -855,86 +855,140 @@ WINSCARDAPI const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
        return "SCARD_UNKNOWN_CARD";
 }
 
-WINSCARDAPI char* WINAPI SCardGetStateString(DWORD dwEventState)
+WINSCARDAPI const char* WINAPI SCardGetScopeString(DWORD dwScope)
 {
-       char* szEventState = malloc(512);
+       switch (dwScope)
+       {
+               case SCARD_SCOPE_USER:
+                       return "SCARD_SCOPE_USER";
+                       break;
+               case SCARD_SCOPE_TERMINAL:
+                       return "SCARD_SCOPE_TERMINAL";
+                       break;
+               case SCARD_SCOPE_SYSTEM:
+                       return "SCARD_SCOPE_SYSTEM";
+                       break;
+               default:
+                       return "SCARD_SCOPE_UNKNOWN";
+                       break;
+       }
+
+       return "SCARD_SCOPE_UNKNOWN";
+}
+
+WINSCARDAPI const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
+{
+       switch (dwCardState)
+       {
+               case SCARD_UNKNOWN:
+                       return "SCARD_UNKNOWN";
+                       break;
+               case SCARD_ABSENT:
+                       return "SCARD_ABSENT";
+                       break;
+               case SCARD_PRESENT:
+                       return "SCARD_PRESENT";
+                       break;
+               case SCARD_SWALLOWED:
+                       return "SCARD_SWALLOWED";
+                       break;
+               case SCARD_POWERED:
+                       return "SCARD_POWERED";
+                       break;
+               case SCARD_NEGOTIABLE:
+                       return "SCARD_NEGOTIABLE";
+                       break;
+               case SCARD_SPECIFIC:
+                       return "SCARD_SPECIFIC";
+                       break;
+               default:
+                       return "SCARD_UNKNOWN";
+                       break;
+       }
+
+       return "SCARD_UNKNOWN";
+}
+
+WINSCARDAPI char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
+{
+       char* szReaderState = malloc(512);
 
-       if (!szEventState)
+       if (!szReaderState)
                return NULL;
 
-       szEventState[0] = '\0';
+       szReaderState[0] = '\0';
 
-       if (dwEventState & SCARD_STATE_IGNORE)
+       if (dwReaderState & SCARD_STATE_IGNORE)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_IGNORE");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_IGNORE");
        }
-       if (dwEventState & SCARD_STATE_CHANGED)
+       if (dwReaderState & SCARD_STATE_CHANGED)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_CHANGED");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_CHANGED");
        }
-       if (dwEventState & SCARD_STATE_UNKNOWN)
+       if (dwReaderState & SCARD_STATE_UNKNOWN)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_UNKNOWN");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_UNKNOWN");
        }
-       if (dwEventState & SCARD_STATE_UNAVAILABLE)
+       if (dwReaderState & SCARD_STATE_UNAVAILABLE)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_UNAVAILABLE");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_UNAVAILABLE");
        }
-       if (dwEventState & SCARD_STATE_EMPTY)
+       if (dwReaderState & SCARD_STATE_EMPTY)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_EMPTY");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_EMPTY");
        }
-       if (dwEventState & SCARD_STATE_PRESENT)
+       if (dwReaderState & SCARD_STATE_PRESENT)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_PRESENT");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_PRESENT");
        }
-       if (dwEventState & SCARD_STATE_ATRMATCH)
+       if (dwReaderState & SCARD_STATE_ATRMATCH)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_ATRMATCH");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_ATRMATCH");
        }
-       if (dwEventState & SCARD_STATE_EXCLUSIVE)
+       if (dwReaderState & SCARD_STATE_EXCLUSIVE)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_EXCLUSIVE");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_EXCLUSIVE");
        }
-       if (dwEventState & SCARD_STATE_INUSE)
+       if (dwReaderState & SCARD_STATE_INUSE)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_INUSE");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_INUSE");
        }
-       if (dwEventState & SCARD_STATE_MUTE)
+       if (dwReaderState & SCARD_STATE_MUTE)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_MUTE");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_MUTE");
        }
-       if (dwEventState & SCARD_STATE_UNPOWERED)
+       if (dwReaderState & SCARD_STATE_UNPOWERED)
        {
-               if (szEventState[0])
-                       strcat(szEventState, " | ");
-               strcat(szEventState, "SCARD_STATE_UNPOWERED");
+               if (szReaderState[0])
+                       strcat(szReaderState, " | ");
+               strcat(szReaderState, "SCARD_STATE_UNPOWERED");
        }
 
-       if (!szEventState[0])
-               strcat(szEventState, "SCARD_STATE_UNAWARE");
+       if (!szReaderState[0])
+               strcat(szReaderState, "SCARD_STATE_UNAWARE");
 
-       return szEventState;
+       return szReaderState;
 }
 
 void InitializeSCardApiStubs(void)
index 32ed2de..33d3555 100644 (file)
@@ -67,7 +67,7 @@ LONG PCSC_MapErrorCodeToWinSCard(LONG errorCode)
        return errorCode;
 }
 
-DWORD PCSC_ConvertStatusToWinSCard(DWORD dwState)
+DWORD PCSC_ConvertCardStateToWinSCard(DWORD dwCardState)
 {
        /**
         * pcsc-lite's SCardStatus returns a bit-field, not an enumerated value.
@@ -83,19 +83,19 @@ DWORD PCSC_ConvertStatusToWinSCard(DWORD dwState)
         *      SCARD_SPECIFIC          6                0x0040
         */
 
-       if (dwState & 0x0001)
+       if (dwCardState & 0x0001)
                return SCARD_UNKNOWN;
-       if (dwState & 0x0002)
+       if (dwCardState & 0x0002)
                return SCARD_ABSENT;
-       if (dwState & 0x0004)
+       if (dwCardState & 0x0004)
                return SCARD_PRESENT;
-       if (dwState & 0x0008)
+       if (dwCardState & 0x0008)
                return SCARD_SWALLOWED;
-       if (dwState & 0x0010)
+       if (dwCardState & 0x0010)
                return SCARD_POWERED;
-       if (dwState & 0x0020)
+       if (dwCardState & 0x0020)
                return SCARD_NEGOTIABLE;
-       if (dwState & 0x0040)
+       if (dwCardState & 0x0040)
                return SCARD_SPECIFIC;
 
        return SCARD_UNKNOWN;
@@ -1034,7 +1034,7 @@ WINSCARDAPI LONG WINAPI PCSC_SCardStatusA(SCARDHANDLE hCard,
                }
 
                *pdwState &= 0xFFFF;
-               *pdwState = PCSC_ConvertStatusToWinSCard(*pdwState);
+               *pdwState = PCSC_ConvertCardStateToWinSCard(*pdwState);
 
                status = PCSC_MapErrorCodeToWinSCard(status);
        }
@@ -1134,7 +1134,7 @@ WINSCARDAPI LONG WINAPI PCSC_SCardStatusW(SCARDHANDLE hCard,
                }
 
                *pdwState &= 0xFFFF;
-               *pdwState = PCSC_ConvertStatusToWinSCard(*pdwState);
+               *pdwState = PCSC_ConvertCardStateToWinSCard(*pdwState);
        }
 
        return status;