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

📄 usbcom.c

📁 Windows CE 5.0 下的SmartCard驱动。
💻 C
📖 第 1 页 / 共 2 页
字号:
                Sleep(20);
            }
            else
            {
                ReaderExtension->ulReadBufferLen = 0;
                SmartcardDebug(
                    DEBUG_DRIVER,
                    (TEXT("%s!UsbReadSTCData: Timeout %X \n"), 
                    DRIVER_NAME,
                    STATUS_IO_TIMEOUT));
                /*
                if((*ReaderExtension->pUsbFuncs->lpGetTransferStatus)(ReaderExtension->Handle,NULL,NULL))
                {
                    (*ReaderExtension->pUsbFuncs->lpAbortTransfer)(ReaderExtension->Handle,0);
                }
                */

                NTStatus =STATUS_IO_TIMEOUT;
                break;
            }
        }
        if ((ULONG) *(pucResponse+1) < ulLenExpected)
        {
            memcpy(pucData+Index,pucResponse+2,(ULONG) *(pucResponse+1));
            Index = Index + (ULONG) *(pucResponse+1);
            ulLenExpected = ulLenExpected - (ULONG) *(pucResponse+1);
            SendReadCommand = TRUE;
        }
        else
        {
            SendReadCommand = FALSE;
            memcpy(pucData+Index,pucResponse+2,ulLenExpected);

            if((ULONG) *(pucResponse+1) > ulLenExpected)
            {
                memcpy(
                    ReaderExtension->ucReadBuffer, 
                    pucResponse+ulLenExpected+2, 
                    (ULONG) *(pucResponse+1) - ulLenExpected);
                ReaderExtension->ulReadBufferLen = (ULONG) *(pucResponse+1) - ulLenExpected;
            }
            else
            {
                ReaderExtension->ulReadBufferLen = 0;
            }
        }
    }
    free( pucResponse );
    SmartcardDebug(
        DEBUG_DRIVER,
        (TEXT("%s!UsbReadSTCData: Exit %X \n"), 
        DRIVER_NAME,
        NTStatus));
    return( NTStatus );
}
NTSTATUS
UsbWriteSTCRegister(
    PREADER_EXTENSION    ReaderExtension,
    UCHAR                ucAddress,
    ULONG                ulSize,
    PUCHAR                pucValue)
/*++

Routine Description:

Arguments:

Return Value:

--*/
{

    NTSTATUS    NTStatus = STATUS_SUCCESS;
    PUCHAR pucCmd;
    UCHAR        ucResponse[2];


    if(ulSize >16)
    {
        return(STATUS_UNSUCCESSFUL);
    }
    // 
    pucCmd = malloc(MAX_READ_REGISTER_BUFFER_SIZE);

    if(pucCmd==NULL)
    {
        return(STATUS_NO_MEMORY);
    }
    ReaderExtension->ulReadBufferLen = 0;

    // Build the write register command

    *pucCmd = 0x80 | ucAddress;
    *(pucCmd+1) = (UCHAR) ulSize;
    memcpy( pucCmd+2, pucValue, ulSize );
    
    // Send the Write Register command 
    NTStatus = UsbWrite( ReaderExtension, pucCmd, 2 + ulSize);
    if (NTStatus == STATUS_SUCCESS)
    {

        // Read the acknowledge 
        NTStatus = UsbRead( ReaderExtension, ucResponse, 2);
        if (NTStatus == STATUS_SUCCESS)
        {
            NTStatus=STCtoNT(ucResponse);
        }
    }
    free( pucCmd );

    return(NTStatus);
}

NTSTATUS
UsbReadSTCRegister(
    PREADER_EXTENSION    ReaderExtension,
    UCHAR                ucAddress,
    ULONG                ulSize,
    PUCHAR                pucValue)
/*++

Routine Description:

Arguments:

Return Value:

--*/
{
    NTSTATUS    NTStatus = STATUS_SUCCESS;
    UCHAR       ucCmd[2];
    PUCHAR        pucResponse;

    if(ulSize >16)
    {
        return(STATUS_UNSUCCESSFUL);
    }
    // 
    pucResponse = malloc(MAX_READ_REGISTER_BUFFER_SIZE);

    if(pucResponse==NULL)
    {
        return(STATUS_NO_MEMORY);
    }
    // Build the Read Register command

    ucCmd[0] = 0xC0 | ucAddress;
    ucCmd[1] = (UCHAR) ulSize;

    // Send the Read Register command 
    NTStatus = UsbWrite( ReaderExtension, ucCmd, 2);
    if (NTStatus == STATUS_SUCCESS)
    {
        // Read the response from the reader 
        NTStatus = UsbRead( ReaderExtension, pucResponse, 6);
        if (NTStatus == STATUS_SUCCESS)
        {
            // Test if what we read is really a READ frame
            if(*pucResponse == 0x21)
            {
                if(*(pucResponse+1)>16)
                {
                    NTStatus = STATUS_UNSUCCESSFUL;
                }
                else
                {
                    memcpy(pucValue,pucResponse+2,(ULONG) *(pucResponse+1));
                }

            }
            else
            {
                NTStatus = STCtoNT(pucResponse);
                if (NTStatus == STATUS_SUCCESS)
                    NTStatus = STATUS_UNSUCCESSFUL;     // 9000 won't do here
                
            }
        }
    }
    free( pucResponse );
    return(NTStatus); 
}

NTSTATUS
UsbGetFirmwareRevision(
    PREADER_EXTENSION    ReaderExtension)
/*++
Description:

Arguments:

Return Value:

--*/
{
    NTSTATUS    NTStatus = STATUS_SUCCESS;
    UCHAR       ucCmd[1];
    UCHAR        ucResponse[4];

    ucCmd[0] = 0xE1;
    NTStatus = UsbWrite( ReaderExtension, ucCmd, 2 );

    if( NTStatus == STATUS_SUCCESS )
    {
        NTStatus = UsbRead( ReaderExtension, ucResponse, 4 );

        if( NTStatus == STATUS_SUCCESS )
        {
            ReaderExtension->FirmwareMajor = ucResponse[ 2 ];
            ReaderExtension->FirmwareMinor = ucResponse[ 3 ];
        }
    }
    return( NTStatus);
}
DWORD WINAPI TransferNotify(LPVOID ReaderExtension)
{
    SetEvent(((PREADER_EXTENSION)ReaderExtension)->Event);
    return(0);
}


NTSTATUS
UsbRead( 
    PREADER_EXTENSION    ReaderExtension,
    PUCHAR                pData,
    ULONG                DataLen    )
/*++
Description:
    Read data on the USB bus

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_SUCCESS;

    USB_TRANSFER Handle;
    LPTRANSFER_NOTIFY_ROUTINE lpStartAddress = &TransferNotify;


    ResetEvent(ReaderExtension->Event);

        
    Handle= (*ReaderExtension->pUsbFuncs->lpIssueBulkTransfer)(
        ReaderExtension->pPipeIn, 
        lpStartAddress,
        ReaderExtension, 
        USB_IN_TRANSFER|USB_SHORT_TRANSFER_OK,
        (DWORD) DataLen,//maximum packet len
        pData, 
        (ULONG)0);


    if(Handle == NULL)
    {
        NtStatus = STATUS_UNSUCCESSFUL;
    }
    else
    {
        if(WaitForSingleObject(ReaderExtension->Event,10000)==WAIT_OBJECT_0)
        {
            NtStatus = STATUS_SUCCESS;
        }
        else
        {
        
            NtStatus = STATUS_UNSUCCESSFUL;
        }
        (*ReaderExtension->pUsbFuncs->lpCloseTransfer)(Handle);
    }
    
    return ( NtStatus );
}

NTSTATUS
UsbWrite( 
    PREADER_EXTENSION    ReaderExtension,
    PUCHAR                pData,
    ULONG                DataLen)
/*++
Description:
    Write data on the usb port

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

Return Value:
    return value of 

--*/
{
    NTSTATUS    NtStatus = STATUS_SUCCESS;
    USB_TRANSFER Handle;

    Handle= (*ReaderExtension->pUsbFuncs->lpIssueBulkTransfer)(
            ReaderExtension->pPipeOut, 
            NULL,
            NULL,
            USB_OUT_TRANSFER,
            (DWORD) DataLen, 
            pData, 
            (ULONG)0);

    if(Handle == NULL)
    {
        NtStatus = STATUS_UNSUCCESSFUL;

    }
    else
    {
        (*ReaderExtension->pUsbFuncs->lpCloseTransfer)(Handle);
        NtStatus = STATUS_SUCCESS;
    }
    
    return ( NtStatus );
}

⌨️ 快捷键说明

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