📄 stccb.c
字号:
case IOCTL_WRITE_STC_REGISTER:
NTStatus = IFWriteSTCRegister(
SmartcardExtension->ReaderExtension,
*(SmartcardExtension->IoRequest.RequestBuffer), // Address
(ULONG)(*(SmartcardExtension->IoRequest.RequestBuffer + 1)), // Size
SmartcardExtension->IoRequest.RequestBuffer + 2); // Data
*SmartcardExtension->IoRequest.Information = 1;
if(NTStatus == STATUS_SUCCESS)
{
*(SmartcardExtension->IoRequest.ReplyBuffer) = 0;
}
else
{
*(SmartcardExtension->IoRequest.ReplyBuffer) = 1;
}
break;
case IOCTL_READ_STC_REGISTER:
NTStatus = IFReadSTCRegister(
SmartcardExtension->ReaderExtension,
*(SmartcardExtension->IoRequest.RequestBuffer), // Address
(ULONG)(*(SmartcardExtension->IoRequest.RequestBuffer + 1)), // Size
SmartcardExtension->IoRequest.ReplyBuffer); // Data
if(NTStatus ==STATUS_SUCCESS)
{
*SmartcardExtension->IoRequest.Information =
(ULONG)(*(SmartcardExtension->IoRequest.RequestBuffer + 1));
}
else
{
SmartcardExtension->IoRequest.Information = 0;
}
break;
case IOCTL_WRITE_STC_DATA:
NTStatus = IFWriteSTCData(
SmartcardExtension->ReaderExtension,
SmartcardExtension->IoRequest.RequestBuffer + 1, // Data
(ULONG)(*(SmartcardExtension->IoRequest.RequestBuffer))); // Size
*SmartcardExtension->IoRequest.Information = 1;
if(NTStatus == STATUS_SUCCESS)
{
*(SmartcardExtension->IoRequest.ReplyBuffer) = 0;
}
else
{
*(SmartcardExtension->IoRequest.ReplyBuffer) = 1;
}
break;
case IOCTL_READ_STC_DATA:
NTStatus = IFReadSTCData(
SmartcardExtension->ReaderExtension,
SmartcardExtension->IoRequest.ReplyBuffer, // Data
(ULONG)(*(SmartcardExtension->IoRequest.RequestBuffer))); // Size
if(NTStatus ==STATUS_SUCCESS)
{
*SmartcardExtension->IoRequest.Information =
(ULONG)(*(SmartcardExtension->IoRequest.RequestBuffer));
}
else
{
SmartcardExtension->IoRequest.Information = 0;
}
break;
default:
break;
}
SmartcardDebug(
DEBUG_TRACE,
( TEXT("%s!CBGenericIOCTL: Exit\n"),
DRIVER_NAME));
return( NTStatus );
}
NTSTATUS
CBTransmit(
PSMARTCARD_EXTENSION SmartcardExtension
)
/*++
CBTransmit:
callback handler for SMCLIB RDF_TRANSMIT
Arguments:
SmartcardExtension context of call
Return Value:
STATUS_SUCCESS
STATUS_NO_MEDIA
STATUS_TIMEOUT
STATUS_INVALID_DEVICE_REQUEST
--*/
{
NTSTATUS NTStatus = STATUS_SUCCESS;
SmartcardDebug( DEBUG_TRACE, (TEXT("%s!CBTransmit Enter\n"),DRIVER_NAME ));
// dispatch on the selected protocol
switch( SmartcardExtension->CardCapabilities.Protocol.Selected )
{
case SCARD_PROTOCOL_T0:
NTStatus = CBT0Transmit( SmartcardExtension );
break;
case SCARD_PROTOCOL_T1:
NTStatus = CBT1Transmit( SmartcardExtension );
break;
case SCARD_PROTOCOL_RAW:
NTStatus = CBRawTransmit( SmartcardExtension );
break;
default:
NTStatus = STATUS_INVALID_DEVICE_REQUEST;
break;
}
SmartcardDebug( DEBUG_TRACE, (TEXT("%s!CBTransmit Exit: %X\n"),DRIVER_NAME, NTStatus ));
return( NTStatus );
}
NTSTATUS
T0_ExchangeData(
PREADER_EXTENSION ReaderExtension,
PUCHAR pRequest,
ULONG RequestLen,
PUCHAR pReply,
PULONG pReplyLen)
/*++
Routine Description:
T=0 management
Arguments:
ReaderExtension Context of the call
pRequest Request buffer
RequestLen Request buffer length
pReply Reply buffer
pReplyLen Reply buffer length
Return Value:
STATUS_SUCCESS
Status returned by IFReadSTCData or IFWriteSTCData
--*/
{
NTSTATUS NTStatus = STATUS_SUCCESS;
BOOLEAN Direction;
UCHAR Ins,
Pcb;
ULONG Len,
DataIdx;
// get direction
Ins = pRequest[ INS_IDX ] & 0xFE;
Len = pRequest[ P3_IDX ];
if( RequestLen == 5 )
{
Direction = ISO_OUT;
DataIdx = 0;
// For an ISO OUT command Len=0 means that the host expect an
// 256 byte answer
if( !Len )
{
Len = 0x100;
}
// Add 2 for SW1 SW2
Len+=2;
}
else
{
Direction = ISO_IN;
DataIdx = 5;
}
// send header CLASS,INS,P1,P2,P3
NTStatus = IFWriteSTCData( ReaderExtension, pRequest, 5 );
if( NTStatus == STATUS_SUCCESS )
{
NTStatus = STATUS_MORE_PROCESSING_REQUIRED;
}
while( NTStatus == STATUS_MORE_PROCESSING_REQUIRED )
{
// PCB reading
Pcb = 0;
NTStatus = IFReadSTCData( ReaderExtension, &Pcb, 1 );
if( NTStatus == STATUS_SUCCESS )
{
if( Pcb == 0x60 )
{
// null byte?
NTStatus = STATUS_MORE_PROCESSING_REQUIRED;
continue;
}
else if( ( Pcb & 0xFE ) == Ins )
{
// transfer all
if( Direction == ISO_IN )
{
// write remaining data
NTStatus = IFWriteSTCData( ReaderExtension, pRequest + DataIdx, Len );
if( NTStatus == STATUS_SUCCESS )
{
// if all data successful written the status word is expected
NTStatus = STATUS_MORE_PROCESSING_REQUIRED;
Direction = ISO_OUT;
DataIdx = 0;
Len = 2;
}
}
else
{
// read remaining data
NTStatus = IFReadSTCData( ReaderExtension, pReply + DataIdx, Len );
DataIdx += Len;
}
}
else if( (( Pcb & 0xFE ) ^ Ins ) == 0xFE )
{
// transfer next
if( Direction == ISO_IN )
{
// write next
NTStatus = IFWriteSTCData( ReaderExtension, pRequest + DataIdx, 1 );
if( NTStatus == STATUS_SUCCESS )
{
DataIdx++;
// if all data successful written the status word is expected
if( --Len == 0 )
{
Direction = ISO_OUT;
DataIdx = 0;
Len = 2;
}
NTStatus = STATUS_MORE_PROCESSING_REQUIRED;
}
}
else
{
// read next
NTStatus = IFReadSTCData( ReaderExtension, pReply + DataIdx, 1 );
if( NTStatus == STATUS_SUCCESS )
{
NTStatus = STATUS_MORE_PROCESSING_REQUIRED;
Len--;
DataIdx++;
}
}
}
else if( (( Pcb & 0x60 ) == 0x60 ) || (( Pcb & 0x90 ) == 0x90 ) )
{
if( Direction == ISO_IN )
{
Direction = ISO_OUT;
DataIdx = 0;
}
// SW1
*pReply = Pcb;
// read SW2 and leave
NTStatus = IFReadSTCData( ReaderExtension, &Pcb, 1 );
*(pReply + 1) = Pcb;
DataIdx += 2;
}
else
{
NTStatus = STATUS_UNSUCCESSFUL;
}
}
}
if(( NTStatus == STATUS_SUCCESS ) && ( pReplyLen != NULL ))
{
*pReplyLen = DataIdx;
}
return( NTStatus );
}
NTSTATUS
CBT0Transmit(
PSMARTCARD_EXTENSION SmartcardExtension)
/*++
CBT0Transmit:
finishes the callback RDF_TRANSMIT for the T0 protocol
Arguments:
SmartcardExtension context of call
Return Value:
STATUS_SUCCESS
STATUS_NO_MEDIA
STATUS_TIMEOUT
STATUS_INVALID_DEVICE_REQUEST
--*/
{
NTSTATUS NTStatus = STATUS_SUCCESS;
SmartcardDebug( DEBUG_TRACE, (TEXT("%s!CBT0Transmit Enter\n"),DRIVER_NAME ));
SmartcardExtension->SmartcardRequest.BufferLength = 0;
// let the lib setup the T=1 APDU & check for errors
NTStatus = SmartcardT0Request( SmartcardExtension );
if( NTStatus == STATUS_SUCCESS )
{
NTStatus = T0_ExchangeData(
SmartcardExtension->ReaderExtension,
SmartcardExtension->SmartcardRequest.Buffer,
SmartcardExtension->SmartcardRequest.BufferLength,
SmartcardExtension->SmartcardReply.Buffer,
&SmartcardExtension->SmartcardReply.BufferLength);
if( NTStatus == STATUS_SUCCESS )
{
// let the lib evaluate the result & tansfer the data
NTStatus = SmartcardT0Reply( SmartcardExtension );
}
}
SmartcardDebug( DEBUG_TRACE,(TEXT("%s!CBT0Transmit Exit: %X\n"),DRIVER_NAME, NTStatus ));
return( NTStatus );
}
NTSTATUS
CBT1Transmit(
PSMARTCARD_EXTENSION SmartcardExtension)
/*++
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -