Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1381 lines
27 KiB

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
smclib.h
Abstract:
This module contains all definitions for the smart card library.
All defintions are made according to ISO 7816.
Environment:
Kernel mode only.
Notes:
Revision History:
- Created December 1996 by Klaus Schutz
- Jun. 97: Definitions for Windows 9x added
- Feb. 98: PTS struct added
Async./Sync. protocols now combined
--*/
#ifndef _SMCLIB_
#define _SMCLIB_
#if DBG || DEBUG
#undef DEBUG
#define DEBUG 1
#undef DBG
#define DBG 1
#pragma message("Debug is turned on")
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef SMCLIB_VXD
//
// Include windows 9x specific data definitions
//
#include "smcvxd.h"
#elif defined(SMCLIB_CE)
//
// Include Windows CE specific data definitons
//
#include "smcce.h"
#else
//
// Include Windows NT specific data definitions
//
#include "smcnt.h"
#endif
#include "winsmcrd.h"
//
// This name is displayed in debugging messages
//
#ifndef DRIVER_NAME
#define DRIVER_NAME "SMCLIB"
#endif
//
// This version number changes for every change of the device extension.
// (I.e. new fields were added)
// The required version is the version number that the lib is compatible to.
//
#define SMCLIB_VERSION 0x150
#define SMCLIB_VERSION_REQUIRED 0x100
#if DEBUG
#define DEBUG_IOCTL ((ULONG) 0x00000001)
#define DEBUG_ATR ((ULONG) 0x00000002)
#define DEBUG_PROTOCOL ((ULONG) 0x00000004)
#define DEBUG_DRIVER ((ULONG) 0x00000008)
#define DEBUG_TRACE ((ULONG) 0x00000010)
#define DEBUG_ERROR ((ULONG) 0x00000020)
#define DEBUG_INFO DEBUG_ERROR
#define DEBUG_PERF ((ULONG) 0x10000000)
#define DEBUG_T1_TEST ((ULONG) 0x40000000)
#define DEBUG_BREAK ((ULONG) 0x80000000)
#define DEBUG_ALL ((ULONG) 0x0000FFFF)
#endif
#ifdef SMCLIB_VXD
// ****************************************************************************
// Windows 9x definitions
// ****************************************************************************
typedef LONG NTSTATUS;
typedef UCHAR BOOLEAN;
//
// include this file to get nt status codes
//
#include <ntstatus.h>
//
// The following three definition are taken out of the ntddk.h file
// Please refer to this file for a description
//
#define METHOD_BUFFERED 0
#define FILE_ANY_ACCESS 0
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
//
// Define the ASSERT macro for Windows 9x
//
#if DEBUG
NTSTATUS
VXDINLINE
SmartcardAssert(
PVOID FailedAssertion,
PVOID FileName,
ULONG LineNumber,
PCHAR Message
);
#define ASSERT( exp ) \
if (!(exp)) { \
SmartcardAssert( #exp, __FILE__, __LINE__, NULL ); \
_asm int 3 \
} else
#define ASSERTMSG( msg, exp ) \
if (!(exp)) { \
SmartcardAssert( #exp, __FILE__, __LINE__, msg ); \
_asm int 3 \
} else
#define SmartcardDebug(LEVEL, STRING) \
{ \
if ((LEVEL) & (DEBUG_ERROR | SmartcardGetDebugLevel())) \
_Debug_Printf_Service STRING; \
if (SmartcardGetDebugLevel() & DEBUG_BREAK) \
_asm int 3 \
}
#else
#define ASSERT( exp )
#define ASSERTMSG( msg, exp )
#define SmartcardDebug(LEVEL, STRING)
#endif // DEBUG
#define AccessUnsafeData(Irql)
#define EndAccessUnsafeData(Irql)
#define RtlCopyMemory memcpy
#define RtlZeroMemory(d, c) memset((d), 0, (c))
// ****************************************************************************
// End Windows 9x definitions
// ****************************************************************************
#elif defined(SMCLIB_CE)
// ****************************************************************************
// Windows CE definitions
// ****************************************************************************
// Use the debug message structs and macros from dbgapi.h
// Driver has to define and initialize a DEBUGPARAM struct
#define SmartcardDebug(LEVEL, STRING) DEBUGMSG(dpCurSettings.ulZoneMask & (LEVEL), STRING)
#define SmartcardLockDevice(SmartcardExtension) EnterCriticalSection(&(SmartcardExtension)->OsData->CritSect)
#define SmartcardUnlockDevice(SmartcardExtension) LeaveCriticalSection(&(SmartcardExtension)->OsData->CritSect)
#define AccessUnsafeData(Irql) SmartcardLockDevice(SmartcardExtension)
#define EndAccessUnsafeData(Irql) SmartcardUnlockDevice(SmartcardExtension)
// ****************************************************************************
// End Windows CE definitions
// ****************************************************************************
#else
// ****************************************************************************
// Windows NT definitions
// ****************************************************************************
#if DEBUG
#define SmartcardDebug(LEVEL, STRING) \
{ \
if ((LEVEL) & (DEBUG_ERROR | SmartcardGetDebugLevel())) \
DbgPrint STRING; \
if (SmartcardGetDebugLevel() & DEBUG_BREAK) \
DbgBreakPoint(); \
}
#else
#define SmartcardDebug(LEVEL, STRING)
#endif
#define AccessUnsafeData(Irql) \
KeAcquireSpinLock(&SmartcardExtension->OsData->SpinLock, (Irql));
#define EndAccessUnsafeData(Irql) \
KeReleaseSpinLock(&SmartcardExtension->OsData->SpinLock, (Irql));
#ifndef SMART_CARD_READER_GUID_DEFINED
#define SMART_CARD_READER_GUID_DEFINED
#include <initguid.h>
DEFINE_GUID(SmartCardReaderGuid, 0x50DD5230, 0xBA8A, 0x11D1, 0xBF,0x5D,0x00,0x00,0xF8,0x05,0xF5,0x30);
// ****************************************************************************
// End Windows NT definitions
// ****************************************************************************
#endif
#endif
//
// Indexes to the callback functions of the ReaderFunction array
// in the SmartcardExtension
//
#define RDF_CARD_POWER 0
#define RDF_TRANSMIT 1
#define RDF_CARD_EJECT 2
#define RDF_READER_SWALLOW 3
#define RDF_CARD_TRACKING 4
#define RDF_SET_PROTOCOL 5
#define RDF_DEBUG_LEVEL 6
#define RDF_CARD_CONFISCATE 7
#define RDF_IOCTL_VENDOR 8
#define RDF_ATR_PARSE 9
//
// Minimum buffer size for request and reply buffer
//
#define MIN_BUFFER_SIZE 288
//
// This union is used for data type conversion
//
typedef union _LENGTH {
struct {
ULONG l0;
} l;
struct {
UCHAR b0;
UCHAR b1;
UCHAR b2;
UCHAR b3;
} b;
} LENGTH, *PLENGTH;
#define MAXIMUM_ATR_CODES 4
#define MAXIMUM_ATR_LENGTH 33
typedef struct _T0_DATA {
// Number of data bytes in this request
ULONG Lc;
// Number of expected bytes from the card
ULONG Le;
} T0_DATA, *PT0_DATA;
//
// constants for the T=1 i/o function
//
#define T1_INIT 0
#define T1_START 1
#define T1_I_BLOCK 2
#define T1_R_BLOCK 3
#define T1_RESTART 4
#define T1_RESYNCH_REQUEST 0xC0
#define T1_RESYNCH_RESPONSE 0xE0
#define T1_IFS_REQUEST 0xC1
#define T1_IFS_RESPONSE 0xE1
#define T1_ABORT_REQUEST 0xC2
#define T1_ABORT_RESPONSE 0xE2
#define T1_WTX_REQUEST 0xC3
#define T1_WTX_RESPONSE 0xE3
#define T1_VPP_ERROR 0xE4
//
// Information field size the lib uses
//
#define T1_IFSD 254
#define T1_IFSD_DEFAULT 32
//
// Maximum attempts to resend a block in T1
//
#define T1_MAX_RETRIES 2
//
// Bit that indenticates if there are more data to send
//
#define T1_MORE_DATA 0x20
//
// T1 Error values
//
#define T1_ERROR_CHKSUM 1
#define T1_ERROR_OTHER 2
//
// Error detection bit as defined by ISO
//
#define T1_CRC_CHECK 1
//
// Character waiting integer default value as definded by ISO
//
#define T1_CWI_DEFAULT 13
//
// Block waiting integer default value as definded by ISO
//
#define T1_BWI_DEFAULT 4
//
// This struct is used by the lib for processing T1 I/O
// It should not be modified by a driver directly.
//
typedef struct _T1_DATA {
// Current information field size that can be transmitted
UCHAR IFSC;
// Current information field size we can receive
UCHAR IFSD;
// Number of bytes already received from smart card
ULONG BytesReceived;
// Number of bytes already sent to the card;
ULONG BytesSent;
// Total number of bytes still to send
ULONG BytesToSend;
// Type of error
UCHAR LastError;
// This flag is set whenever the IFD has to send more data
BOOLEAN MoreData;
// This is the node address byte to be sent to the card
UCHAR NAD;
// The state before an error occured
ULONG OriginalState;
// Resend counter
UCHAR Resend;
// Resync counter
UCHAR Resynch;
// The 'number' of received I-Blocks
UCHAR RSN;
// The 'number' of sent I-Blocks as defined in ISO 7816-3
UCHAR SSN;
// Current state of protocol
ULONG State;
//
// Waiting time extension requested by the smart card
// This value should be used by the driver to extend block waiting time.
//
UCHAR Wtx;
// Pointer to result buffer
PUCHAR ReplyData;
// This flag indicates that we're waiting for a reply from the card
BOOLEAN WaitForReply;
UCHAR InfBytesSent;
#ifndef _WIN64
// Reserved, do not use
UCHAR Reserved[
10 -
sizeof(PUCHAR) -
sizeof(BOOLEAN) -
sizeof(UCHAR)];
#endif
} T1_DATA, *PT1_DATA;
//
// This struct is used by the lib for T1 I/O
//
typedef struct _T1_BLOCK_FRAME {
UCHAR Nad;
UCHAR Pcb;
UCHAR Len;
PUCHAR Inf;
} T1_BLOCK_FRAME, *PT1_BLOCK_FRAME;
//
// All lib functions put their data to send in this struct.
// The driver must send this data to the reader.
//
typedef struct _SMARTCARD_REQUEST {
// Data to send
PUCHAR Buffer;
// Allocted size of this buffer
ULONG BufferSize;
// Length of data for this command
ULONG BufferLength;
} SMARTCARD_REQUEST, *PSMARTCARD_REQUEST;
//
// The driver must put the received bytes into this buffer and
// adjust the buffer length to the number of received bytes.
//
typedef struct _SMARTCARD_REPLY {
// Buffer for received smart card data
PUCHAR Buffer;
// Allocted size of this buffer
ULONG BufferSize;
// Number of bytes received from the card
ULONG BufferLength;
} SMARTCARD_REPLY, *PSMARTCARD_REPLY;
//
// Clock rate conversion table according to ISO
//
typedef struct _CLOCK_RATE_CONVERSION {
const ULONG F;
const ULONG fs;
} CLOCK_RATE_CONVERSION, *PCLOCK_RATE_CONVERSION;
//
// Bit rate adjustment factor
// The layout of this table has been slightly modified due to
// the unavailibility of floating point math support in the kernel.
// The value D has beed devided into a numerator and a divisor.
//
typedef struct _BIT_RATE_ADJUSTMENT {
const ULONG DNumerator;
const ULONG DDivisor;
} BIT_RATE_ADJUSTMENT, *PBIT_RATE_ADJUSTMENT;
#ifdef _ISO_TABLES_
#define MHZ * 1000000l
//
// The clock rate conversion table itself.
// All R(eserved)F(or Future)U(se) fields MUST be 0
//
static CLOCK_RATE_CONVERSION ClockRateConversion[] = {
{ 372, 4 MHZ },
{ 372, 5 MHZ },
{ 558, 6 MHZ },
{ 744, 8 MHZ },
{ 1116, 12 MHZ },
{ 1488, 16 MHZ },
{ 1860, 20 MHZ },
{ 0, 0 },
{ 0, 0 },
{ 512, 5 MHZ },
{ 768, 7500000 },
{ 1024, 10 MHZ },
{ 1536, 15 MHZ },
{ 2048, 20 MHZ },
{ 0, 0 },
{ 0, 0 }
};
#undef MHZ
//
// The bit rate adjustment table itself.
// All R(eserved)F(or)U(se) fields MUST be 0
//
static BIT_RATE_ADJUSTMENT BitRateAdjustment[] = {
{ 0, 0 },
{ 1, 1 },
{ 2, 1 },
{ 4, 1 },
{ 8, 1 },
{ 16, 1 },
{ 32, 1 },
{ 0, 0 },
{ 12, 1 },
{ 20, 1 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
{ 0, 0 }
};
#endif
#if defined (DEBUG) && defined (SMCLIB_NT)
typedef struct _PERF_INFO {
ULONG NumTransmissions;
ULONG BytesSent;
ULONG BytesReceived;
LARGE_INTEGER IoTickCount;
LARGE_INTEGER TickStart;
LARGE_INTEGER TickEnd;
} PERF_INFO, *PPERF_INFO;
#endif
//
// structure used for protocol type selection (PTS)
//
typedef struct _PTS_DATA {
#define PTS_TYPE_DEFAULT 0x00
#define PTS_TYPE_OPTIMAL 0x01
#define PTS_TYPE_USER 0x02
UCHAR Type;
// Fl value for PTS
UCHAR Fl;
// Dl value for PTS
UCHAR Dl;
// New clock frequency
ULONG CLKFrequency;
// New baud rate to be used after pts
ULONG DataRate;
// new stop bits to be used after pts
UCHAR StopBits;
} PTS_DATA, *PPTS_DATA;
//
// This struct holds information for the card currently in use
// The driver must store a received ATR into the ATR struct which is
// part of this struct. The lib will get all other information
// out of the ATR.
//
typedef struct _SCARD_CARD_CAPABILITIES{
// Flag that indicates that the current card uses invers convention
BOOLEAN InversConvention;
// Calculated etu
ULONG etu;
//
// Answer To Reset string returned by card.
// Use OsData->SpinLock to access this member
//
struct {
UCHAR Buffer[64];
UCHAR Length;
} ATR;
struct {
UCHAR Buffer[16];
UCHAR Length;
} HistoricalChars;
// !!! DO NOT MODIFY ANY OF THE BELOW VALUES
// OTHERWISE THE LIBRARY WON'T WORK PROPERLY
//
// The following 2 tables are provided to give
// the driver access to the ISO definitions
//
PCLOCK_RATE_CONVERSION ClockRateConversion;
PBIT_RATE_ADJUSTMENT BitRateAdjustment;
// Clock rate conversion
UCHAR Fl;
// Bit rate adjustment
UCHAR Dl;
// Maximum programming current
UCHAR II;
// Programming voltage in .1 Volts
UCHAR P;
// Extra guard time in etu
UCHAR N;
// Calculated guard time in micro seconds
ULONG GT;
struct {
// This is a bit mask of the supported protocols
ULONG Supported;
// The currently selected protocol
ULONG Selected;
} Protocol;
// T=0 specific data
struct {
// Waiting integer
UCHAR WI;
// Waiting time in micro seconds
ULONG WT;
} T0;
// T=1 specific data
struct {
// Information field size of card
UCHAR IFSC;
// Character waiting integer and block waiting integer
UCHAR CWI;
UCHAR BWI;
// Error detection code
UCHAR EDC;
// Character and block waiting time in micro seconds
ULONG CWT;
ULONG BWT;
// Block guarding time in micro seconds
ULONG BGT;
} T1;
PTS_DATA PtsData;
UCHAR Reserved[100 - sizeof(PTS_DATA)];
} SCARD_CARD_CAPABILITIES, *PSCARD_CARD_CAPABILITIES;
//
// structure used for passing configuration info between miniport/class
//
typedef struct _SCARD_READER_CAPABILITIES {
// Supported protocol by the reader/driver (mandatory)
ULONG SupportedProtocols;
ULONG Reserved;
// Type of reader (Serial/USB/PCMCIA/Keyboard etc)
ULONG ReaderType;
// Mechanical characteristics like SCARD_READER_SWALLOWS etc.
ULONG MechProperties;
//
// Current state of reader (card present/removed/activated)
// 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