📄 smclib.h
字号:
// Use OsData->SpinLock to access this member
// (mandatory)
//
ULONG CurrentState;
//
// The channel id the reader uses depending on the type of reader:
// - Port number for serial reader
// - Port number for par reader
// - Scsi id for scsi reader
// - 0 for keyboard reader
// - device number for USB
//
ULONG Channel;
//
// Clock rates in KHz encoded as little endian
// (I.e. 3.58MHz is encoded as 3580)
// (mandatory)
//
struct {
ULONG Default;
ULONG Max;
} CLKFrequency;
// Data rates in bps encoded as little endian (mandatory)
struct {
ULONG Default;
ULONG Max;
} DataRate;
// Maximum IFSD supported by IFD
ULONG MaxIFSD;
//
// Type of power management the card supports
// (0 = ifd doesn't support pwr mgnt)
//
ULONG PowerMgmtSupport;
// Boolean that indicates that the card has been confiscated
ULONG CardConfiscated;
//
// A list of data rates supported by the ifd.
// If this list is empty, the DataRate struct will be taken
// (optional)
//
struct _DataRatesSupported {
PULONG List;
UCHAR Entries;
} DataRatesSupported;
//
// A list of supported clock frequencies.
// If this list is empty, the CLKFrequency struct will be taken
// (optional)
//
struct _CLKFrequenciesSupported {
PULONG List;
UCHAR Entries;
} CLKFrequenciesSupported;
// Reserved, do not use
UCHAR Reserved1[
100 -
sizeof(ULONG) -
sizeof(struct _DataRatesSupported) -
sizeof(struct _CLKFrequenciesSupported)
];
} SCARD_READER_CAPABILITIES, *PSCARD_READER_CAPABILITIES;
//
// This struct holds the mandatory reader info
//
typedef struct _VENDOR_ATTR {
// Manufacturer name (mandatory)
struct {
USHORT Length;
UCHAR Buffer[MAXIMUM_ATTR_STRING_LENGTH];
} VendorName;
// Name (designation) of reader (mandatory)
struct {
USHORT Length;
UCHAR Buffer[MAXIMUM_ATTR_STRING_LENGTH];
} IfdType;
//
// If more than one reader of the same type are installed
// this unit number is used to destinguish these readers
// (mandatory)
//
ULONG UnitNo;
// IFD Version number (optional)
struct {
USHORT BuildNumber;
UCHAR VersionMinor;
UCHAR VersionMajor;
} IfdVersion;
// IFD Serial number (optional)
struct {
USHORT Length;
UCHAR Buffer[MAXIMUM_ATTR_STRING_LENGTH];
} IfdSerialNo;
// Reserved, do not use
ULONG Reserved[25];
} VENDOR_ATTR, *PVENDOR_ATTR;
//
// Forward definitions
//
typedef struct _READER_EXTENSION *PREADER_EXTENSION;
typedef struct _OS_DEP_DATA *POS_DEP_DATA;
typedef struct _SMARTCARD_EXTENSION *PSMARTCARD_EXTENSION;
//
// Define the smartcard portion of the port device extension.
//
typedef struct _SMARTCARD_EXTENSION {
// Version of this structure
ULONG Version;
// Mandatory reader info
VENDOR_ATTR VendorAttr;
// Array of callback reader functions
NTSTATUS (*ReaderFunction[16])(PSMARTCARD_EXTENSION);
// Capabilities of the current inserted card
SCARD_CARD_CAPABILITIES CardCapabilities;
//
// This is used to store the last error of an overlapped operation
// (Used only for Win9x VxD's)
//
ULONG LastError;
// This struct holds the data of the users io request
struct {
// Number of bytes returned
PULONG Information;
// Pointer to data to send to the card
PUCHAR RequestBuffer;
// Number of bytes to send
ULONG RequestBufferLength;
// Pointer to buffer that receives the answer
PUCHAR ReplyBuffer;
// Size of reply buffer
ULONG ReplyBufferLength;
} IoRequest;
// Major and minor io control code for current request
ULONG MajorIoControlCode;
ULONG MinorIoControlCode;
// OS dependent data
POS_DEP_DATA OsData;
// Capabilities of the keyboard-reader
SCARD_READER_CAPABILITIES ReaderCapabilities;
// Reader specific data
PREADER_EXTENSION ReaderExtension;
//
// The reader stores all replies from the card here
// This can be used by the driver for data coming from the reader
//
SMARTCARD_REPLY SmartcardReply;
//
// Current command that will be sent to the smart card
// This can be used by the driver for data to send to the readaer
//
SMARTCARD_REQUEST SmartcardRequest;
// Data for T=0
T0_DATA T0;
// Data for T=1
T1_DATA T1;
#if defined (DEBUG) && defined (SMCLIB_NT)
PPERF_INFO PerfInfo;
#endif
// Reserved, do not use
ULONG Reserved[
25
#if defined (DEBUG) && defined (SMCLIB_NT)
- sizeof(PPERF_INFO)
#endif
];
} SMARTCARD_EXTENSION, *PSMARTCARD_EXTENSION;
#ifdef SMCLIB_VXD
// ****************************************************************************
// Windows 95 definitions and prototyping
// ****************************************************************************
#ifndef SMCLIB_DEVICE_ID
#define SMCLIB_DEVICE_ID 0x0004E /* Smart Card port driver */
#else
#if SMCLIB_DEVICE_ID != 0x0004E
#error "Incorrect SMCLIB_DEVICE_ID Definition"
#endif
#endif
#define SMCLIB_Service Declare_Service
#pragma warning(disable:4003)
Begin_Service_Table(SMCLIB)
SMCLIB_Service(SMCLIB_Get_Version)
SMCLIB_Service(SMCLIB_SmartcardCreateLink)
SMCLIB_Service(SMCLIB_SmartcardDeleteLink)
SMCLIB_Service(SMCLIB_SmartcardDeviceControl)
SMCLIB_Service(SMCLIB_SmartcardExit)
SMCLIB_Service(SMCLIB_SmartcardInitialize)
SMCLIB_Service(SMCLIB_SmartcardLogError)
SMCLIB_Service(SMCLIB_SmartcardRawReply)
SMCLIB_Service(SMCLIB_SmartcardRawRequest)
SMCLIB_Service(SMCLIB_SmartcardT0Reply)
SMCLIB_Service(SMCLIB_SmartcardT0Request)
SMCLIB_Service(SMCLIB_SmartcardT1Reply)
SMCLIB_Service(SMCLIB_SmartcardT1Request)
SMCLIB_Service(SMCLIB_SmartcardUpdateCardCapabilities)
SMCLIB_Service(SMCLIB_SmartcardGetDebugLevel)
SMCLIB_Service(SMCLIB_SmartcardSetDebugLevel)
SMCLIB_Service(SMCLIB_MapNtStatusToWinError)
SMCLIB_Service(SMCLIB_Assert)
SMCLIB_Service(SMCLIB_VxD_CreateDevice)
SMCLIB_Service(SMCLIB_VxD_DeleteDevice)
SMCLIB_Service(SMCLIB_SmartcardCompleteCardTracking)
SMCLIB_Service(SMCLIB_SmartcardCompleteRequest)
End_Service_Table(SMCLIB)
PVMMDDB
VXDINLINE
VxD_CreateDevice(
char *Device,
void (*ControlProc)(void)
)
{
_asm push ControlProc
_asm push Device
VxDCall(SMCLIB_VxD_CreateDevice);
_asm add sp, 8
}
BOOL
VXDINLINE
VxD_DeleteDevice(
PVMMDDB pDDB
)
{
_asm push pDDB
VxDCall(SMCLIB_VxD_DeleteDevice);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardAssert(
PVOID FailedAssertion,
PVOID FileName,
ULONG LineNumber,
PCHAR Message
)
{
_asm push Message
_asm push LineNumber
_asm push FileName
_asm push FailedAssertion
VxDCall(SMCLIB_Assert);
_asm add sp, 16
}
NTSTATUS
VXDINLINE
SmartcardCreateLink(
PUCHAR LinkName,
PUCHAR DeviceName
)
{
_asm push DeviceName
_asm push LinkName
VxDCall(SMCLIB_SmartcardCreateLink);
_asm add sp, 8
}
NTSTATUS
VXDINLINE
SmartcardDeleteLink(
PUCHAR LinkName
)
{
_asm push LinkName
VxDCall(SMCLIB_SmartcardDeleteLink);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardDeviceControl(
PSMARTCARD_EXTENSION SmartcardExtension,
DIOCPARAMETERS *lpDIOCParmas
)
{
_asm push lpDIOCParmas
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardDeviceControl);
_asm add sp, 8
}
VOID
VXDINLINE
SmartcardExit(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardExit);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardInitialize(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardInitialize);
_asm add sp, 4
}
VOID
VXDINLINE
SmartcardLogError(
)
{
VxDCall(SMCLIB_SmartcardLogError);
}
NTSTATUS
VXDINLINE
SmartcardRawReply(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardRawReply);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardRawRequest(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardRawRequest);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardT0Reply(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardT0Reply);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardT0Request(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardT0Request);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardT1Reply(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardT1Reply);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardT1Request(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardT1Request);
_asm add sp, 4
}
NTSTATUS
VXDINLINE
SmartcardUpdateCardCapabilities(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardUpdateCardCapabilities);
_asm add sp, 4
}
ULONG
VXDINLINE
SmartcardGetDebugLevel(
void
)
{
VxDCall(SMCLIB_SmartcardGetDebugLevel);
}
void
VXDINLINE
SmartcardSetDebugLevel(
ULONG Level
)
{
_asm push Level
VxDCall(SMCLIB_SmartcardSetDebugLevel);
_asm add sp, 4
}
void
VXDINLINE
SmartcardCompleteCardTracking(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardCompleteCardTracking);
_asm add sp, 4
}
void
VXDINLINE
SmartcardCompleteRequest(
PSMARTCARD_EXTENSION SmartcardExtension
)
{
_asm push SmartcardExtension
VxDCall(SMCLIB_SmartcardCompleteRequest);
_asm add sp, 4
}
ULONG
VXDINLINE
MapNtStatusToWinError(
NTSTATUS status
)
{
_asm push status
VxDCall(SMCLIB_MapNtStatusToWinError);
_asm add sp, 4
}
VOID
SmartcardInvertData(
PUCHAR Buffer,
ULONG Length
);
#else
// ****************************************************************************
// Windows NT and Windows CE prototyping
// ****************************************************************************
#ifndef _SMCLIBSYSTEM_
#define SMCLIBAPI _declspec(dllimport)
#else
#define SMCLIBAPI
#endif
#ifdef SMCLIB_CE
#define SmartcardLogError(Object,ErrorCode,Insertion,DumpWord)
#else
VOID
SMCLIBAPI
SmartcardLogError(
PVOID Object,
LONG ErrorCode,
PUNICODE_STRING Insertion,
ULONG DumpWord
);
#endif
#ifdef SMCLIB_CE
NTSTATUS
SMCLIBAPI
SmartcardDeviceControl(
PSMARTCARD_EXTENSION SmartcardExtension,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned
);
#else
NTSTATUS
SMCLIBAPI
SmartcardDeviceControl(
PSMARTCARD_EXTENSION SmartcardExtension,
PIRP Irp
);
#endif
VOID
SMCLIBAPI
SmartcardInitializeCardCapabilities(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SMCLIBAPI
SmartcardInitialize(
PSMARTCARD_EXTENSION SmartcardExtension
);
VOID
SMCLIBAPI
SmartcardCompleteCardTracking(
PSMARTCARD_EXTENSION SmartcardExtension
);
VOID
SMCLIBAPI
SmartcardExit(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SMCLIBAPI
SmartcardUpdateCardCapabilities(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SMCLIBAPI
SmartcardRawRequest(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SMCLIBAPI
SmartcardT0Request(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SMCLIBAPI
SmartcardT1Request(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SMCLIBAPI
SmartcardRawReply(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SMCLIBAPI
SmartcardT0Reply(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SMCLIBAPI
SmartcardT1Reply(
PSMARTCARD_EXTENSION SmartcardExtension
);
VOID
SMCLIBAPI
SmartcardInvertData(
PUCHAR Buffer,
ULONG Length
);
#ifndef SMCLIB_CE
// Following APIs not defined in Windows CE
NTSTATUS
SMCLIBAPI
SmartcardCreateLink(
IN OUT PUNICODE_STRING LinkName,
IN PUNICODE_STRING DeviceName
);
ULONG
SMCLIBAPI
SmartcardGetDebugLevel(
void
);
void
SMCLIBAPI
SmartcardSetDebugLevel(
ULONG Level
);
NTSTATUS
SmartcardAcquireRemoveLock(
IN PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
SmartcardAcquireRemoveLockWithTag(
IN PSMARTCARD_EXTENSION SmartcardExtension,
IN ULONG Tag
);
VOID
SmartcardReleaseRemoveLock(
IN PSMARTCARD_EXTENSION SmartcardExtension
);
VOID
SmartcardReleaseRemoveLockWithTag(
IN PSMARTCARD_EXTENSION SmartcardExtension,
IN ULONG Tag
);
VOID
SmartcardReleaseRemoveLockAndWait(
IN PSMARTCARD_EXTENSION SmartcardExtension
);
#else
// WinCE only
ULONG
MapNtStatusToWinError(
NTSTATUS status
);
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -