⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scard.c

📁 LInux 下的远程桌面工具 Rdesktop
💻 C
📖 第 1 页 / 共 5 页
字号:
{	SERVER_LPSCARD_READERSTATE_A srcIter;	MYPCSC_LPSCARD_READERSTATE_A dstIter;	SERVER_DWORD i;	for (i = 0, srcIter = src, dstIter = dst; i < readerCount; i++, srcIter++, dstIter++)	{		dstIter->szReader = srcIter->szReader;		dstIter->pvUserData = srcIter->pvUserData;		dstIter->dwCurrentState = srcIter->dwCurrentState;		dstIter->dwEventState = srcIter->dwEventState;		dstIter->cbAtr = srcIter->cbAtr;		memcpy(dstIter->rgbAtr, srcIter->rgbAtr, MAX_ATR_SIZE * sizeof(unsigned char));	}}static MYPCSC_DWORDTS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hContext;	SERVER_DWORD dwTimeout;	SERVER_DWORD dwCount;	SERVER_LPSCARD_READERSTATE_A rsArray, cur;	SERVER_DWORD *stateArray = NULL, *curState;	MYPCSC_LPSCARD_READERSTATE_A myRsArray;	long i;	PMEM_HANDLE lcHandle = NULL;#if 0	RD_BOOL mapped = False;#endif	in->p += 0x18;	in_uint32_le(in, dwTimeout);	in_uint32_le(in, dwCount);	in->p += 0x08;	in_uint32_le(in, hContext);	in->p += 0x04;	DEBUG_SCARD(("SCARD: SCardGetStatusChange(context: 0x%08x, timeout: 0x%08x, count: %d)\n",		     (unsigned) hContext, (unsigned) dwTimeout, (int) dwCount));	if (dwCount > 0)	{		rsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));		if (!rsArray)			return SC_returnNoMemoryError(&lcHandle, in, out);		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 */		for (i = 0, cur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2);		     i < dwCount; i++, cur++)		{			in->p += 0x04;			in_uint8a(in, cur, SERVER_SCARDSTATESIZE);		}		for (i = 0, cur = rsArray, curState = stateArray;		     i < dwCount; i++, cur++, curState++)		{			SERVER_DWORD dataLength;			/* Do endian swaps... */			cur->dwCurrentState = swap32(cur->dwCurrentState);			cur->dwEventState = swap32(cur->dwEventState);			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_uint32_le(in, dataLength);			inRepos(in,				inString(&lcHandle, in, (char **) &(cur->szReader), dataLength,					 wide));			if (strcmp(cur->szReader, "\\\\?PnP?\\Notification") == 0)				cur->dwCurrentState |= SCARD_STATE_IGNORE;			DEBUG_SCARD(("SCARD:    \"%s\"\n", cur->szReader ? cur->szReader : "NULL"));			DEBUG_SCARD(("SCARD:        user: 0x%08x, state: 0x%08x, event: 0x%08x\n",				     (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,				     (unsigned) cur->dwEventState));			DEBUG_SCARD(("SCARD:            current state: 0x%08x\n",				     (unsigned) *curState));		}	}	else	{		rsArray = NULL;		stateArray = NULL;	}	myRsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A));	if (!rsArray)		return SC_returnNoMemoryError(&lcHandle, in, out);	memset(myRsArray, 0, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));	copyReaderState_ServerToMyPCSC(rsArray, myRsArray, (SERVER_DWORD) dwCount);	rv = SCardGetStatusChange((MYPCSC_SCARDCONTEXT) hContext, (MYPCSC_DWORD) dwTimeout,				  myRsArray, (MYPCSC_DWORD) dwCount);	copyReaderState_MyPCSCToServer(myRsArray, rsArray, (MYPCSC_DWORD) dwCount);	if (rv != SCARD_S_SUCCESS)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		DEBUG_SCARD(("SCARD: -> Success\n"));	}	out_uint32_le(out, dwCount);	out_uint32_le(out, 0x00084dd8);	out_uint32_le(out, dwCount);	for (i = 0, cur = rsArray, curState = stateArray; i < dwCount; i++, cur++, curState++)	{		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:        user: 0x%08x, state: 0x%08x, event: 0x%08x\n",			     (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,			     (unsigned) cur->dwEventState));		/* Do endian swaps... */		cur->dwCurrentState = swap32(cur->dwCurrentState);		cur->dwEventState = swap32(cur->dwEventState);		cur->cbAtr = swap32(cur->cbAtr);		out_uint8p(out, (void *) ((unsigned char **) cur + 2),			   sizeof(SERVER_SCARD_READERSTATE_A) - 2 * sizeof(unsigned char *));	}	outForceAlignment(out, 8);	SC_xfreeallmemory(&lcHandle);	return rv;}static MYPCSC_DWORDTS_SCardCancel(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hContext;	in->p += 0x1C;	in_uint32_le(in, hContext);	DEBUG_SCARD(("SCARD: SCardCancel(context: 0x%08x)\n", (unsigned) hContext));	rv = SCardCancel((MYPCSC_SCARDCONTEXT) hContext);	if (rv != SCARD_S_SUCCESS)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		DEBUG_SCARD(("SCARD: -> Success\n"));	}	outForceAlignment(out, 8);	return rv;}static MYPCSC_DWORDTS_SCardLocateCardsByATR(STREAM in, STREAM out, RD_BOOL wide){	int i, j, k;	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hContext;	/* The SCARD_ATRMASK_L struct doesn't contain any longs or DWORDs -	   no need to split into SERVER_ and MYPCSC_ */	LPSCARD_ATRMASK_L pAtrMasks, cur;	SERVER_DWORD atrMaskCount = 0;	SERVER_DWORD readerCount = 0;	SERVER_LPSCARD_READERSTATE_A rsArray, ResArray, rsCur;	MYPCSC_LPSCARD_READERSTATE_A myRsArray;	PMEM_HANDLE lcHandle = NULL;	in->p += 0x2C;	in_uint32_le(in, hContext);	in_uint32_le(in, atrMaskCount);	pAtrMasks = SC_xmalloc(&lcHandle, atrMaskCount * sizeof(SCARD_ATRMASK_L));	if (!pAtrMasks)		return SC_returnNoMemoryError(&lcHandle, in, out);	in_uint8a(in, pAtrMasks, atrMaskCount * sizeof(SCARD_ATRMASK_L));	in_uint32_le(in, readerCount);	rsArray = SC_xmalloc(&lcHandle, readerCount * sizeof(SCARD_READERSTATE_A));	if (!rsArray)		return SC_returnNoMemoryError(&lcHandle, in, out);	memset(rsArray, 0, readerCount * sizeof(SCARD_READERSTATE_A));	DEBUG_SCARD(("SCARD: SCardLocateCardsByATR(context: 0x%08x, atrs: %d, readers: %d)\n",		     (unsigned) hContext, (int) atrMaskCount, (int) readerCount));	for (i = 0, cur = pAtrMasks; i < atrMaskCount; i++, cur++)	{		cur->cbAtr = swap32(cur->cbAtr);		DEBUG_SCARD(("SCARD:    ATR: "));		for (j = 0; j < pAtrMasks->cbAtr; j++)		{		DEBUG_SCARD(("%02x%c",				     (unsigned) (unsigned char) cur->rgbAtr[j],				     (j == pAtrMasks->cbAtr - 1) ? ' ' : ':'))}		DEBUG_SCARD(("\n"));		DEBUG_SCARD(("SCARD:         "));		for (j = 0; j < pAtrMasks->cbAtr; j++)		{		DEBUG_SCARD(("%02x%c",				     (unsigned) (unsigned char) cur->rgbMask[j],				     (j == pAtrMasks->cbAtr - 1) ? ' ' : ':'))}		DEBUG_SCARD(("\n"));	}	for (i = 0, rsCur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2);	     i < readerCount; i++, rsCur++)	{		in_uint8s(in, 4);		in_uint8a(in, rsCur, SERVER_SCARDSTATESIZE);	}	ResArray = SC_xmalloc(&lcHandle, readerCount * sizeof(SERVER_SCARD_READERSTATE_A));	if (!ResArray)		return SC_returnNoMemoryError(&lcHandle, in, out);	for (i = 0, rsCur = rsArray; i < readerCount; i++, rsCur++)	{		/* Do endian swaps... */		rsCur->dwCurrentState = swap32(rsCur->dwCurrentState);		rsCur->dwEventState = swap32(rsCur->dwEventState);		rsCur->cbAtr = swap32(rsCur->cbAtr);		inReaderName(&lcHandle, in, (char **) &rsCur->szReader, wide);		DEBUG_SCARD(("SCARD:    \"%s\"\n", rsCur->szReader ? rsCur->szReader : "NULL"));		DEBUG_SCARD(("SCARD:        user: 0x%08x, state: 0x%08x, event: 0x%08x\n",			     (unsigned) rsCur->pvUserData, (unsigned) rsCur->dwCurrentState,			     (unsigned) rsCur->dwEventState));	}	memcpy(ResArray, rsArray, readerCount * sizeof(SERVER_SCARD_READERSTATE_A));	/* FIXME segfault here. */	myRsArray = SC_xmalloc(&lcHandle, readerCount * sizeof(MYPCSC_SCARD_READERSTATE_A));	if (!myRsArray)		return SC_returnNoMemoryError(&lcHandle, in, out);	copyReaderState_ServerToMyPCSC(rsArray, myRsArray, readerCount);	rv = SCardGetStatusChange((MYPCSC_SCARDCONTEXT) hContext, 0x00000001, myRsArray,				  readerCount);	copyReaderState_MyPCSCToServer(myRsArray, rsArray, readerCount);	if (rv != SCARD_S_SUCCESS)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		DEBUG_SCARD(("SCARD: -> Success\n"));		cur = pAtrMasks;		for (i = 0, cur = pAtrMasks; i < atrMaskCount; i++, cur++)		{			for (j = 0, rsCur = rsArray; j < readerCount; j++, rsCur++)			{				RD_BOOL equal = 1;				for (k = 0; k < cur->cbAtr; k++)				{					if ((cur->rgbAtr[k] & cur->rgbMask[k]) !=					    (rsCur->rgbAtr[k] & cur->rgbMask[k]))					{						equal = 0;						break;					}				}				if (equal)				{					rsCur->dwEventState |= 0x00000040;	/* SCARD_STATE_ATRMATCH 0x00000040 */					memcpy(ResArray + j, rsCur, sizeof(SCARD_READERSTATE_A));					DEBUG_SCARD(("SCARD:    \"%s\"\n",						     rsCur->szReader ? rsCur->szReader : "NULL"));					DEBUG_SCARD(("SCARD:        user: 0x%08x, state: 0x%08x, event: 0x%08x\n", (unsigned) rsCur->pvUserData, (unsigned) rsCur->dwCurrentState, (unsigned) rsCur->dwEventState));				}			}		}	}	out_uint32_le(out, readerCount);	out_uint32_le(out, 0x00084dd8);	out_uint32_le(out, readerCount);	for (i = 0, rsCur = ResArray; i < readerCount; i++, rsCur++)	{		/* Do endian swaps... */		rsCur->dwCurrentState = swap32(rsCur->dwCurrentState);		rsCur->dwEventState = swap32(rsCur->dwEventState);		rsCur->cbAtr = swap32(rsCur->cbAtr);		out_uint8p(out, (void *) ((unsigned char **) rsCur + 2),			   sizeof(SCARD_READERSTATE_A) - 2 * sizeof(unsigned char *));	}	outForceAlignment(out, 8);	SC_xfreeallmemory(&lcHandle);	return rv;}static DWORDTS_SCardBeginTransaction(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hCard;	MYPCSC_SCARDCONTEXT myHCard;	in->p += 0x30;	in_uint32_le(in, hCard);	myHCard = scHandleToMyPCSC(hCard);	DEBUG_SCARD(("SCARD: SCardBeginTransaction(hcard: 0x%08x [0x%08lx])\n",		     (unsigned) hCard, (unsigned long) myHCard));	rv = SCardBeginTransaction(myHCard);	if (rv != SCARD_S_SUCCESS)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		DEBUG_SCARD(("SCARD: -> Success\n"));	}	outForceAlignment(out, 8);	return rv;}static DWORDTS_SCardEndTransaction(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hCard;	MYPCSC_SCARDCONTEXT myHCard;	SERVER_DWORD dwDisposition = 0;	in->p += 0x20;	in_uint32_le(in, dwDisposition);	in->p += 0x0C;	in_uint32_le(in, hCard);	myHCard = scHandleToMyPCSC(hCard);	DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));	DEBUG_SCARD(("[myHCard = 0x%016lx]\n", (unsigned long) myHCard));	DEBUG_SCARD(("[dwDisposition = 0x%.8x]\n", (unsigned int) dwDisposition));	DEBUG_SCARD(("SCARD: SCardEndTransaction(hcard: 0x%08x [0x%08lx], disposition: 0x%08x)\n",		     (unsigned) hCard, (unsigned long) myHCard, (unsigned) dwDisposition));	rv = SCardEndTransaction(myHCard, (MYPCSC_DWORD) dwDisposition);	if (rv != SCARD_S_SUCCESS)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		DEBUG_SCARD(("SCARD: -> Success\n"));	}	outForceAlignment(out, 8);	return rv;}static voidcopyIORequest_MyPCSCToServer(MYPCSC_LPSCARD_IO_REQUEST src, SERVER_LPSCARD_IO_REQUEST dst){	unsigned char *srcBytes, *dstBytes;	size_t bytesToCopy = src->cbPciLength - sizeof(MYPCSC_SCARD_IO_REQUEST);	srcBytes = ((unsigned char *) src + sizeof(MYPCSC_SCARD_IO_REQUEST));	dstBytes = ((unsigned char *) dst + sizeof(SERVER_SCARD_IO_REQUEST));	dst->dwProtocol = swap32((uint32_t) src->dwProtocol);	dst->cbPciLength = swap32((uint32_t) src->cbPciLength				  - sizeof(MYPCSC_SCARD_IO_REQUEST) +				  sizeof(SERVER_SCARD_IO_REQUEST));	memcpy(dstBytes, srcBytes, bytesToCopy);}static voidcopyIORequest_ServerToMyPCSC(SERVER_LPSCARD_IO_REQUEST src, MYPCSC_LPSCARD_IO_REQUEST dst){	unsigned char *srcBytes, *dstBytes;	size_t bytesToCopy = src->cbPciLength - sizeof(SERVER_SCARD_IO_REQUEST);	srcBytes = ((unsigned char *) src + sizeof(SERVER_SCARD_IO_REQUEST));	dstBytes = ((unsigned char *) dst + sizeof(MYPCSC_SCARD_IO_REQUEST));	dst->dwProtocol = swap32(src->dwProtocol);	dst->cbPciLength = src->cbPciLength	/* already correct endian */		- sizeof(SERVER_SCARD_IO_REQUEST) + sizeof(MYPCSC_SCARD_IO_REQUEST);	memcpy(dstBytes, srcBytes, bytesToCopy);}static DWORDTS_SCardTransmit(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_DWORD map[7], linkedLen;	void *tmp;	SERVER_SCARDCONTEXT hCard;	MYPCSC_SCARDCONTEXT myHCard;	SERVER_LPSCARD_IO_REQUEST pioSendPci, pioRecvPci;	MYPCSC_LPSCARD_IO_REQUEST myPioSendPci, myPioRecvPci;	unsigned char *sendBuf = NULL, *recvBuf = NULL;	SERVER_DWORD cbSendLength, cbRecvLength;	MYPCSC_DWORD myCbRecvLength;	PMEM_HANDLE lcHandle = NULL;	in->p += 0x14;	in_uint32_le(in, map[0]);	in->p += 0x04;	in_uint32_le(in, map[1]);	pioSendPci = SC_xmalloc(&lcHandle, sizeof(SERVER_SCARD_IO_REQUEST));	if (!pioSendPci)		return SC_returnNoMemoryError(&lcHandle, in, out);	in_uint8a(in, pioSendPci, sizeof(SERVER_SCARD_IO_REQUEST));	in_uint32_le(in, map[2]);	in_uint32_le(in, cbSendLength);	in_uint32_le(in, map[3]);	in_uint32_le(in, map[4]);	in_uint32_le(in, map[5]);	in_uint32_le(in, cbRecvLength);	if (map[0] & INPUT_LINKED)		inSkipLinked(in);	in->p += 0x04;	in_uint32_le(in, hCard);	myHCard = scHandleToMyPCSC(hCard);	if (map[2] & INPUT_LINKED)	{		in_uint32_le(in, linkedLen);		pioSendPci->cbPciLength = linkedLen + sizeof(SERVER_SCARD_IO_REQUEST);		tmp = SC_xmalloc(&lcHandle, pioSendPci->cbPciLength);		if (!tmp)			return SC_returnNoMemoryError(&lcHandle, in, out);		in_uint8a(in, (void *) ((unsigned char *) tmp + sizeof(SERVER_SCARD_IO_REQUEST)),			  linkedLen);		memcpy(tmp, pioSendPci, sizeof(SERVER_SCARD_IO_REQUEST));		SC_xfree(&lcHandle, pioSendPci);		pioSendPci = tmp;		tmp = NULL;	}	else		pioSendPci->cbPciLength = sizeof(SERVER_SCARD_IO_REQUEST);	if (map[3] & INPUT_LINKED)	{		in_uint32_le(in, linkedLen);		sendBuf = SC_xmalloc(&lcHandle, linkedLen);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -