Remove undocumented voodoo in SCardGetStatusChange() as it causes the
system version to return immediately, causing CPU intensive loops. git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/rdesktop/trunk@1594 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
parent
a22d20b871
commit
4635dfc148
86
scard.c
86
scard.c
@ -32,6 +32,9 @@
|
|||||||
#include <wintypes.h>
|
#include <wintypes.h>
|
||||||
#include <pcsclite.h>
|
#include <pcsclite.h>
|
||||||
#include <winscard.h>
|
#include <winscard.h>
|
||||||
|
#ifdef PCSCLITE_VERSION_NUMBER
|
||||||
|
#include <reader.h>
|
||||||
|
#endif
|
||||||
#endif /* PCSC_OSX */
|
#endif /* PCSC_OSX */
|
||||||
#include "rdesktop.h"
|
#include "rdesktop.h"
|
||||||
#include "scard.h"
|
#include "scard.h"
|
||||||
@ -965,21 +968,6 @@ mappedStatus(MYPCSC_DWORD code)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static MYPCSC_DWORD
|
|
||||||
incStatus(MYPCSC_DWORD code, RD_BOOL mapped)
|
|
||||||
{
|
|
||||||
if (mapped || (code & SCARD_STATE_CHANGED))
|
|
||||||
{
|
|
||||||
MYPCSC_DWORD count = (code >> 16) & 0x0000FFFF;
|
|
||||||
count++;
|
|
||||||
if (mapped && !(count % 2))
|
|
||||||
count++;
|
|
||||||
return (code & 0x0000FFFF) | (count << 16);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copyReaderState_MyPCSCToServer(MYPCSC_LPSCARD_READERSTATE_A src, SERVER_LPSCARD_READERSTATE_A dst,
|
copyReaderState_MyPCSCToServer(MYPCSC_LPSCARD_READERSTATE_A src, SERVER_LPSCARD_READERSTATE_A dst,
|
||||||
MYPCSC_DWORD readerCount)
|
MYPCSC_DWORD readerCount)
|
||||||
@ -1027,13 +1015,9 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
|||||||
SERVER_DWORD dwTimeout;
|
SERVER_DWORD dwTimeout;
|
||||||
SERVER_DWORD dwCount;
|
SERVER_DWORD dwCount;
|
||||||
SERVER_LPSCARD_READERSTATE_A rsArray, cur;
|
SERVER_LPSCARD_READERSTATE_A rsArray, cur;
|
||||||
SERVER_DWORD *stateArray = NULL, *curState;
|
|
||||||
MYPCSC_LPSCARD_READERSTATE_A myRsArray;
|
MYPCSC_LPSCARD_READERSTATE_A myRsArray;
|
||||||
long i;
|
long i;
|
||||||
PMEM_HANDLE lcHandle = NULL;
|
PMEM_HANDLE lcHandle = NULL;
|
||||||
#if 0
|
|
||||||
RD_BOOL mapped = False;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
in->p += 0x18;
|
in->p += 0x18;
|
||||||
in_uint32_le(in, dwTimeout);
|
in_uint32_le(in, dwTimeout);
|
||||||
@ -1051,9 +1035,6 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
|||||||
if (!rsArray)
|
if (!rsArray)
|
||||||
return SC_returnNoMemoryError(&lcHandle, in, out);
|
return SC_returnNoMemoryError(&lcHandle, in, out);
|
||||||
memset(rsArray, 0, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));
|
memset(rsArray, 0, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));
|
||||||
stateArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_DWORD));
|
|
||||||
if (!stateArray)
|
|
||||||
return SC_returnNoMemoryError(&lcHandle, in, out);
|
|
||||||
/* skip two pointers at beginning of struct */
|
/* skip two pointers at beginning of struct */
|
||||||
for (i = 0, cur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2);
|
for (i = 0, cur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2);
|
||||||
i < dwCount; i++, cur++)
|
i < dwCount; i++, cur++)
|
||||||
@ -1062,8 +1043,7 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
|||||||
in_uint8a(in, cur, SERVER_SCARDSTATESIZE);
|
in_uint8a(in, cur, SERVER_SCARDSTATESIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, cur = rsArray, curState = stateArray;
|
for (i = 0, cur = rsArray; i < dwCount; i++, cur++)
|
||||||
i < dwCount; i++, cur++, curState++)
|
|
||||||
{
|
{
|
||||||
SERVER_DWORD dataLength;
|
SERVER_DWORD dataLength;
|
||||||
|
|
||||||
@ -1072,31 +1052,6 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
|||||||
cur->dwEventState = swap32(cur->dwEventState);
|
cur->dwEventState = swap32(cur->dwEventState);
|
||||||
cur->cbAtr = swap32(cur->cbAtr);
|
cur->cbAtr = swap32(cur->cbAtr);
|
||||||
|
|
||||||
/* reset Current state hign bytes; */
|
|
||||||
*curState = cur->dwCurrentState;
|
|
||||||
cur->dwCurrentState &= 0x0000FFFF;
|
|
||||||
cur->dwEventState &= 0x0000FFFF;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (cur->dwCurrentState == (SCARD_STATE_CHANGED | SCARD_STATE_PRESENT))
|
|
||||||
{
|
|
||||||
cur->dwCurrentState = 0x00000000;
|
|
||||||
mapped = True;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mappedStatus(*curState))
|
|
||||||
{
|
|
||||||
cur->dwCurrentState &= ~SCARD_STATE_INUSE;
|
|
||||||
cur->dwEventState &= ~SCARD_STATE_INUSE;
|
|
||||||
|
|
||||||
if (cur->dwCurrentState & SCARD_STATE_EMPTY)
|
|
||||||
{
|
|
||||||
cur->dwCurrentState &= ~SCARD_STATE_EMPTY;
|
|
||||||
cur->dwCurrentState |= SCARD_STATE_UNKNOWN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
in->p += 0x08;
|
in->p += 0x08;
|
||||||
in_uint32_le(in, dataLength);
|
in_uint32_le(in, dataLength);
|
||||||
inRepos(in,
|
inRepos(in,
|
||||||
@ -1110,14 +1065,11 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
|||||||
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
|
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
|
||||||
(unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
|
(unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
|
||||||
(unsigned) cur->dwEventState));
|
(unsigned) cur->dwEventState));
|
||||||
DEBUG_SCARD(("SCARD: current state: 0x%08x\n",
|
|
||||||
(unsigned) *curState));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rsArray = NULL;
|
rsArray = NULL;
|
||||||
stateArray = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
myRsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A));
|
myRsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A));
|
||||||
@ -1144,36 +1096,8 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
|||||||
out_uint32_le(out, 0x00084dd8);
|
out_uint32_le(out, 0x00084dd8);
|
||||||
out_uint32_le(out, dwCount);
|
out_uint32_le(out, dwCount);
|
||||||
|
|
||||||
for (i = 0, cur = rsArray, curState = stateArray; i < dwCount; i++, cur++, curState++)
|
for (i = 0, cur = rsArray; i < dwCount; i++, cur++)
|
||||||
{
|
{
|
||||||
|
|
||||||
cur->dwCurrentState = (*curState);
|
|
||||||
cur->dwEventState |= (*curState) & 0xFFFF0000;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (mapped && (cur->dwCurrentState & SCARD_STATE_PRESENT)
|
|
||||||
&& (cur->dwCurrentState & SCARD_STATE_CHANGED)
|
|
||||||
&& (cur->dwEventState & SCARD_STATE_PRESENT)
|
|
||||||
&& (cur->dwEventState & SCARD_STATE_CHANGED))
|
|
||||||
{
|
|
||||||
cur->dwEventState |= SCARD_STATE_INUSE;
|
|
||||||
}
|
|
||||||
else if (cur->dwEventState & SCARD_STATE_UNKNOWN)
|
|
||||||
{
|
|
||||||
cur->dwEventState &= ~SCARD_STATE_UNKNOWN;
|
|
||||||
cur->dwEventState |= SCARD_STATE_EMPTY;
|
|
||||||
mapped = True;
|
|
||||||
}
|
|
||||||
else if ((!mapped) && (cur->dwEventState & SCARD_STATE_INUSE))
|
|
||||||
{
|
|
||||||
mapped = True;
|
|
||||||
cur->dwEventState &= ~SCARD_STATE_INUSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
cur->dwEventState = incStatus(cur->dwEventState, mapped);
|
|
||||||
#endif
|
|
||||||
cur->dwEventState = incStatus(cur->dwEventState, False);
|
|
||||||
|
|
||||||
DEBUG_SCARD(("SCARD: \"%s\"\n", cur->szReader ? cur->szReader : "NULL"));
|
DEBUG_SCARD(("SCARD: \"%s\"\n", cur->szReader ? cur->szReader : "NULL"));
|
||||||
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
|
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
|
||||||
(unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
|
(unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
|
||||||
|
Loading…
Reference in New Issue
Block a user