📄 ld_reader.h
字号:
/******************************************************************************
*
* LD_Reader.H
*
* VERSION 1.0.2.0 DOS/WINDOWS/OS2
* 福建联迪公司读卡器&密码键盘API接口头文件
*
* Author :-
* System :- Borland C++ V3.1,VMS,UNIX,WINDOWS,LINUX
* Last modified :- 2006.12.19
*
* Copyright : Copyright 2006 LANDI.
* notice : All rights reserved.
*
******************************************************************************/
#ifndef __LD_READER_H
#define __LD_READER_H
//如果是LINUX,请将下面注释打开
#define _LINUX_
#define _DOS_
//#define _POS_
#ifdef _FOR_PLB_
#include "c:/foxlck/pro_ext.h"
#else
int _StrCmp(const char *s1, const char *s2);
void _PutChr(char ch);
void _PutStr(char *str);
void _MemMove(void *dest, void *src, unsigned int length);
void _MemFill(void *ptr, int character, unsigned int length);
#endif
#ifndef _DOS_
#ifndef WIN32
#define WIN32 //
#endif
#endif
#ifdef WIN32 //define in VC V6.0
#include <windows.h>
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#ifdef WINVER
#if WINVER <= 0x30a /* Windows 3.1 */
#include <windows.h>
#ifndef LOADDS
#define LOADDS _loadds
#endif
#ifndef PASCAL
#define PASCAL _pascal
#endif
#define DllExport WINAPI _export //Use for make dll
#define MAKEWORD(a, b) ((WORD) (a) | ((WORD) (b)) << 8)
typedef WORD HICC;
typedef HICC FAR *LPHICC;
#else // Windows95 or later
#include <windows.h>
#define DllExport WINAPI
typedef WORD HICC;
typedef HICC FAR *LPHICC;
#endif
#else
#ifndef FAR
#define FAR
#endif
#define DllExport FAR
#define NEAR near
#define LONG long
#define VOID void
#define PASCAL
#define LOADDS
#define FALSE 0
#define TRUE 1
typedef unsigned char BYTE;
typedef BYTE FAR *LPBYTE;
typedef char FAR *LPSTR;
typedef unsigned short WORD; //Modify in V3.1
typedef WORD FAR *LPWORD;
typedef unsigned long DWORD;
typedef DWORD FAR *LPDWORD;
typedef int BOOL;
typedef int FAR *LPINT;
typedef int (FAR PASCAL *FARPROC) ();
typedef LPSTR HANDLE;
typedef HANDLE FAR *LPHANDLE;
typedef WORD HWND;
#define MAKELONG(a, b) ((LONG) (((WORD) (a)) | (((DWORD) ((WORD) (b))) << 16)))
#define LOWORD(l) ((WORD) (l))
#define HIWORD(l) ((WORD) ((((DWORD) (l)) >> 16) & 0xFFFF))
#define LOBYTE(w) ((BYTE) (w))
#define HIBYTE(w) ((BYTE) (((WORD) (w) >> 8) & 0xFF))
#define MAKEWORD(a, b) ((WORD) (a) | ((WORD) (b)) << 8)
typedef WORD HICC;
typedef HICC FAR *LPHICC;
#endif
#define NAP_TIME 10
#define MAX_DATA_LEN 1000
//#define DEFAULT_TIMEOUT 10000 //缺省通讯超时 10s
#define DEFAULT_TIMEOUT 1000 //缺省通讯超时 10s
#define READPIN_TIMEOUT 70000 //缺省读密码超时 61s
#define uchar unsigned char
#define ushort unsigned short
#define uint unsigned int
#define ulong unsigned long
typedef ulong DevHandle;
typedef unsigned char unsigned_byte_int;
//定义读卡器类型
#define READER_STAR752 1
#define READER_STAR752P 2
#define READER_STAR750 3
#define READER_STAR750P 4
#define READER_STAR7100 5
#ifndef NORMAL
#define NORMAL 0
#endif
#ifndef EXCEPTION
#define EXCEPTION - 1
#endif
/**********************************************************************
758宏定义(用于V3.4.4以后版本)
**********************************************************************/
#ifndef _POS_
//PINPAD CONTROL MODULE
#define EM_pin_SUCCESS (uchar) 'S'
#define EM_pin_ERROR (uchar) 'E'
#define EM_pin_ABOLISH (uchar) 'C'
#define EM_pin_FAULT (uchar) 'B'
#define EM_pin_CANCEL (uchar) 'D'
#define EM_pin_KEYON (uchar) 0x00
#define EM_pin_KEYOFF (uchar) 0x01
#define EM_pin_ENCRYPTON (uchar) 0x01
#define EM_pin_ENCRYPTOFF (uchar) 0x00
#define EM_pin_CODEERR (uchar) 0x00
#define EM_pin_MASTERKEY (uchar) 0x00
#define EM_pin_WORKKEY (uchar) 0x01
#define EM_pin_MACKEY (uchar) 0x02
#define EM_pin_CTRLVER (uchar) 'C'
#define EM_pin_USERVER (uchar) 'U'
/**********************************************************************
7100宏定义(用于V3.4以后版本)
**********************************************************************/
#define USING_MIF '1'
#define USING_PINPAD '2'
//函数返回值定义
#define EM_mag_NORMAL 0x00 //正常读卡(已读卡)
#define EM_mag_MANUAL 0x03 //手动输入卡号
#define EM_mag_NEEDSTART 0x04 //之前没有调有EA_vStartTrackIn函数
//#define EM_mag_NODATA 0x05 //缓冲区没有数据可读
//设置是否读取磁道一数据
#define EM_mag_TRKOFF 0x00 //设置磁道一关闭
#define EM_mag_TRKON 0x01 //设置磁道一打开
//设置获取磁卡数据方式
//#define EM_RECARD 0x00 //无限等待方式
#define EM_TRACKIN 0x01 //读取缓冲区方式
#define EM_mag_ENMANUAL 0x00 //允许手动输入
#define EM_mag_DISMANUAL 0x01 //不允许手动输入
//磁道数据结构体中磁道状态标志字节ucTrkFlag的值
#define EM_mag_SUCCESS 0x00 //正确
#define EM_mag_NULL 0x01 //磁道数据为空
#define EM_mag_HEADERR 0x02 //未找到起始
#define EM_mag_PARERR 0x03 //某字节较验错
#define EM_mag_TAILERR 0x04 //未找到结束
#define EM_mag_LRCERR 0x05 //总较验错
#define EM_mag_ENDERR 0x06 //LRC后不是后导零
#define EM_ic_ATRERR (uchar) 0xA2 //上电时读卡片回送ATR错误
#define EM_ic_DATAERR (uchar) 0xE2 //读卡片回送数据错
#define EM_ic_NOPOWER (uchar) 0xE3 //未上电
#define EM_ic_FORRESP (uchar) 0xE6
#define EM_ic_SWDIFF (uchar) 0xE7 //SW1!=0X90或者SW2!=0X00
#define EM_ic_NOCARD (uchar) 0xFB //缺卡(SAM卡无此返回)
#endif
#define EM_RECARD 0x00 //无限等待方式
#define EM_mag_NODATA 0x05 //缓冲区没有数据可读
// 数据结构声明
typedef struct //用于保存返回读出的磁卡数据
{
uchar ucTrkFlag; //保存的磁卡数据信息状态
uchar ucTrkLength; //保存的磁卡有效数据长度
uchar ucTrkBuf[150]; //保存的磁卡有效数据
} ET_MAGCARD;
#define EM_SUCCESS (uchar) 0x00 //成功
#define EM_ERROR (uchar) 0x01 //错误
#define EM_ABOLISH (uchar) 0xF6 //
#define EM_DEVICE_USED (uchar) 0xF7 //设备已经打开
#define EM_TIMEOUT (uchar) 0xF8 //超时
#define EM_ERRPARAM (uchar) 0xF9 //错误的参数
#define EM_ERRHANDLE (uchar) 0xFA //错误的句柄
#define EM_DEVICE_DISABLE (uchar) 0xFC //设备未打开
#define EM_ALLOCERR (uchar) 0xFD //
#define EM_FAILED (uchar) 0xFE //其它错误
#define EM_UNKNOWCOMMAND_FF (uchar) 0xFF //不支持的命令
//返回值定义
#define EM_4428_NOVERIFY 0xE7 //卡片密码未校验 E7
#define EM_4428_CHGABLE 0x43 //该地址数据可修改 43
#define EM_4428_CHGDISABLE 0x44 //该地址数据不可修改44
//函数参数定义
#define EM_4428_ENABLE 0x00 //允许修改
#define EM_4428_DISABLE 0x01 //不许修改
/* PinPad通讯速率 */
#define PAD57600 4
#define PAD28800 3
#define PAD19200 2
#define PAD9600 1
#define DES_E 0x00
#define EDE 0x10
#define DED 0x20
#define XOR 0x80
/* PinPad输入模式,用于input_str中ubMode参数,控制输入时的显示模式 */
#define DISP 0x00 /*正常显示*/
#define ASTERISK 0x01 /*隐藏模式,只显示"*"*/
#define HEX 0x02 /*允许输入0~9,a~f的十六进制符号*/
#define CHAR 0x04 /*允许输入0~9,a~z*/
#define PINDATA 0x08 /*输入不可读出*/
#define CLR_ALL 0x40
#define VAR_LEN 0x80 /*可变长度输入,直到按"确认"*/
#define RET_IMMEDI 0x20 /*达到指定长度后立即返回*/
/* PinPad文件读写认证权限,用于PAD_FILE_ACC._bit.read_auth和write_auth
可以用"或"合并使用 */
#define PLAIN_MODE_PAD_FILE 0x00 /*明文方式*/
#define CIPHER_MODE_PAD_FILE 0x01 /*密文方式*/
#define CERTIFY_MODE_PAD_FILE 0x02 /*校验方式,即用MAC计算明文求出校验位,
取出前4位加在数据后面*/
/* 以下为函数返回码 */
#ifndef SUCC
#define SUCC 0 /*正确执行*/
#endif
#ifndef FAIL
#define FAIL - 1 /*失败*/
#endif
#define NO_KEY - 2 /*所需的密钥不存在*/
#define OUT_MEM - 3 /*某一数据区已存满*/
#define KEY_USAGE_ERR - 4 /*密钥使用方法不当*/
#define BUSY_INPUT - 5 /*PinPad正在等待输入*/
#define ACC_DENY - 6 /*数据校验不正确/密钥使用方法不当/文件打开方式错*/
#define ERR_NO_DATA - 7 /*指定的数据区不存在*/
#define FILE_EXIST - 8 /*创建文件时,文件已经存在*/
#define FILE_RECNO_ERR - 9 /*文件记录号错*/
#define FILE_NAME_ERR - 10 /*文件不存在*/
#define NO_RANDOM - 11 /*未事先申请随机数*/
#define KEY_EXIST - 12 /*指定密钥已经存在*/
#define BLACK_FILE_ERR - 13 /* 黑名单文件被破坏*/
#define FILE_NOT_INIT - 14 /*文件未初始化 */
#define FILE_SPACE_ERR - 15 /*该文件的空间不足 */
/* Usage Error */
#define TOO_LONG - 21 /*数据太长*/
#define NO_DOT_FILE - 22 /*调用显示函数时,在当前目录下无字符点阵文件*/
#define ERR_COMMAND - 23 /*错误的命令调用*/
/* Communication Error */
#define CONNECT_ERR - 96 /*属主设备建立连接错误 */
#define SNDCMD_ERR - 97 /*属主设备发送指令出错*/
#define VERIFY_ERR - 98 /*属主设备接收数据,校验出错*/
#define RCV_TIMEOUT - 99 /*接收数据超时*/
#define INIT_ERR - 100 /*PinPad初始化错:未初始化而调用其他函数,
或者初始化多次.*/
#define UNDEF_CODE - 101 /*未定义的返回码*/
#define PARA_ERR - 102 /*参数错误*/
//用于dll输出全局变量
//PAD03生成动态库用
//__declspec(dllimport) unsigned char CARD_STATUS , CARD_SW1,CARD_SW2;
//SSSE生成动态库用
extern unsigned char CARD_STATUS, CARD_SW1, CARD_SW2;
#define ICC_OPER_OK (CARD_STATUS == 0 && CARD_SW1 == 0x90 && CARD_SW2 == 0) ? 1 : 0
#define ICC_STATUS(status, sw1, sw2) (CARD_STATUS == status && CARD_SW1 == sw1 && CARD_SW2 == sw2) ? 1 : 0
/*
* 宏定义:清空缓冲区。
*/
#define BUFCLR(szBuf) memset(szBuf, 0, sizeof(szBuf))
#define ENQ 0x05
#define STX 0x02
#define ETX 0x03
#define EOT 0x04
#define ACK_750 0x06
#define NAK 0x15
#define ESC 0x1b
#define SUCC_PAD 0
#define FAIL_PAD 1
#define TOO_LONG_PAD 2
#define RCVCMD_ERR_PAD 3
#define NO_KEY_PAD 4
#define WK_FULL_PAD 5
#define KEY_USAGE_ERR_PAD 6
#define BUSY_INPUT_PAD 7
#define NO_DATA_PAD 8
#define ACC_DENY_PAD 9
#define FILE_EXIST_PAD 10
#define OUT_MEM_PAD 11
#define FILE_RECNO_ERR_PAD 12
#define FILE_NAME_ERR_PAD 13
#define NO_RANDOM_PAD 14
#define KEY_EXIST_PAD 15
#define INIT_ERR_PAD 16
#define ERR_COMMAND_PAD 17
#define FAIL_SECU_PAD 18
/* 用于75016新的文件系统*/
#define FILE_FAIL_PAD 0xfc //失败
#define FILE_NOT_INIT_PAD 0xfd //未初始化
#define FILE_FALSH_ERR_PAD 0xfb //FLASH剩余空间不足
#define FILE_SPACE_ERR_PAD 0xf8 //该文件的空间不足,记录已经达到最大,无法继续添加
#define FILE_HMD_ERR_PAD 0xfa //黑名单被破坏
#define FILE_NOT_FOUND_PAD 21 //文件不存在
#define FILE_REC_FOUND_PAD 22 //存在该记录
#define FILE_REC_NOT_FOUND_PAD 23 //不存在该记录
typedef enum
{
S9600 = 0x000c,
S19200 = 0x0006,
S28800 = 0x0004,
S57600 = 0x0002
} BPS;
typedef enum
{
INIT_PORT = 0,
GET_SERIALNO = 0x01,
INIT_PAD = 0x02,
PAD_SOUND = 0x03,
DISPS = 0x04,
DISPLAY = 0x05,
DISPDOT = 0x06,
GET_KEY = 0x07,
CHECK_KEY = 0x08,
INPUT_STR = 0x09,
GET_STR = 0x0a,
CMP_STR = 0x0b,
CHG_MASTERKEY = 0x10,
WRITE_WORKKEY = 0x11,
DEL_WORKKEY = 0x12,
ALLC_TMP_KEY = 0x13,
DEL_TMP_KEY = 0x14,
GET_RANDOM = 0x20,
DATA_DES = 0x21,
X919_GKEY = 0x22,
DATA_3_DES = 0x23,
GEN_MAC = 0x24,
GEN_3DES_MAC = 0x25,
X98_OUT_PAD = 0x26,
ICC_IN = 0x30,
POWER_UP_750 = 0x31,
POWER_DOWN_750 = 0x32,
INCOME = 0x33,
OUTGO = 0x34,
EXCHG = 0x35,
INIT_FILE = 0x40,
CREATE_FILE = 0x41,
GET_FILE_HEAD = 0x42,
OPEN_FILE = 0x43,
READ_FILE = 0x44,
WRITE_FILE = 0x45,
DEL_REC = 0x46,
CLOSE_FILE = 0x47,
DEL_FILE = 0X48,
FREE_REC = 0x49,
FIND_HMD = 0x4a,
UPDATE_HMD = 0x4b,
APPEND_FILE = 0x4c,
MODIFY_FILE = 0x4d,
INSERT_HMD = 0x4e,
DEL_HMD = 0x4f,
GET_K_INDEX = 0x50,
SET_K_INDEX = 0x51,
WRITE_PBOCKEY = 0x52,
VERIFY_PBOC_PIN = 0x53,
START_DEBIT = 0x54,
CHK_DEBIT_CERT = 0x55,
CHANGE_PBOC_PIN = 0x56,
GEN_SESSKEY = 0x57,
WRITE_USER_WORKKEY = 0x58,
WRITE_WORK = 0x59,
SAMID = 0x61,
MEMICC = 0x60,
CLR_PBOC = 0x62,
TEST_PAD = 0x63,
POS_LOGIN = 0x64,
POS_TIME = 0x65,
WRITE_MAST = 0x67,
WRITE_KEY = 0x68,
SET_TRACK = 0x70,
OPEN_MAG = 0x71,
CLOSE_MAG = 0x72,
RE_CARD = 0x73,
START_TRACK_IN = 0x74,
TRACK_IN = 0x75,
READ_PARA = 0x76,
WRITE_PARA = 0x77,
GET_SERIAL = 0x78,
SET_MODE_7100 = 0x80,
RESET_PAD = 0xff
} INST;
/* PinPad文件读写权限 */
struct Acc_bit
{
unsigned int black : 1; /*置1-黑名单文件标志*/
unsigned int read_auth : 1; /*置1-以'读'方式打开文件前,必需申请随机数,用"读密钥"
加密后,送入open_pad_file中auth_data参数*/
unsigned int read_check : 2; /*读文件认证权限*/
unsigned int RFU2 : 1; /*保留*/
unsigned int write_auth : 1; /*置1-以'写'方式打开文件前,必需申请随机数,用"写密钥"
加密后,送入open_pad_file中auth_data参数*/
unsigned int write_check : 2; /*写文件认证权限*/
};
union PAD_FILE_ACC
{
unsigned char _byte;
struct Acc_bit _bit;
};
/*文件头结构*/
struct PAD_FILE_STRU
{
unsigned char name[9]; /*文件名*/
union PAD_FILE_ACC acc; /*文件读写权限*/
unsigned char r_keyname[4]; /*读密钥*/
unsigned char w_keyname[4]; /*写密钥*/
unsigned char open_flag; /*文件打开标志*/
short recnum; /*一般文件此域保存记录数,
黑名单文件保存黑名单记录长度*/
};
#ifdef __cplusplus
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -