亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pscrrdwr.c

?? SmartCard驅(qū)動程序
?? C
字號:
/*++

Copyright (c) 1997 - 1999 SCM Microsystems, Inc.

Module Name:

    PscrRdWr.c

Abstract:

	Hardware access functions for SCM PSCR smartcard reader

Author:

	Andreas Straub

Environment:

	Win 95		Sys... calls are resolved by Pscr95Wrap.asm functions and
				Pscr95Wrap.h macros, resp.

	NT	4.0		Sys... functions resolved by PscrNTWrap.c functions and
				PscrNTWrap.h macros, resp.

Revision History:

	Andreas Straub			7/16/1997	1.00	Initial Version
	Klaus Schuetz			9/20/1997	1.01	Timing changed
	Andreas Straub			9/24/1997	1.02	Low Level error handling,
												minor bugfixes, clanup

--*/

#if defined( SMCLIB_VXD )

#include <Pscr95.h>

#else	//	SMCLIB_VXD

#include <PscrNT.h>

#endif	//	SMCLIB_VXD

#include <PscrCmd.h>
#include <PscrRdWr.h>

#pragma optimize( "", off )
VOID
PscrFlushInterface( PREADER_EXTENSION ReaderExtension )
/*++

PscrFlushInterface:
	Read & discard data from the pcmcia interface

Arguments:
	ReaderExtension	context of call

Return Value:
	void

--*/
{
	UCHAR			Status;
	ULONG			Length;
	PPSCR_REGISTERS	IOBase;

	IOBase = ReaderExtension->IOBase;

	Status = READ_PORT_UCHAR( &IOBase->CmdStatusReg );
	if(( Status & PSCR_DATA_AVAIL_BIT ) && ( Status & PSCR_FREE_BIT ))
	{

		//	take control over
		WRITE_PORT_UCHAR( &IOBase->CmdStatusReg, PSCR_HOST_CONTROL_BIT );

		//	get number of available bytes
		Length = ((ULONG)READ_PORT_UCHAR( &IOBase->SizeMSReg )) << 8;
		Length |= READ_PORT_UCHAR( &IOBase->SizeLSReg );

		//	perform a dummy read
		while( Length-- )
		{
			READ_PORT_UCHAR( &IOBase->DataReg );
		}
		WRITE_PORT_UCHAR( &IOBase->CmdStatusReg, CLEAR_BIT );
	}
	return;
}

NTSTATUS
PscrRead( 
	PREADER_EXTENSION	ReaderExtension,
	PUCHAR				pData,
	ULONG				DataLen,
	PULONG				pNBytes
	)
/*++
PscrRead:
	wait until data available & transfer data from reader to host

Arguments:
	ReaderExtension	context of call
	pData			ptr to data buffer
	DataLen			length of data buffer
	pNBytes			number of bytes returned

Return Value:
	STATUS_SUCCESS
	STATUS_BUFFER_TOO_SMALL
	STATUS_UNSUCCESSFUL

--*/
{
	NTSTATUS		NTStatus = STATUS_UNSUCCESSFUL;
	USHORT			ReaderStatus;
	PPSCR_REGISTERS	IOBase;
	USHORT			InDataLen;

	IOBase = ReaderExtension->IOBase;

	//	wait until interface is ready to transfer
	InDataLen = 0;

	if( NT_SUCCESS( NTStatus = PscrWait( ReaderExtension, PSCR_DATA_AVAIL_BIT | PSCR_FREE_BIT )))
	{
		//	take control over
		WRITE_PORT_UCHAR( &IOBase->CmdStatusReg, PSCR_HOST_CONTROL_BIT );

		//	get number of available bytes
		InDataLen = ( READ_PORT_UCHAR( &IOBase->SizeMSReg ) << 8 );
		InDataLen |= READ_PORT_UCHAR( &IOBase->SizeLSReg );

        if (InDataLen <= PSCR_PROLOGUE_LENGTH) {

            // the buffer does not contain the minimum packet length
            NTStatus = STATUS_IO_TIMEOUT;

        } else if( ( ULONG )InDataLen <= DataLen ) {

		    //	check buffer size. if buffer to small, the data will be discarded

			//	read data
			ULONG Idx;
            for (Idx = 0; Idx < InDataLen; Idx++) {
             	
				pData[ Idx ] = READ_PORT_UCHAR( &IOBase->DataReg );
			} 

			//	error check
			if( pData[ InDataLen - 1 ] !=
				PscrCalculateLRC( pData, (USHORT)( InDataLen - 1 )))
			{
				NTStatus = STATUS_CRC_ERROR;
			}
			else
			{
				//
				//	Evaluation of reader errors. A reader error is indicated
				//	if the T1 length is 2 and the Nad indicates that this 
				//	packet came from the reader
				//
				if( ( ( pData[ PSCR_NAD ] & 0x0F ) == 0x01 ) &&
					( pData[ PSCR_LEN ] == 0x02 )
					)
				{
					ReaderStatus = (( USHORT ) pData[3] ) << 8;
					ReaderStatus |= (( USHORT ) pData[4] );
					
					if( ( ReaderStatus != 0x9000 ) &&
						( ReaderStatus != 0x9001 )
						)
					{
	                    SmartcardDebug( 
		                    DEBUG_TRACE, 
		                    ( "PSCR!PscrRead: ReaderStatus = %lx\n", ReaderStatus )
		                    );

						InDataLen	= 0;

                        if (ReaderStatus == PSCR_SW_PROTOCOL_ERROR) {

                            NTStatus = STATUS_IO_TIMEOUT;                         	

                        } else {
                         	
						    NTStatus = STATUS_UNSUCCESSFUL;
                        }
					}
				}
			}
		}
		else {

			//	flush interface in case of wrong buffer size
			do
        	{
				READ_PORT_UCHAR( &IOBase->DataReg );

			} while( --InDataLen );

			NTStatus = STATUS_BUFFER_TOO_SMALL;
		}

		//	clean up
		WRITE_PORT_UCHAR( &IOBase->CmdStatusReg, CLEAR_BIT );
	}

	//	write number of bytes received
	if( InDataLen )
	{
		if( pNBytes != NULL )
		{
			( *pNBytes ) = ( ULONG ) InDataLen;
		}
		NTStatus = STATUS_SUCCESS;
	}
	return ( NTStatus );
}

