📄 pcsc_drv.cpp
字号:
//<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 + -