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

📄 scard.c

📁 LInux 下的远程桌面工具 Rdesktop
💻 C
📖 第 1 页 / 共 5 页
字号:
inString(PMEM_HANDLE * handle, STREAM in, char **destination, SERVER_DWORD dataLength, RD_BOOL wide){	unsigned int Result = (wide) ? (2 * dataLength) : (dataLength);	PMEM_HANDLE lcHandle = NULL;	char *buffer = SC_xmalloc(&lcHandle, Result + 2);	char *reader;	/* code segment */	if (wide)	{		int i;		in_uint8a(in, buffer, 2 * dataLength);		for (i = 0; i < dataLength; i++)			if ((buffer[2 * i] < 0) || (buffer[2 * i + 1] != 0))				buffer[i] = '?';			else				buffer[i] = buffer[2 * i];	}	else	{		in_uint8a(in, buffer, dataLength);	}	buffer[dataLength] = '\0';	reader = getName(buffer);	*destination = SC_xmalloc(handle, strlen(reader) + 1);	strcpy(*destination, reader);	SC_xfreeallmemory(&lcHandle);	return Result;}static unsigned intoutString(STREAM out, char *source, RD_BOOL wide){	PMEM_HANDLE lcHandle = NULL;	char *reader = getAlias(source);	unsigned int dataLength = strlen(reader) + 1;	unsigned int Result = (wide) ? (2 * dataLength) : (dataLength);	/* code segment */	if (wide)	{		int i;		char *buffer = SC_xmalloc(&lcHandle, Result);		for (i = 0; i < dataLength; i++)		{			if (source[i] < 0)				buffer[2 * i] = '?';			else				buffer[2 * i] = reader[i];			buffer[2 * i + 1] = '\0';		}		out_uint8p(out, buffer, 2 * dataLength);	}	else	{		out_uint8p(out, reader, dataLength);	}	SC_xfreeallmemory(&lcHandle);	return Result;}static voidinReaderName(PMEM_HANDLE * handle, STREAM in, char **destination, RD_BOOL wide){	SERVER_DWORD dataLength;	in->p += 0x08;	in_uint32_le(in, dataLength);	inRepos(in, inString(handle, in, destination, dataLength, wide));}static voidinSkipLinked(STREAM in){	SERVER_DWORD len;	in_uint32_le(in, len);	if (len > 0)	{		in_uint8s(in, len);		inRepos(in, len);	}}/* ---------------------------------- *//*  Smart Card processing functions:  *//* ---------------------------------- */static MYPCSC_DWORDSC_returnCode(MYPCSC_DWORD rc, PMEM_HANDLE * handle, STREAM in, STREAM out){	SC_xfreeallmemory(handle);	out_uint8s(out, 256);	return rc;}static MYPCSC_DWORDSC_returnNoMemoryError(PMEM_HANDLE * handle, STREAM in, STREAM out){	return SC_returnCode(SCARD_E_NO_MEMORY, handle, in, out);}static MYPCSC_DWORDTS_SCardEstablishContext(STREAM in, STREAM out){	MYPCSC_DWORD rv;	MYPCSC_SCARDCONTEXT hContext;	/* code segment  */	DEBUG_SCARD(("SCARD: SCardEstablishContext()\n"));	rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);	if (rv)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		DEBUG_SCARD(("SCARD: -> Success (context: 0x%08lx)\n", hContext));	}	out_uint32_le(out, 0x00000004);	out_uint32_le(out, (SERVER_DWORD) hContext);	/* must not be 0 (Seems to be pointer), don't know what is this (I use hContext as value) */	/* i hope it's not a pointer because i just downcasted it - jlj */	out_uint32_le(out, 0x00000004);	out_uint32_le(out, (SERVER_DWORD) hContext);	return rv;}static MYPCSC_DWORDTS_SCardReleaseContext(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hContext;	in->p += 0x1C;	in_uint32_le(in, hContext);	DEBUG_SCARD(("SCARD: SCardReleaseContext(context: 0x%08x)\n", (unsigned) hContext));	rv = SCardReleaseContext((MYPCSC_SCARDCONTEXT) hContext);	if (rv)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		DEBUG_SCARD(("SCARD: -> Success\n"));	}	return rv;}static MYPCSC_DWORDTS_SCardIsValidContext(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hContext;	char *readers;	DWORD readerCount = 1024;	PMEM_HANDLE lcHandle = NULL;	in->p += 0x1C;	in_uint32_le(in, hContext);	DEBUG_SCARD(("SCARD: SCardIsValidContext(context: 0x%08x)\n", (unsigned) hContext));	/* There is no realization of SCardIsValidContext in PC/SC Lite so we call SCardListReaders */	readers = SC_xmalloc(&lcHandle, 1024);	if (!readers)		return SC_returnNoMemoryError(&lcHandle, in, out);	rv = SCardListReaders((MYPCSC_SCARDCONTEXT) hContext, NULL, readers, &readerCount);	if (rv)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));		rv = SCARD_E_INVALID_HANDLE;	}	else	{		DEBUG_SCARD(("SCARD: -> Success\n"));	}	outForceAlignment(out, 8);	SC_xfreeallmemory(&lcHandle);	return rv;}static MYPCSC_DWORDTS_SCardListReaders(STREAM in, STREAM out, RD_BOOL wide){#define readerArraySize 1024	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hContext;	SERVER_DWORD dataLength;	MYPCSC_DWORD cchReaders = readerArraySize;	unsigned char *plen1, *plen2, *pend;	char *readers, *cur;	PMEM_HANDLE lcHandle = NULL;	in->p += 0x2C;	in_uint32_le(in, hContext);	DEBUG_SCARD(("SCARD: SCardListReaders(context: 0x%08x)\n", (unsigned) hContext));	plen1 = out->p;	out_uint32_le(out, 0x00000000);	/* Temp value for data length as 0x0 */	out_uint32_le(out, 0x01760650);	plen2 = out->p;	out_uint32_le(out, 0x00000000);	/* Temp value for data length as 0x0 */	dataLength = 0;	readers = SC_xmalloc(&lcHandle, readerArraySize);	if (!readers)		return SC_returnNoMemoryError(&lcHandle, in, out);	readers[0] = '\0';	readers[1] = '\0';	rv = SCardListReaders((MYPCSC_SCARDCONTEXT) hContext, NULL, readers, &cchReaders);	cur = readers;	if (rv != SCARD_S_SUCCESS)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		int i;		PSCNameMapRec tmpMap;		DEBUG_SCARD(("SCARD: -> Success\n"));		for (i = 0, tmpMap = nameMapList; i < nameMapCount; i++, tmpMap++)		{			dataLength += outString(out, tmpMap->alias, wide);		}		int lenSC = strlen(cur);		if (lenSC == 0)			dataLength += outString(out, "\0", wide);		else			while (lenSC > 0)			{				if (!hasAlias(cur))				{					DEBUG_SCARD(("SCARD:    \"%s\"\n", cur));					dataLength += outString(out, cur, wide);				}				cur = (void *) ((unsigned char *) cur + lenSC + 1);				lenSC = strlen(cur);			}	}	dataLength += outString(out, "\0", wide);	outRepos(out, dataLength);	pend = out->p;	out->p = plen1;	out_uint32_le(out, dataLength);	out->p = plen2;	out_uint32_le(out, dataLength);	out->p = pend;	outForceAlignment(out, 8);	SC_xfreeallmemory(&lcHandle);	return rv;}static MYPCSC_DWORDTS_SCardConnect(STREAM in, STREAM out, RD_BOOL wide){	MYPCSC_DWORD rv;	SCARDCONTEXT hContext;	char *szReader;	SERVER_DWORD dwShareMode;	SERVER_DWORD dwPreferredProtocol;	MYPCSC_SCARDHANDLE myHCard;	SERVER_SCARDHANDLE hCard;	MYPCSC_DWORD dwActiveProtocol;	PMEM_HANDLE lcHandle = NULL;	in->p += 0x1C;	in_uint32_le(in, dwShareMode);	in_uint32_le(in, dwPreferredProtocol);	inReaderName(&lcHandle, in, &szReader, wide);	in->p += 0x04;	in_uint32_le(in, hContext);	DEBUG_SCARD(("SCARD: SCardConnect(context: 0x%08x, share: 0x%08x, proto: 0x%08x, reader: \"%s\")\n", (unsigned) hContext, (unsigned) dwShareMode, (unsigned) dwPreferredProtocol, szReader ? szReader : "NULL"));	rv = SCardConnect(hContext, szReader, (MYPCSC_DWORD) dwShareMode,			  (MYPCSC_DWORD) dwPreferredProtocol, &myHCard, &dwActiveProtocol);	hCard = scHandleToServer(myHCard);	if (rv != SCARD_S_SUCCESS)	{		DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",			     pcsc_stringify_error(rv), (unsigned int) rv));	}	else	{		char *szVendor = getVendor(szReader);		DEBUG_SCARD(("SCARD: -> Success (hcard: 0x%08x [0x%08lx])\n",			     (unsigned) hCard, (unsigned long) myHCard));		if (szVendor && (strlen(szVendor) > 0))		{			DEBUG_SCARD(("SCARD: Set Attribute ATTR_VENDOR_NAME\n"));			pthread_mutex_lock(&hcardAccess);			PSCHCardRec hcard = xmalloc(sizeof(TSCHCardRec));			if (hcard)			{				hcard->hCard = hCard;				hcard->vendor = szVendor;				hcard->next = NULL;				hcard->prev = NULL;				if (hcardFirst)				{					hcardFirst->prev = hcard;					hcard->next = hcardFirst;				}				hcardFirst = hcard;			}			pthread_mutex_unlock(&hcardAccess);		}	}	out_uint32_le(out, 0x00000000);	out_uint32_le(out, 0x00000000);	out_uint32_le(out, 0x00000004);	out_uint32_le(out, 0x016Cff34);	/* if the active protocol > 4 billion, this is trouble. odds are low */	out_uint32_le(out, (SERVER_DWORD) dwActiveProtocol);	out_uint32_le(out, 0x00000004);	out_uint32_le(out, hCard);	outForceAlignment(out, 8);	SC_xfreeallmemory(&lcHandle);	return rv;}static MYPCSC_DWORDTS_SCardReconnect(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SCARDCONTEXT hContext;	SERVER_SCARDHANDLE hCard;	MYPCSC_SCARDHANDLE myHCard;	SERVER_DWORD dwShareMode;	SERVER_DWORD dwPreferredProtocol;	SERVER_DWORD dwInitialization;	MYPCSC_DWORD dwActiveProtocol;	in->p += 0x20;	in_uint32_le(in, dwShareMode);	in_uint32_le(in, dwPreferredProtocol);	in_uint32_le(in, dwInitialization);	in->p += 0x04;	in_uint32_le(in, hContext);	in->p += 0x04;	in_uint32_le(in, hCard);	myHCard = scHandleToMyPCSC(hCard);	DEBUG_SCARD(("SCARD: SCardReconnect(context: 0x%08x, hcard: 0x%08x [0x%08lx], share: 0x%08x, proto: 0x%08x, init: 0x%08x)\n", (unsigned) hContext, (unsigned) hCard, (unsigned long) myHCard, (unsigned) dwShareMode, (unsigned) dwPreferredProtocol, (unsigned) dwInitialization));	rv = SCardReconnect(myHCard, (MYPCSC_DWORD) dwShareMode, (MYPCSC_DWORD) dwPreferredProtocol,			    (MYPCSC_DWORD) dwInitialization, &dwActiveProtocol);	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 (proto: 0x%08x)\n", (unsigned) dwActiveProtocol));	}	outForceAlignment(out, 8);	out_uint32_le(out, (SERVER_DWORD) dwActiveProtocol);	return rv;}static MYPCSC_DWORDTS_SCardDisconnect(STREAM in, STREAM out){	MYPCSC_DWORD rv;	SERVER_SCARDCONTEXT hContext;	SERVER_SCARDHANDLE hCard;	MYPCSC_SCARDHANDLE myHCard;	SERVER_DWORD dwDisposition;	in->p += 0x20;	in_uint32_le(in, dwDisposition);	in->p += 0x04;	in_uint32_le(in, hContext);	in->p += 0x04;	in_uint32_le(in, hCard);	DEBUG_SCARD(("SCARD: SCardDisconnect(context: 0x%08x, hcard: 0x%08x, disposition: 0x%08x)\n", (unsigned) hContext, (unsigned) hCard, (unsigned) dwDisposition));	pthread_mutex_lock(&hcardAccess);	PSCHCardRec hcard = hcardFirst;	while (hcard)	{		if (hcard->hCard == hCard)		{			if (hcard->prev)				hcard->prev->next = hcard->next;			if (hcard->next)				hcard->next->prev = hcard->prev;			if (hcardFirst == hcard)				hcardFirst = hcard->next;			xfree(hcard);			break;		}		hcard = hcard->next;	}	pthread_mutex_unlock(&hcardAccess);	myHCard = scHandleToMyPCSC(hCard);	rv = SCardDisconnect(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 intneedStatusRecheck(MYPCSC_DWORD rv, MYPCSC_LPSCARD_READERSTATE_A rsArray, SERVER_DWORD dwCount){	int i, recall = 0;	if (rv == SCARD_S_SUCCESS)	{		MYPCSC_LPSCARD_READERSTATE_A cur;		for (i = 0, cur = rsArray; i < dwCount; i++, cur++)		{			if (cur->dwEventState & SCARD_STATE_UNKNOWN)			{				cur->dwCurrentState = cur->dwEventState;				recall++;			}		}	}	return recall;}static RD_BOOLmappedStatus(MYPCSC_DWORD code){	code >>= 16;	code &= 0x0000FFFF;	return (code % 2);}static MYPCSC_DWORDincStatus(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 voidcopyReaderState_MyPCSCToServer(MYPCSC_LPSCARD_READERSTATE_A src, SERVER_LPSCARD_READERSTATE_A dst,			       MYPCSC_DWORD readerCount){	MYPCSC_LPSCARD_READERSTATE_A srcIter;	SERVER_LPSCARD_READERSTATE_A dstIter;	MYPCSC_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 voidcopyReaderState_ServerToMyPCSC(SERVER_LPSCARD_READERSTATE_A src, MYPCSC_LPSCARD_READERSTATE_A dst,			       SERVER_DWORD readerCount)

⌨️ 快捷键说明

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