NTSTATUS
PscrWrite( 
	PREADER_EXTENSION	ReaderExtension,
	PUCHAR				pData,
	ULONG				DataLen,
	PULONG				pNBytes
	)
/*++
PscrWrite:
	calculates the LRC of the buffer & sends command to the reader

Arguments:
	ReaderExtension	context of call
	pData				ptr to data buffer
	DataLen				length of data buffer (exclusive LRC!)
	pNBytes				number of bytes written

Return Value:
	return value of PscrWriteDirect

--*/
{
	NTSTATUS	NTStatus;

	//	Add the EDC field to the end of the data
	pData[ DataLen ] = PscrCalculateLRC( pData, ( USHORT ) DataLen );

	//	Send buffer
	NTStatus = PscrWriteDirect( 
		ReaderExtension,
		pData,
		DataLen + PSCR_EPILOGUE_LENGTH,
		pNBytes
		);

	return( NTStatus );
}

NTSTATUS
PscrWriteDirect( 
	PREADER_EXTENSION	ReaderExtension,
	PUCHAR				pData,
	ULONG				DataLen,
	PULONG				pNBytes
	)

/*++
PscrWriteDirect:
	sends command to the reader. The LRC / CRC must be calculated by caller!

Arguments:
	ReaderExtension	context of call
	pData				ptr to data buffer
	DataLen				length of data buffer (exclusive LRC!)
	pNBytes				number of bytes written

Return Value:
	STATUS_SUCCESS
	STATUS_DEVICE_BUSY

--*/
{
	NTSTATUS		NTStatus = STATUS_SUCCESS;
	UCHAR			Status;
	PPSCR_REGISTERS	IOBase;

	IOBase = ReaderExtension->IOBase;

	//	in case of card change, there may be data available
	Status = READ_PORT_UCHAR( &IOBase->CmdStatusReg );
	if( Status & PSCR_DATA_AVAIL_BIT )
	{
		NTStatus = STATUS_DEVICE_BUSY;
	}
	else
	{
		//
		//	wait until reader is ready
		//
		WRITE_PORT_UCHAR( &IOBase->CmdStatusReg, PSCR_HOST_CONTROL_BIT );
		NTStatus = PscrWait( ReaderExtension, PSCR_FREE_BIT );
		
		if( NT_SUCCESS( NTStatus ))
		{
			ULONG	Idx;

			//	take control over
			WRITE_PORT_UCHAR( &IOBase->CmdStatusReg, PSCR_HOST_CONTROL_BIT );

			//	write the buffer size
			WRITE_PORT_UCHAR( &IOBase->SizeMSReg, ( UCHAR )( DataLen >> 8 ));
			SysDelay( DELAY_WRITE_PSCR_REG );
			WRITE_PORT_UCHAR( &IOBase->SizeLSReg, ( UCHAR )( DataLen & 0x00FF ));
			SysDelay( DELAY_WRITE_PSCR_REG );

			//	write data
            for (Idx = 0; Idx < DataLen; Idx++) {

				WRITE_PORT_UCHAR( &IOBase->DataReg, pData[ Idx ] );
			}

			if( pNBytes != NULL )
			{
				*pNBytes = DataLen;
			}
		}

		//	clean up
		WRITE_PORT_UCHAR( &IOBase->CmdStatusReg, CLEAR_BIT );
	}
	return( NTStatus );
}

UCHAR
PscrCalculateLRC(
	PUCHAR	pData, 
	USHORT	DataLen
	)
/*++

PscrCalculateLRC:
	calculates the XOR LRC of a buffer.

Arguments:
	pData		ptr to data buffer
	DataLen		length of range

Return Value:
	LRC

--*/
{
	UCHAR	Lrc;
	USHORT	Idx;

	//
	//	Calculate LRC by XORing all the bytes.
	//
	Lrc = pData[ 0 ];
	for ( Idx = 1 ; Idx < DataLen; Idx++ )
	{
		Lrc ^= pData[ Idx ];
	}
	return ( Lrc );
}

NTSTATUS
PscrWait(
	PREADER_EXTENSION	ReaderExtension, 
	UCHAR				Mask 
	)
/*++
PscrWait:
	Test the status port of the reader until ALL bits in the mask are set.
	The maximum of time until DEVICE_BUSY is returned is approx.
	MaxRetries * DELAY_PSCR_WAIT if MaxRetries != 0.
	If MaxRetries = 0 the driver waits until the requested status is reported or the
	user defines a timeout.

Arguments:
	ReaderExtension		context of call
	Mask				mask of bits to test the status register

Return Value:
	STATUS_SUCCESS
	STATUS_DEVICE_BUSY

--*/
{
	NTSTATUS		NTStatus;
	PPSCR_REGISTERS	IOBase;
	ULONG			Retries;
	UCHAR			Status;

	IOBase		= ReaderExtension->IOBase;
	NTStatus	= STATUS_DEVICE_BUSY;

	//	wait until condition fulfilled or specified timeout expired
	for ( Retries = 0; Retries < ReaderExtension->MaxRetries; Retries++)
	{
		//	canceled?
		if( ReaderExtension->RequestCancelled == TRUE )
		{
			NTStatus = STATUS_CANCELLED;
			break;
		}

		if (( (READ_PORT_UCHAR( &IOBase->CmdStatusReg )) == 0x01) && 
			ReaderExtension->InvalidStatus)

		{
			NTStatus = STATUS_CANCELLED;
			break;
		}

		//	test requested bits
		if(( (READ_PORT_UCHAR( &IOBase->CmdStatusReg )) & Mask ) == Mask )
		{
			NTStatus = STATUS_SUCCESS;
			break;
		}
		SysDelay( DELAY_PSCR_WAIT );
	}

	Status = READ_PORT_UCHAR( &IOBase->CmdStatusReg );
	return NTStatus;
}

#pragma optimize( "", on )


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级理论片| 欧美一区二区三区思思人| 欧美韩国日本一区| 国产91精品一区二区麻豆亚洲| 久久综合九色综合97_久久久| 国产一区不卡视频| 亚洲国产电影在线观看| 成人国产精品免费观看动漫| 亚洲精品日日夜夜| 欧美日韩视频一区二区| 秋霞电影网一区二区| 久久久一区二区三区捆绑**| 成人app在线| 亚洲综合另类小说| 日韩你懂的电影在线观看| 狠狠色丁香久久婷婷综合_中| 国产精品网曝门| 欧美日韩欧美一区二区| 蓝色福利精品导航| 中文字幕一区二区三区四区| 欧美一a一片一级一片| 美国毛片一区二区三区| 国产精品水嫩水嫩| 欧美日高清视频| 国产不卡一区视频| 亚洲va国产天堂va久久en| 久久久综合网站| 一本到不卡精品视频在线观看| 天涯成人国产亚洲精品一区av| 久久久影视传媒| 欧美性大战久久| 国产精品亚洲第一| 亚洲中国最大av网站| 久久综合资源网| 欧美综合视频在线观看| 国产成人午夜精品5599| 亚洲国产一区二区三区| 国产色产综合色产在线视频| 欧美乱熟臀69xxxxxx| 国产成人自拍在线| 日本午夜一本久久久综合| 国产精品欧美一区喷水| 日韩免费成人网| 日本高清免费不卡视频| 丁香婷婷综合色啪| 久久99国产精品免费网站| 一区二区在线看| 国产精品久久一卡二卡| 日韩精品一区在线观看| 欧美性大战久久久久久久蜜臀| 国产白丝精品91爽爽久久| 喷白浆一区二区| 一区二区三区欧美激情| 国产精品乱码一区二三区小蝌蚪| 日韩美一区二区三区| 欧美精品777| 在线免费不卡电影| 国产a视频精品免费观看| 久久国产精品72免费观看| 视频一区二区三区在线| 亚洲一区二三区| 一区二区三区精密机械公司| 自拍偷自拍亚洲精品播放| 国产无人区一区二区三区| 欧美va亚洲va香蕉在线| 777奇米成人网| 欧美另类一区二区三区| 欧美性生活一区| 欧美日韩精品久久久| 欧美图片一区二区三区| 欧美午夜精品久久久久久孕妇 | 亚洲国产高清在线观看视频| 国产视频一区二区在线| 精品少妇一区二区三区日产乱码| 欧美丰满一区二区免费视频| 欧美福利视频导航| 欧美一区二区大片| 日韩美女视频在线| 精品福利视频一区二区三区| 亚洲精品在线免费播放| 久久久综合激的五月天| 国产欧美日韩一区二区三区在线观看| 久久综合久色欧美综合狠狠| 久久亚洲二区三区| 国产欧美一区二区精品性| 国产精品久久久久久久久快鸭| 国产精品女主播av| 亚洲青青青在线视频| 亚洲一卡二卡三卡四卡无卡久久| 午夜免费久久看| 另类欧美日韩国产在线| 国产一区二区三区日韩| 成人av电影在线网| 在线亚洲免费视频| 91麻豆精品91久久久久久清纯 | 亚洲综合免费观看高清完整版 | 日韩午夜小视频| 久久久久久影视| 亚洲天堂a在线| 婷婷开心久久网| 黄色精品一二区| 一本久道久久综合中文字幕| 91麻豆精品国产91久久久久| 久久综合av免费| 亚洲色大成网站www久久九九| 亚洲国产成人精品视频| 看电视剧不卡顿的网站| 国产精品自在欧美一区| 色婷婷综合中文久久一本| 91麻豆精品国产自产在线| 国产欧美一区二区精品性| 有码一区二区三区| 国产在线麻豆精品观看| 91免费精品国自产拍在线不卡 | 在线亚洲精品福利网址导航| 91精品国产黑色紧身裤美女| 亚洲国产精品av| 日韩av午夜在线观看| 国产**成人网毛片九色| 欧美精品少妇一区二区三区| 久久天天做天天爱综合色| 亚洲综合一区二区三区| 丰满白嫩尤物一区二区| 69精品人人人人| 中文av一区二区| 九九九久久久精品| 欧美日韩一区在线观看| 国产嫩草影院久久久久| 日韩电影免费一区| 欧洲一区在线电影| 欧美精彩视频一区二区三区| 日韩精品一二三四| 日本高清不卡aⅴ免费网站| 久久影院电视剧免费观看| 午夜精品久久久久久| 欧美日韩三级一区二区| 最新热久久免费视频| 日本午夜一本久久久综合| 91麻豆国产福利精品| 欧美高清在线一区二区| 青青草国产精品97视觉盛宴| 在线欧美小视频| 国产精品白丝在线| 国产成人精品一区二区三区四区| 91精品国产手机| 亚洲成人av一区二区三区| 97久久精品人人做人人爽50路| 欧美精品一区二区三| 久久精品国产99久久6| 欧美精品欧美精品系列| 伊人夜夜躁av伊人久久| 99视频在线观看一区三区| 久久精品日韩一区二区三区| 精品一区二区三区免费视频| 欧美一区二区三区男人的天堂| 一区二区三区产品免费精品久久75| 福利视频网站一区二区三区| 久久新电视剧免费观看| 国产一区二区三区久久悠悠色av| 日韩一区二区三区视频在线观看| 亚洲成人自拍网| 欧美日韩亚洲综合一区| 亚洲成av人**亚洲成av**| 欧美视频一区二区三区四区| 一区二区三区欧美久久| 91国偷自产一区二区开放时间| 亚洲天堂a在线| 色呦呦网站一区| 亚洲午夜国产一区99re久久| 精品视频全国免费看| 午夜精品成人在线| 欧美一级在线视频| 精品一区二区三区蜜桃| 久久久av毛片精品| 不卡一区二区三区四区| 亚洲视频小说图片| 91福利小视频| 日韩和欧美的一区| 久久伊人蜜桃av一区二区| 床上的激情91.| 亚洲免费观看视频| 欧美撒尿777hd撒尿| 天天免费综合色| 欧美xxxx老人做受| 国产sm精品调教视频网站| 中文字幕制服丝袜成人av| 97精品国产97久久久久久久久久久久 | 国产在线一区二区综合免费视频| 久久综合999| 91视频一区二区三区| 亚洲高清免费一级二级三级| 精品免费日韩av| 成人av免费观看| 亚洲国产一区二区视频| 精品国产一区久久| 不卡区在线中文字幕| 亚洲成人免费视| 精品国产sm最大网站| 色综合色狠狠天天综合色| 视频一区视频二区中文|