mirror of https://github.com/FreeRDP/FreeRDP
Merge branch 'smartcard' of github.com:awakecoding/FreeRDP into smartcard
This commit is contained in:
commit
7ff35d11ce
|
@ -282,82 +282,6 @@ static UINT32 handle_RedirHandleRef(SMARTCARD_DEVICE* smartcard, IRP* irp, SCARD
|
|||
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)
|
||||
{
|
||||
BYTE* p;
|
||||
|
@ -859,13 +783,6 @@ UINT32 handle_ConnectA(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
if (status)
|
||||
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,
|
||||
(DWORD) call.Common.dwPreferredProtocols, &hCard, (DWORD*) &ret.dwActiveProtocol);
|
||||
|
||||
|
@ -955,12 +872,6 @@ static UINT32 handle_Reconnect(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
if (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,
|
||||
(DWORD) call.dwInitialization, (LPDWORD) &ret.dwActiveProtocol);
|
||||
|
||||
|
@ -996,12 +907,6 @@ static UINT32 handle_Disconnect(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
if (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);
|
||||
|
||||
ZeroMemory(&smartcard->hCard, sizeof(smartcard->hCard));
|
||||
|
@ -1037,12 +942,6 @@ static UINT32 handle_BeginTransaction(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
if (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);
|
||||
|
||||
smartcard_output_alignment(irp, 8);
|
||||
|
@ -1076,12 +975,6 @@ static UINT32 handle_EndTransaction(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
if (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);
|
||||
|
||||
smartcard_output_alignment(irp, 8);
|
||||
|
@ -1121,13 +1014,6 @@ static UINT32 handle_State(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
if (status)
|
||||
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;
|
||||
|
||||
ret.rgAtr = atr;
|
||||
|
@ -1196,16 +1082,9 @@ static DWORD handle_Status(SMARTCARD_DEVICE* smartcard, IRP* irp, BOOL wide)
|
|||
if (status)
|
||||
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;
|
||||
}
|
||||
|
||||
pbAtr = malloc(sizeof(BYTE) * atrLen);
|
||||
|
||||
pbAtr = (BYTE*) malloc(atrLen);
|
||||
readerLen = SCARD_AUTOALLOCATE;
|
||||
|
||||
status = SCardStatusA(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
|
||||
|
||||
if (status != SCARD_S_SUCCESS)
|
||||
|
@ -1453,13 +1332,6 @@ static UINT32 handle_Transmit(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
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,
|
||||
pPioRecvPci, recvBuf, &cbRecvLength);
|
||||
|
||||
|
@ -1558,21 +1430,14 @@ static UINT32 handle_Control(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
goto finish;
|
||||
}
|
||||
|
||||
call.pvInBuffer = malloc(length);
|
||||
call.pvInBuffer = (BYTE*) malloc(length);
|
||||
call.cbInBufferSize = length;
|
||||
|
||||
Stream_Read(irp->input, call.pvInBuffer, length);
|
||||
}
|
||||
|
||||
ret.cbOutBufferSize = call.cbOutBufferSize;
|
||||
ret.pvOutBuffer = 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;
|
||||
}
|
||||
ret.pvOutBuffer = (BYTE*) malloc(call.cbOutBufferSize);
|
||||
|
||||
status = SCardControl(hCard, (DWORD) call.dwControlCode,
|
||||
call.pvInBuffer, (DWORD) call.cbInBufferSize,
|
||||
|
@ -1629,14 +1494,7 @@ static UINT32 handle_GetAttrib(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
if (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;
|
||||
|
||||
cbAttrLen = (call.cbAttrLen == 0) ? 0 : SCARD_AUTOALLOCATE;
|
||||
|
||||
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, atrMaskCount);
|
||||
|
||||
pAtrMasks = calloc(atrMaskCount, sizeof(SCARD_ATRMASK));
|
||||
pAtrMasks = (SCARD_ATRMASK*) calloc(atrMaskCount, sizeof(SCARD_ATRMASK));
|
||||
|
||||
if (!pAtrMasks)
|
||||
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);
|
||||
|
||||
readerStates = calloc(readerCount, sizeof(SCARD_READERSTATE));
|
||||
readerStates = (SCARD_READERSTATEA*) calloc(readerCount, sizeof(SCARD_READERSTATEA));
|
||||
|
||||
for (i = 0; i < readerCount; i++)
|
||||
{
|
||||
|
@ -1919,9 +1777,19 @@ void smartcard_irp_device_control(SMARTCARD_DEVICE* smartcard, IRP* irp)
|
|||
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);
|
||||
|
||||
#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) &&
|
||||
(ioControlCode != SCARD_IOCTL_RELEASESTARTEDEVENT))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue