📄 usbcom.c
字号:
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 + -