mirror of https://github.com/FreeRDP/FreeRDP
channels/smartcard: cleanup
This commit is contained in:
parent
9de2a85f6a
commit
368486dd13
|
@ -282,82 +282,6 @@ static UINT32 handle_RedirHandleRef(SMARTCARD_DEVICE* smartcard, IRP* irp, SCARD
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL check_reader_is_forwarded(SMARTCARD_DEVICE* smartcard, const char* readerName)
|
|
||||||
{
|
|
||||||
BOOL rc = TRUE;
|
|
||||||
char *name = _strdup(readerName);
|
|
||||||
char *str, *strpos=NULL, *strstatus=NULL;
|
|
||||||
long pos, cpos, ret;
|
|
||||||
|
|
||||||
/* Extract the name, position and status from the data provided. */
|
|
||||||
str = strtok(name, " ");
|
|
||||||
while(str)
|
|
||||||
{
|
|
||||||
strpos = strstatus;
|
|
||||||
strstatus = str;
|
|
||||||
str = strtok(NULL, " ");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strpos)
|
|
||||||
goto finally;
|
|
||||||
|
|
||||||
pos = strtol(strpos, NULL, 10);
|
|
||||||
|
|
||||||
if (strpos && strstatus)
|
|
||||||
{
|
|
||||||
/* Check, if the name of the reader matches. */
|
|
||||||
if (smartcard->name && strncmp(smartcard->name, readerName, strlen(smartcard->name)))
|
|
||||||
rc = FALSE;
|
|
||||||
|
|
||||||
/* Check, if the position matches. */
|
|
||||||
if (smartcard->path)
|
|
||||||
{
|
|
||||||
ret = sscanf(smartcard->path, "%ld", &cpos);
|
|
||||||
if ((1 == ret) && (cpos != pos))
|
|
||||||
rc = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DEBUG_WARN("unknown reader format '%s'", readerName);
|
|
||||||
}
|
|
||||||
|
|
||||||
finally:
|
|
||||||
free(name);
|
|
||||||
|
|
||||||
if (!rc)
|
|
||||||
DEBUG_WARN("reader '%s' not forwarded", readerName);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL check_handle_is_forwarded(SMARTCARD_DEVICE* smartcard, SCARDHANDLE hCard, SCARDCONTEXT hContext)
|
|
||||||
{
|
|
||||||
BOOL rc = FALSE;
|
|
||||||
LONG status;
|
|
||||||
DWORD state = 0, protocol = 0;
|
|
||||||
DWORD readerLen;
|
|
||||||
DWORD atrLen = SCARD_ATR_LENGTH;
|
|
||||||
char* readerName = NULL;
|
|
||||||
BYTE pbAtr[SCARD_ATR_LENGTH];
|
|
||||||
|
|
||||||
readerLen = SCARD_AUTOALLOCATE;
|
|
||||||
|
|
||||||
status = SCardStatusA(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
|
|
||||||
|
|
||||||
if (status == SCARD_S_SUCCESS)
|
|
||||||
{
|
|
||||||
rc = check_reader_is_forwarded(smartcard, readerName);
|
|
||||||
|
|
||||||
if (!rc)
|
|
||||||
DEBUG_WARN("Reader '%s' not forwarded!", readerName);
|
|
||||||
}
|
|
||||||
|
|
||||||
SCardFreeMemory(hContext, readerName);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static UINT32 smartcard_output_string(IRP* irp, char* src, BOOL wide)
|
static UINT32 smartcard_output_string(IRP* irp, char* src, BOOL wide)
|
||||||
{
|
{
|
||||||
BYTE* p;
|
BYTE* p;
|
||||||
|
@ -859,13 +783,6 @@ UINT32 handle_ConnectA(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
if (status)
|
if (status)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
if (!check_reader_is_forwarded(smartcard, (char*) call.szReader))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Reader '%s' not forwarded!", call.szReader);
|
|
||||||
status = SCARD_E_INVALID_TARGET;
|
|
||||||
goto finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = SCardConnectA(hContext, (char*) call.szReader, (DWORD) call.Common.dwShareMode,
|
status = SCardConnectA(hContext, (char*) call.szReader, (DWORD) call.Common.dwShareMode,
|
||||||
(DWORD) call.Common.dwPreferredProtocols, &hCard, (DWORD*) &ret.dwActiveProtocol);
|
(DWORD) call.Common.dwPreferredProtocols, &hCard, (DWORD*) &ret.dwActiveProtocol);
|
||||||
|
|
||||||
|
@ -955,12 +872,6 @@ static UINT32 handle_Reconnect(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
return SCARD_E_INVALID_TARGET;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = SCardReconnect(hCard, (DWORD) call.dwShareMode, (DWORD) call.dwPreferredProtocols,
|
status = SCardReconnect(hCard, (DWORD) call.dwShareMode, (DWORD) call.dwPreferredProtocols,
|
||||||
(DWORD) call.dwInitialization, (LPDWORD) &ret.dwActiveProtocol);
|
(DWORD) call.dwInitialization, (LPDWORD) &ret.dwActiveProtocol);
|
||||||
|
|
||||||
|
@ -996,12 +907,6 @@ static UINT32 handle_Disconnect(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
return SCARD_E_INVALID_TARGET;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = SCardDisconnect(hCard, (DWORD) call.dwDisposition);
|
status = SCardDisconnect(hCard, (DWORD) call.dwDisposition);
|
||||||
|
|
||||||
ZeroMemory(&smartcard->hCard, sizeof(smartcard->hCard));
|
ZeroMemory(&smartcard->hCard, sizeof(smartcard->hCard));
|
||||||
|
@ -1037,12 +942,6 @@ static UINT32 handle_BeginTransaction(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
return SCARD_E_INVALID_TARGET;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = SCardBeginTransaction(hCard);
|
status = SCardBeginTransaction(hCard);
|
||||||
|
|
||||||
smartcard_output_alignment(irp, 8);
|
smartcard_output_alignment(irp, 8);
|
||||||
|
@ -1076,12 +975,6 @@ static UINT32 handle_EndTransaction(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
return SCARD_E_INVALID_TARGET;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = SCardEndTransaction(hCard, call.dwDisposition);
|
status = SCardEndTransaction(hCard, call.dwDisposition);
|
||||||
|
|
||||||
smartcard_output_alignment(irp, 8);
|
smartcard_output_alignment(irp, 8);
|
||||||
|
@ -1121,13 +1014,6 @@ static UINT32 handle_State(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
if (status)
|
if (status)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
status = SCARD_E_INVALID_TARGET;
|
|
||||||
goto finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
readerLen = SCARD_AUTOALLOCATE;
|
readerLen = SCARD_AUTOALLOCATE;
|
||||||
|
|
||||||
ret.rgAtr = atr;
|
ret.rgAtr = atr;
|
||||||
|
@ -1196,16 +1082,9 @@ static DWORD handle_Status(SMARTCARD_DEVICE* smartcard, IRP* irp, BOOL wide)
|
||||||
if (status)
|
if (status)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
pbAtr = (BYTE*) malloc(atrLen);
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
status = SCARD_E_INVALID_TARGET;
|
|
||||||
goto finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
pbAtr = malloc(sizeof(BYTE) * atrLen);
|
|
||||||
|
|
||||||
readerLen = SCARD_AUTOALLOCATE;
|
readerLen = SCARD_AUTOALLOCATE;
|
||||||
|
|
||||||
status = SCardStatusA(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
|
status = SCardStatusA(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
|
||||||
|
|
||||||
if (status != SCARD_S_SUCCESS)
|
if (status != SCARD_S_SUCCESS)
|
||||||
|
@ -1453,13 +1332,6 @@ static UINT32 handle_Transmit(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
pPioRecvPci = NULL;
|
pPioRecvPci = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
status = SCARD_E_INVALID_TARGET;
|
|
||||||
goto finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = SCardTransmit(hCard, ioSendPci.rq, sendBuf, cbSendLength,
|
status = SCardTransmit(hCard, ioSendPci.rq, sendBuf, cbSendLength,
|
||||||
pPioRecvPci, recvBuf, &cbRecvLength);
|
pPioRecvPci, recvBuf, &cbRecvLength);
|
||||||
|
|
||||||
|
@ -1558,21 +1430,14 @@ static UINT32 handle_Control(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
call.pvInBuffer = malloc(length);
|
call.pvInBuffer = (BYTE*) malloc(length);
|
||||||
call.cbInBufferSize = length;
|
call.cbInBufferSize = length;
|
||||||
|
|
||||||
Stream_Read(irp->input, call.pvInBuffer, length);
|
Stream_Read(irp->input, call.pvInBuffer, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.cbOutBufferSize = call.cbOutBufferSize;
|
ret.cbOutBufferSize = call.cbOutBufferSize;
|
||||||
ret.pvOutBuffer = malloc(call.cbOutBufferSize);
|
ret.pvOutBuffer = (BYTE*) malloc(call.cbOutBufferSize);
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
status = SCARD_E_INVALID_TARGET;
|
|
||||||
goto finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = SCardControl(hCard, (DWORD) call.dwControlCode,
|
status = SCardControl(hCard, (DWORD) call.dwControlCode,
|
||||||
call.pvInBuffer, (DWORD) call.cbInBufferSize,
|
call.pvInBuffer, (DWORD) call.cbInBufferSize,
|
||||||
|
@ -1629,14 +1494,7 @@ static UINT32 handle_GetAttrib(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
|
|
||||||
{
|
|
||||||
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
|
|
||||||
return SCARD_E_INVALID_TARGET;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret.pbAttr = NULL;
|
ret.pbAttr = NULL;
|
||||||
|
|
||||||
cbAttrLen = (call.cbAttrLen == 0) ? 0 : SCARD_AUTOALLOCATE;
|
cbAttrLen = (call.cbAttrLen == 0) ? 0 : SCARD_AUTOALLOCATE;
|
||||||
|
|
||||||
status = SCardGetAttrib(hCard, call.dwAttrId, (cbAttrLen == 0) ? NULL : (BYTE*) &ret.pbAttr, &cbAttrLen);
|
status = SCardGetAttrib(hCard, call.dwAttrId, (cbAttrLen == 0) ? NULL : (BYTE*) &ret.pbAttr, &cbAttrLen);
|
||||||
|
@ -1754,7 +1612,7 @@ static UINT32 handle_LocateCardsByATR(SMARTCARD_DEVICE* smartcard, IRP* irp, BOO
|
||||||
Stream_Read_UINT32(irp->input, hContext);
|
Stream_Read_UINT32(irp->input, hContext);
|
||||||
Stream_Read_UINT32(irp->input, atrMaskCount);
|
Stream_Read_UINT32(irp->input, atrMaskCount);
|
||||||
|
|
||||||
pAtrMasks = calloc(atrMaskCount, sizeof(SCARD_ATRMASK));
|
pAtrMasks = (SCARD_ATRMASK*) calloc(atrMaskCount, sizeof(SCARD_ATRMASK));
|
||||||
|
|
||||||
if (!pAtrMasks)
|
if (!pAtrMasks)
|
||||||
return smartcard_output_return(irp, SCARD_E_NO_MEMORY);
|
return smartcard_output_return(irp, SCARD_E_NO_MEMORY);
|
||||||
|
@ -1768,7 +1626,7 @@ static UINT32 handle_LocateCardsByATR(SMARTCARD_DEVICE* smartcard, IRP* irp, BOO
|
||||||
|
|
||||||
Stream_Read_UINT32(irp->input, readerCount);
|
Stream_Read_UINT32(irp->input, readerCount);
|
||||||
|
|
||||||
readerStates = calloc(readerCount, sizeof(SCARD_READERSTATE));
|
readerStates = (SCARD_READERSTATEA*) calloc(readerCount, sizeof(SCARD_READERSTATEA));
|
||||||
|
|
||||||
for (i = 0; i < readerCount; i++)
|
for (i = 0; i < readerCount; i++)
|
||||||
{
|
{
|
||||||
|
@ -1919,9 +1777,19 @@ void smartcard_irp_device_control(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
WLog_Print(smartcard->log, WLOG_WARN, "ioControlCode: %s (0x%08X) FileId: %d CompletionId: %d",
|
WLog_Print(smartcard->log, WLOG_DEBUG, "IoControlCode: %s (0x%08X) FileId: %d CompletionId: %d",
|
||||||
smartcard_get_ioctl_string(ioControlCode), ioControlCode, irp->FileId, irp->CompletionId);
|
smartcard_get_ioctl_string(ioControlCode), ioControlCode, irp->FileId, irp->CompletionId);
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
if ((ioControlCode != SCARD_IOCTL_TRANSMIT) &&
|
||||||
|
(ioControlCode != SCARD_IOCTL_GETSTATUSCHANGEA) &&
|
||||||
|
(ioControlCode != SCARD_IOCTL_GETSTATUSCHANGEW))
|
||||||
|
{
|
||||||
|
printf("IoControlCode: %s (0x%08X) FileId: %d CompletionId: %d\n",
|
||||||
|
smartcard_get_ioctl_string(ioControlCode), ioControlCode, irp->FileId, irp->CompletionId);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((ioControlCode != SCARD_IOCTL_ACCESSSTARTEDEVENT) &&
|
if ((ioControlCode != SCARD_IOCTL_ACCESSSTARTEDEVENT) &&
|
||||||
(ioControlCode != SCARD_IOCTL_RELEASESTARTEDEVENT))
|
(ioControlCode != SCARD_IOCTL_RELEASESTARTEDEVENT))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue