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

📄 stccb.c

📁 Windows CE 5.0 下的SmartCard驱动。
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -