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

📄 pcsc_drv.cpp

📁 这是通用pcsc读卡器的驱动源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//<newpara>	Comments :										</newpara>
//</summary>
//Parameters :
//	<param name="DeviceObject">             				       </param>
//	<param name="pIrp">                     				       </param>
//<returns> </returns>
// ======================================================================
NTSTATUS VdPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
    NTSTATUS status = STATUS_SUCCESS;
    KdPrint(("%sVdPower\n",HEAD));
    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = status;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    return status;
}

//<summary>
//  ======================================================================
//<newpara>	Author :BD		Date : 01-01-2001		</newpara>
//  ======================================================================
//<newpara>	Function :		VdCleanUp</newpara>
//<newpara>	Comments :										</newpara>
//</summary>
//Parameters :
//	<param name="DeviceObject">             				       </param>
//	<param name="pIrp">                     				       </param>
//<returns> </returns>
// ======================================================================
NTSTATUS VdCleanUp(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
    NTSTATUS status = STATUS_SUCCESS;
    KdPrint(("%sVdCleanUp\n",HEAD));
    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = status;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    return status;
}

//<summary>
//  ======================================================================
//<newpara>	Author :BD		Date : 01-01-2001		</newpara>
//  ======================================================================
//<newpara>	Function :		VdPowerReader</newpara>
//<newpara>	Comments :										
//input data:
//      pSmartcardExtension->MajorIoControlCode - Contains IOCTL_SMARTCARD_POWER. 
//      pSmartcardExtension->MinorIoControlCode 
//      Contains one of the following minor codes, depending on the function to be performed. 
//      pSmartcardExtension->IoRequest.ReplyBufferLength - Contains the length of the reply buffer. 
//output data:
//      pSmartcardExtension->IoRequest.ReplyBuffer - this buffer receives the ATR returned by the card. 
//      pSmartcardExtension->CardCapabilities.ATR.Buffer - transfer the ATR to let the library parse the ATR. 
//      pSmartcardExtension->IoRequest.Information - Receives the actual length of the ATR. 
//      pSmartcardExtension->CardCapabilities.ATR.Length - transfer the length of the ATR 
//</newpara>
//</summary>
//Parameters :
//	<param name="pSmartcardExtension">       				       </param>
//<returns> </returns>
// ======================================================================
NTSTATUS VdPowerReader(PSMARTCARD_EXTENSION pSmartcardExtension)
{
    NTSTATUS status;
    KdPrint(("%sVdPowerReader\n",HEAD));

    if ((status = SmartcardAcquireRemoveLock(pSmartcardExtension)) != STATUS_SUCCESS)
    {
        pSmartcardExtension->IoRequest.Information = 0;
        // We should immediately return the control back, because the driver 
        // is about to unload.
    }
    else
    {
        switch (pSmartcardExtension->MinorIoControlCode)
        {
        case SCARD_POWER_DOWN :
            KdPrint(("\t%sSCARD_POWER_DOWN\n",HEAD));
            status = VdPowerDownReader(pSmartcardExtension);
            break;
        case SCARD_COLD_RESET :
            KdPrint(("\t%sSCARD_COLD_RESET\n",HEAD));
            status = VdPowerUpReader(pSmartcardExtension);
            break;
        case SCARD_WARM_RESET :
            KdPrint(("\t%sSCARD_WARM_RESET\n",HEAD));
            status = VdPowerUpReader(pSmartcardExtension);
            break;
        default :
            KdPrint(("\t%sSomething else\n",HEAD));
            status = STATUS_UNSUCCESSFUL;
        }
        SmartcardReleaseRemoveLock(pSmartcardExtension);
    }
    return status;
}

//<summary>
//  ======================================================================
//<newpara>	Author :BD		Date : 01-01-2001		</newpara>
//  ======================================================================
//<newpara>	Function :		VdPowerUpReader</newpara>
//<newpara>	Comments :										</newpara>
//</summary>
//Parameters :
//	<param name="pSmartcardExtension">      				       </param>
//<returns> </returns>
// ======================================================================
NTSTATUS VdPowerUpReader(PSMARTCARD_EXTENSION pSmartcardExtension)
{
    NTSTATUS status = STATUS_SUCCESS;
    KdPrint(("%sVdPowerUpReader\n",HEAD));
    //----------------------------------------------
    ULONG ulState = pSmartcardExtension->ReaderCapabilities.CurrentState;
    KdPrint(("\t%sPowerUp, Current state %#x\n",HEAD, ulState));
    // Let's check the size of buffer
    if (ATRLength > pSmartcardExtension->IoRequest.ReplyBufferLength)
        status = STATUS_BUFFER_TOO_SMALL;
    else
    {
#ifdef VERSION_READER_2
        READER_EXTENSION(uReaderPowerState) = POWER_UP;
        KdPrint(("\t%spSmartcardExtension->IoRequest.ReplyBufferLength %#x\n",HEAD, pSmartcardExtension->IoRequest.ReplyBufferLength));
        RtlCopyMemory(pSmartcardExtension->IoRequest.ReplyBuffer, bATR, ATRLength);
        RtlCopyMemory(pSmartcardExtension->CardCapabilities.ATR.Buffer, bATR, ATRLength);
        *pSmartcardExtension->IoRequest.Information = ATRLength;
        pSmartcardExtension->CardCapabilities.ATR.Length = ATRLength;
        pSmartcardExtension->SmartcardReply.BufferLength = ATRLength;
        status = SmartcardUpdateCardCapabilities(pSmartcardExtension);            
#endif 
    }
    KdPrint(("\t%sStatus %#X\n",HEAD, status));       
    return status;
}

//<summary>
//  ======================================================================
//<newpara>	Author :BD		Date : 01-01-2001		</newpara>
//  ======================================================================
//<newpara>	Function :		VdPowerDownReader</newpara>
//<newpara>	Comments :										</newpara>
//</summary>
//Parameters :
//	<param name="pSmartcardExtension">      				       </param>
//<returns> </returns>
// ======================================================================
NTSTATUS VdPowerDownReader(PSMARTCARD_EXTENSION pSmartcardExtension)
{

    NTSTATUS status = STATUS_SUCCESS;
    KdPrint(("%sVdPowerDownReader\n",HEAD));

    READER_EXTENSION(uReaderPowerState) = POWER_DOWN;
#ifdef VERSION_READER_2
    if (READER_EXTENSION(uStateOfCard) == CARD_PRESENT)
        pSmartcardExtension->ReaderCapabilities.CurrentState = SCARD_PRESENT;
    else
        pSmartcardExtension->ReaderCapabilities.CurrentState = SCARD_ABSENT;
#endif   
    return status;
}

//<summary>
//  ======================================================================
//<newpara>	Author :BD		Date : 01-01-2001		</newpara>
//  ======================================================================
//<newpara>	Function :		VdSetProtocol</newpara>
//<newpara>	Comments :										</newpara>
//</summary>
//Parameters :
//	<param name="pSmartcardExtension">       				       </param>
//<returns> </returns>
// ======================================================================
NTSTATUS VdSetProtocol(PSMARTCARD_EXTENSION pSmartcardExtension)
{
    NTSTATUS    status = STATUS_SUCCESS;
    USHORT      LibProtocol;
    KdPrint(("%sVdSetProtocol\n",HEAD));
    if ((status = SmartcardAcquireRemoveLock(pSmartcardExtension)) != STATUS_SUCCESS)
    {
        pSmartcardExtension->IoRequest.Information = 0;
        // We should immediately return the control back, because the driver 
        // is about to unload.
    }
    else
    {
        LibProtocol = (USHORT)(pSmartcardExtension->MinorIoControlCode);
        pSmartcardExtension->SmartcardRequest.BufferLength = 1;
        pSmartcardExtension->SmartcardReply.BufferLength = 0;
        LibProtocol = SCARD_PROTOCOL_T0;
        pSmartcardExtension->CardCapabilities.Protocol.Selected = LibProtocol;
        *(PULONG)(pSmartcardExtension->IoRequest.ReplyBuffer) = LibProtocol;
        *(pSmartcardExtension->IoRequest.Information) = sizeof(ULONG);
        SmartcardReleaseRemoveLock(pSmartcardExtension);
    }
    return status;
}

//<summary>
//  ======================================================================
//<newpara>	Author :BD		Date : 01-01-2001		</newpara>
//  ======================================================================
//<newpara>	Function :		VdTransmit</newpara>
//<newpara>	Comments :										</newpara>
//</summary>
//Parameters :
//	<param name="pSmartcardExtension">      				       </param>
//<returns> </returns>
// ======================================================================
NTSTATUS VdTransmit(PSMARTCARD_EXTENSION pSmartcardExtension)
{
    
    NTSTATUS status;
    KdPrint(("%sVdTransmit\n",HEAD));
    if ((status = SmartcardAcquireRemoveLock(pSmartcardExtension))!= STATUS_SUCCESS)
    {
        pSmartcardExtension->IoRequest.Information = 0;
        // We should immediately return the control back, because the driver 
        // is about to unload.
    }
    else
    {
        switch (pSmartcardExtension->CardCapabilities.Protocol.Selected)
        {
        case SCARD_PROTOCOL_T0 :
            status = VdTransmitT0(pSmartcardExtension);
            break;
        case SCARD_PROTOCOL_T1 :
            status = VdTransmitT1(pSmartcardExtension);
            break;
        case SCARD_PROTOCOL_RAW :
            status = VdTransmitRaw(pSmartcardExtension);
            break;
        }
        SmartcardReleaseRemoveLock(pSmartcardExtension);
    }
    return status;
}

//<summary>
//  ======================================================================
//<newpara>	Author :BD		Date : 01-01-2001		</newpara>
//  ======================================================================
//<newpara>	Function :		VdTransmitT0</newpara>
//<newpara>	Comments :										</newpara>
//</summary>
//Parameters :
//	<param name="pSmartcardExtension">       				       </param>
//<returns> </returns>
// ======================================================================
NTSTATUS VdTransmitT0(PSMARTCARD_EXTENSION pSmartcardExtension)
{
    
    NTSTATUS status = STATUS_SUCCESS;

⌨️ 快捷键说明

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