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

📄 scard.c

📁 LInux 下的远程桌面工具 Rdesktop
💻 C
📖 第 1 页 / 共 5 页
字号:
			out_uint8p(out, pbAttr, dwAttrLen);		}		outRepos(out, dwAttrLen);		out_uint32_le(out, 0x00000000);	}	outForceAlignment(out, 8);	return rv;}static MYPCSC_DWORDTS_SCardSetAttrib(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hCard;	MYPCSC_SCARDCONTEXT myHCard;	SERVER_DWORD dwAttrId;	SERVER_DWORD dwAttrLen;	unsigned char *pbAttr;	PMEM_HANDLE lcHandle = NULL;	in->p += 0x20;	in_uint32_le(in, dwAttrId);	in->p += 0x04;	in_uint32_le(in, dwAttrLen);	in->p += 0x0C;	in_uint32_le(in, hCard);	myHCard = scHandleToMyPCSC(hCard);	dwAttrId = dwAttrId & 0x0000FFFF;	DEBUG_SCARD(("SCARD: SCardSetAttrib(hcard: 0x%08x [0x%08lx], attrib: 0x%08x (%d bytes))\n",		     (unsigned) hCard, (unsigned long) myHCard,		     (unsigned) dwAttrId, (int) dwAttrLen));	if (dwAttrLen > MAX_BUFFER_SIZE)		dwAttrLen = MAX_BUFFER_SIZE;	pbAttr = SC_xmalloc(&lcHandle, dwAttrLen);	if (!pbAttr)		return SC_returnNoMemoryError(&lcHandle, in, out);	in_uint8a(in, pbAttr, dwAttrLen);	rv = SCardSetAttrib(myHCard, (MYPCSC_DWORD) dwAttrId, pbAttr, (MYPCSC_DWORD) dwAttrLen);	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, 0x00000000);	out_uint32_le(out, 0x00000200);	out_uint32_le(out, 0x00000000);	out_uint32_le(out, 0x00000000);	outForceAlignment(out, 8);	SC_xfreeallmemory(&lcHandle);	return rv;}#endifstatic MYPCSC_DWORDTS_SCardControl(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hContext;	SERVER_SCARDHANDLE hCard;	MYPCSC_SCARDHANDLE myHCard;	SERVER_DWORD map[3];	SERVER_DWORD dwControlCode;	unsigned char *pInBuffer, *pOutBuffer;	SERVER_DWORD nInBufferSize, nOutBufferSize, nOutBufferRealSize, nBytesReturned;	MYPCSC_DWORD sc_nBytesReturned;	PMEM_HANDLE lcHandle = NULL;	pInBuffer = NULL;	pOutBuffer = NULL;	in->p += 0x14;	in_uint32_le(in, map[0]);	in->p += 0x04;	in_uint32_le(in, map[1]);	in_uint32_le(in, dwControlCode);	in_uint32_le(in, nInBufferSize);	in_uint32_le(in, map[2]);	in->p += 0x04;	in_uint32_le(in, nOutBufferSize);	in->p += 0x04;	in_uint32_le(in, hContext);	in->p += 0x04;	in_uint32_le(in, hCard);	if (map[2] & INPUT_LINKED)	{		/* read real input size */		in_uint32_le(in, nInBufferSize);		pInBuffer = SC_xmalloc(&lcHandle, nInBufferSize);		if (!pInBuffer)			return SC_returnNoMemoryError(&lcHandle, in, out);		in_uint8a(in, pInBuffer, nInBufferSize);	}#if 0	if (nOutBufferSize > 0)	{		nOutBufferRealSize = nOutBufferSize;	}	else#endif		nOutBufferRealSize = 1024;	nBytesReturned = nOutBufferRealSize;	nBytesReturned = nOutBufferRealSize;	pOutBuffer = SC_xmalloc(&lcHandle, nOutBufferRealSize);	if (!pOutBuffer)		return SC_returnNoMemoryError(&lcHandle, in, out);	DEBUG_SCARD(("SCARD: SCardControl(context: 0x%08x, hcard: 0x%08x, code: 0x%08x, in: %d bytes, out: %d bytes)\n", (unsigned) hContext, (unsigned) hCard, (unsigned) dwControlCode, (int) nInBufferSize, (int) nOutBufferSize));	sc_nBytesReturned = nBytesReturned;	myHCard = scHandleToMyPCSC(hCard);#ifdef WITH_PCSC120	rv = SCardControl(myHCard, pInBuffer, (MYPCSC_DWORD) nInBufferSize, pOutBuffer,			  &sc_nBytesReturned);#else	rv = SCardControl(myHCard, (MYPCSC_DWORD) dwControlCode, pInBuffer,			  (MYPCSC_DWORD) nInBufferSize, pOutBuffer,			  (MYPCSC_DWORD) nOutBufferRealSize, &sc_nBytesReturned);#endif	nBytesReturned = sc_nBytesReturned;	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 (out: %d bytes)\n", (int) nBytesReturned));	}	out_uint32_le(out, nBytesReturned);	out_uint32_le(out, 0x00000004);	out_uint32_le(out, nBytesReturned);	if (nBytesReturned > 0)	{		out_uint8p(out, pOutBuffer, nBytesReturned);		outRepos(out, nBytesReturned);	}	outForceAlignment(out, 8);	SC_xfreeallmemory(&lcHandle);	return rv;}static MYPCSC_DWORDTS_SCardAccessStartedEvent(STREAM in, STREAM out){	DEBUG_SCARD(("SCARD: SCardAccessStartedEvent()\n"));	out_uint8s(out, 8);	return SCARD_S_SUCCESS;}static RD_NTSTATUSscard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out){	SERVER_DWORD Result = 0x00000000;	unsigned char *psize, *pend, *pStatusCode;	SERVER_DWORD addToEnd = 0;	/* Processing request */	out_uint32_le(out, 0x00081001);	/* Header lines */	out_uint32_le(out, 0xCCCCCCCC);	psize = out->p;	out_uint32_le(out, 0x00000000);	/* Size of data portion */	out_uint32_le(out, 0x00000000);	/* Zero bytes (may be usefull) */	pStatusCode = out->p;	out_uint32_le(out, 0x00000000);	/* Status Code */	switch (request)	{			/* SCardEstablishContext */		case SC_ESTABLISH_CONTEXT:			{				Result = (SERVER_DWORD) TS_SCardEstablishContext(in, out);				break;			}			/* SCardReleaseContext */		case SC_RELEASE_CONTEXT:			{				Result = (SERVER_DWORD) TS_SCardReleaseContext(in, out);				break;			}			/* SCardIsValidContext */		case SC_IS_VALID_CONTEXT:			{				Result = (SERVER_DWORD) TS_SCardIsValidContext(in, out);				break;			}			/* SCardListReaders */		case SC_LIST_READERS:	/* SCardListReadersA */		case SC_LIST_READERS + 4:	/* SCardListReadersW */			{				RD_BOOL wide = request != SC_LIST_READERS;				Result = (SERVER_DWORD) TS_SCardListReaders(in, out, wide);				break;			}			/* ScardConnect */		case SC_CONNECT:	/* ScardConnectA */		case SC_CONNECT + 4:	/* SCardConnectW */			{				RD_BOOL wide = request != SC_CONNECT;				Result = (SERVER_DWORD) TS_SCardConnect(in, out, wide);				break;			}			/* ScardReconnect */		case SC_RECONNECT:			{				Result = (SERVER_DWORD) TS_SCardReconnect(in, out);				break;			}			/* ScardDisconnect */		case SC_DISCONNECT:			{				Result = (SERVER_DWORD) TS_SCardDisconnect(in, out);				break;			}			/* ScardGetStatusChange */		case SC_GET_STATUS_CHANGE:	/* SCardGetStatusChangeA */		case SC_GET_STATUS_CHANGE + 4:	/* SCardGetStatusChangeW */			{				RD_BOOL wide = request != SC_GET_STATUS_CHANGE;				Result = (SERVER_DWORD) TS_SCardGetStatusChange(in, out, wide);				break;			}			/* SCardCancel */		case SC_CANCEL:			{				Result = (SERVER_DWORD) TS_SCardCancel(in, out);				break;			}			/* SCardLocateCardsByATR */		case SC_LOCATE_CARDS_BY_ATR:	/* SCardLocateCardsByATRA */		case SC_LOCATE_CARDS_BY_ATR + 4:	/* SCardLocateCardsByATRW */			{				RD_BOOL wide = request != SC_LOCATE_CARDS_BY_ATR;				Result = (SERVER_DWORD) TS_SCardLocateCardsByATR(in, out, wide);				break;			}			/* SCardBeginTransaction */		case SC_BEGIN_TRANSACTION:			{				Result = (SERVER_DWORD) TS_SCardBeginTransaction(in, out);				break;			}			/* SCardBeginTransaction */		case SC_END_TRANSACTION:			{				Result = (SERVER_DWORD) TS_SCardEndTransaction(in, out);				break;			}			/* ScardTransmit */		case SC_TRANSMIT:			{				Result = (SERVER_DWORD) TS_SCardTransmit(in, out);				break;			}			/* SCardControl */		case SC_CONTROL:			{				Result = (SERVER_DWORD) TS_SCardControl(in, out);				break;			}			/* SCardGetAttrib */#ifndef WITH_PCSC120		case SC_GETATTRIB:			{				Result = (SERVER_DWORD) TS_SCardGetAttrib(in, out);				break;			}#endif		case SC_ACCESS_STARTED_EVENT:			{				Result = (SERVER_DWORD) TS_SCardAccessStartedEvent(in, out);				break;			}		case SC_STATUS:	/* SCardStatusA */		case SC_STATUS + 4:	/* SCardStatusW */			{				RD_BOOL wide = request != SC_STATUS;				Result = (SERVER_DWORD) TS_SCardStatus(in, out, wide);				break;			}		case SC_STATE:	/* SCardState */			{				Result = (SERVER_DWORD) TS_SCardState(in, out);				break;			}		default:			{				warning("SCARD: Unknown function %d\n", (int) request);				Result = 0x80100014;				out_uint8s(out, 256);				break;			}	}#if 0	out_uint32_le(out, 0x00000000);#endif	/* Setting modified variables */	pend = out->p;	/* setting data size */	out->p = psize;	out_uint32_le(out, pend - psize - 16);	/* setting status code */	out->p = pStatusCode;	out_uint32_le(out, Result);	/* finish */	out->p = pend;	addToEnd = (pend - pStatusCode) % 16;	if (addToEnd < 16 && addToEnd > 0)	{		out_uint8s(out, addToEnd);	}	return RD_STATUS_SUCCESS;}/* Thread functions */static STREAMduplicateStream(PMEM_HANDLE * handle, STREAM s, uint32 buffer_size, RD_BOOL isInputStream){	STREAM d = SC_xmalloc(handle, sizeof(struct stream));	if (d != NULL)	{		if (isInputStream)			d->size = (size_t) (s->end) - (size_t) (s->data);		else if (buffer_size < s->size)			d->size = s->size;		else			d->size = buffer_size;		d->data = SC_xmalloc(handle, d->size);		d->end = (void *) ((size_t) (d->data) + (size_t) (s->end) - (size_t) (s->data));		d->p = (void *) ((size_t) (d->data) + (size_t) (s->p) - (size_t) (s->data));		d->iso_hdr =			(void *) ((size_t) (d->data) + (size_t) (s->iso_hdr) - (size_t) (s->data));		d->mcs_hdr =			(void *) ((size_t) (d->data) + (size_t) (s->mcs_hdr) - (size_t) (s->data));		d->sec_hdr =			(void *) ((size_t) (d->data) + (size_t) (s->sec_hdr) - (size_t) (s->data));		d->sec_hdr =			(void *) ((size_t) (d->data) + (size_t) (s->sec_hdr) - (size_t) (s->data));		d->rdp_hdr =			(void *) ((size_t) (d->data) + (size_t) (s->rdp_hdr) - (size_t) (s->data));		d->channel_hdr =			(void *) ((size_t) (d->data) + (size_t) (s->channel_hdr) -				  (size_t) (s->data));		if (isInputStream)			memcpy(d->data, s->data, (size_t) (s->end) - (size_t) (s->data));		else			memcpy(d->data, s->data, (size_t) (s->p) - (size_t) (s->data));	}	return d;}static voidfreeStream(PMEM_HANDLE * handle, STREAM s){	if (s != NULL)	{		if (s->data != NULL)			SC_xfree(handle, s->data);		SC_xfree(handle, s);	}}static PSCThreadDataSC_addToQueue(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out){	PMEM_HANDLE lcHandle = NULL;	PSCThreadData data = SC_xmalloc(&lcHandle, sizeof(TSCThreadData));	if (!data)		return NULL;	else	{		data->memHandle = lcHandle;		data->device = curDevice;		data->id = curId;		data->handle = handle;		data->request = request;		data->in = duplicateStream(&(data->memHandle), in, 0, SC_TRUE);		if (data->in == NULL)		{			SC_xfreeallmemory(&(data->memHandle));			return NULL;		}		data->out =			duplicateStream(&(data->memHandle), out, OUT_STREAM_SIZE + curBytesOut,					SC_FALSE);		if (data->out == NULL)		{			SC_xfreeallmemory(&(data->memHandle));			return NULL;		}		data->next = NULL;		pthread_mutex_lock(&queueAccess);		if (queueLast)			queueLast->next = data;		queueLast = data;		if (!queueFirst)			queueFirst = data;		pthread_cond_broadcast(&queueEmpty);		pthread_mutex_unlock(&queueAccess);	}	return data;}static voidSC_destroyThreadData(PSCThreadData data){	if (data)	{		PMEM_HANDLE handle = data->memHandle;		SC_xfreeallmemory(&handle);	}}static PSCThreadDataSC_getNextInQueue(){	PSCThreadData Result = NULL;	pthread_mutex_lock(&queueAccess);	while (queueFirst == NULL)		pthread_cond_wait(&queueEmpty, &queueAccess);	Result = queueFirst;	queueFirst = queueFirst->next;	if (!queueFirst)	{		queueLast = NULL;	}	Result->next = NULL;	pthread_mutex_unlock(&queueAccess);	return Result;}static voidSC_deviceControl(PSCThreadData data){	size_t buffer_len = 0;	scard_device_control(data->handle, data->request, data->in, data->out);	buffer_len = (size_t) data->out->p - (size_t) data->out->data;	rdpdr_send_completion(data->device, data->id, 0, buffer_len, data->out->data, buffer_len);	SC_destroyThreadData(data);}static void *thread_function(PThreadListElement listElement){	pthread_mutex_lock(&listElement->busy);	while (1)	{		while (listElement->data == NULL)			pthread_cond_wait(&listElement->nodata, &listElement->busy);		SC_deviceControl(listElement->data);		listElement->data = NULL;	}	pthread_mutex_unlock(&listElement->busy);	pthread_exit(NULL);	return NULL;}static voidSC_handleRequest(PSCThreadData data

⌨️ 快捷键说明

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