Harrison
6 years ago
10 changed files with 1831 additions and 3 deletions
Binary file not shown.
@ -0,0 +1,63 @@
|
||||
package Sense4; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @date 2018/11/25 |
||||
*/ |
||||
public class Elite4 { |
||||
|
||||
public static byte[] readElite4Serial() { |
||||
EliteLockIO eliteLockIO = LockUtils.getEliteLockIOInstance(); |
||||
eliteLockIO.initS4(false); |
||||
byte[] serial = eliteLockIO.readEliteSerial(); |
||||
eliteLockIO.closeS4(); |
||||
|
||||
return serial; |
||||
} |
||||
|
||||
/* |
||||
* Write byte[] to elite4 |
||||
*/ |
||||
public static boolean writeBytes2ToElite4(byte[] bytes) { |
||||
EliteLockIO eliteLockIO = LockUtils.getEliteLockIOInstance(); |
||||
eliteLockIO.initS4(true); |
||||
|
||||
byte[] write_len_bytes = LockUtils.intToByteArray1(bytes.length + 4); |
||||
if (!eliteLockIO.write_internal_file(0, 4, write_len_bytes)) { |
||||
eliteLockIO.closeS4(); |
||||
return false; |
||||
} |
||||
if (!eliteLockIO.write_internal_file(4, bytes.length, bytes)) { |
||||
eliteLockIO.closeS4(); |
||||
return false; |
||||
} |
||||
|
||||
eliteLockIO.closeS4(); |
||||
return true; |
||||
} |
||||
|
||||
/* |
||||
* Read byte[] from elite4 |
||||
*/ |
||||
public static byte[] readBytesFromElitee4() { |
||||
EliteLockIO eliteLockIO = LockUtils.getEliteLockIOInstance(); |
||||
eliteLockIO.initS4(true); |
||||
|
||||
byte[] len_out = eliteLockIO.read_internal_file(0, 4); |
||||
int read_len = LockUtils.byteArray2Int(len_out) - 4; |
||||
|
||||
if (read_len < 0) { |
||||
eliteLockIO.closeS4(); |
||||
return new byte[0]; |
||||
} |
||||
|
||||
byte read_bytes[] = eliteLockIO.read_internal_file(4, read_len); |
||||
eliteLockIO.closeS4(); |
||||
|
||||
return read_bytes; |
||||
} |
||||
|
||||
public static String toHexString(byte[] b) { |
||||
return LockUtils.toHexString(b); |
||||
} |
||||
} |
@ -0,0 +1,20 @@
|
||||
package Sense4; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @date 2018/11/25 |
||||
*/ |
||||
public interface EliteLockIO { |
||||
|
||||
void initS4(boolean changeDir); |
||||
|
||||
void closeS4(); |
||||
|
||||
boolean write_internal_file(int offset, int write_len, byte[] write_bytes); |
||||
|
||||
byte[] read_internal_file(int offset, int read_len); |
||||
|
||||
boolean uploadHexExeFile(); |
||||
|
||||
byte[] readEliteSerial(); |
||||
} |
@ -0,0 +1,276 @@
|
||||
package Sense4; |
||||
|
||||
import Sense4.Sense32.S4CREATEDIRINFO; |
||||
import Sense4.Sense32.S4OPENINFO; |
||||
import Sense4.Sense32.SENSE4_CONTEXT; |
||||
import com.sun.jna.ptr.IntByReference; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @date 2018/11/25 |
||||
*/ |
||||
public class EliteLockIO32 implements EliteLockIO { |
||||
public static final int MAX_BUFF_SIZE = 0xf0; |
||||
public static final byte WRITE = 0; |
||||
public static final byte READ = 1; |
||||
|
||||
public SENSE4_CONTEXT ctx= new SENSE4_CONTEXT();//[] = new Sense4.SENSE4_CONTEXT[2];
|
||||
|
||||
public Sense32 lib = Sense32.instance; |
||||
|
||||
public EliteLockIO32() {} |
||||
|
||||
public void initS4(boolean changeDir) { |
||||
IntByReference pSize = new IntByReference(0); |
||||
|
||||
int ret = lib.S4Enum(ctx, pSize); |
||||
ret = lib.S4Enum(ctx, pSize); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("列举设备失败!"); |
||||
} |
||||
|
||||
ret = lib.S4Open(ctx); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("打开设备失败!"); |
||||
} |
||||
|
||||
if (changeDir) { |
||||
ret = lib.S4ChangeDir(ctx, "\\"); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("切换目录失败!"); |
||||
lib.S4Close(ctx); |
||||
} |
||||
|
||||
ret = lib.S4VerifyPin(ctx, "12345678", 8, lib.S4_USER_PIN); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("校验用户pin失败!"); |
||||
lib.S4Close(ctx); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
public void closeS4() { |
||||
int ret = lib.S4Close(ctx); |
||||
|
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("关闭设备失败!"); |
||||
} |
||||
} |
||||
|
||||
public boolean write_internal_file(int offset, int write_len, byte[] write_bytes) { |
||||
int write_offset = offset; |
||||
int old_offset = write_offset; |
||||
|
||||
byte inBuffer[]=new byte[0xf8]; |
||||
byte outBuffer[]=new byte[0xf8]; |
||||
IntByReference pdwByteOut = new IntByReference(0); |
||||
|
||||
inBuffer[0]=WRITE; |
||||
|
||||
while (write_len > 0) { |
||||
old_offset = write_offset; |
||||
|
||||
inBuffer[2]=(byte)((write_offset >> 8) & 0xFF); |
||||
inBuffer[3]=(byte)(write_offset & 0xFF); |
||||
|
||||
if (write_len <= MAX_BUFF_SIZE) { |
||||
System.arraycopy(write_bytes, old_offset - offset, inBuffer, 4, write_len); |
||||
inBuffer[1] = (byte)(write_len & 0xFF); |
||||
write_len = 0; |
||||
write_offset += write_len; |
||||
} else { |
||||
System.arraycopy(write_bytes, old_offset - offset, inBuffer, 4, MAX_BUFF_SIZE); |
||||
inBuffer[1] = (byte)MAX_BUFF_SIZE; |
||||
write_len -= MAX_BUFF_SIZE; |
||||
write_offset += MAX_BUFF_SIZE; |
||||
} |
||||
|
||||
int ret = lib.S4Execute(ctx,"ef21",inBuffer,0xf8,outBuffer,0xf8, pdwByteOut); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("执行锁内程序失败!"); |
||||
lib.S4Close(ctx); |
||||
|
||||
return false; |
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
public byte[] read_internal_file(int offset, int read_len) { |
||||
if (read_len < 0) { |
||||
throw new IllegalArgumentException(); |
||||
} |
||||
|
||||
int read_offset = offset; |
||||
int old_offset = read_offset; |
||||
|
||||
byte[] out = new byte[read_len]; |
||||
IntByReference pdwByteOut = new IntByReference(0); |
||||
byte inBuffer[]=new byte[0xf8]; |
||||
byte outBuffer[]=new byte[0xf8]; |
||||
inBuffer[0]=READ; |
||||
|
||||
while (read_len > 0) { |
||||
old_offset = read_offset; |
||||
|
||||
// big-edian
|
||||
inBuffer[2]=(byte)((read_offset >> 8) & 0xFF); |
||||
inBuffer[3]=(byte)(read_offset & 0xFF); |
||||
|
||||
if (read_len <= MAX_BUFF_SIZE) { |
||||
inBuffer[1] = (byte)read_len; |
||||
read_len = 0; |
||||
read_offset += read_len; |
||||
} else { |
||||
inBuffer[1] = (byte)MAX_BUFF_SIZE; |
||||
read_len -= MAX_BUFF_SIZE; |
||||
read_offset += MAX_BUFF_SIZE; |
||||
} |
||||
|
||||
int ret = lib.S4Execute(ctx, "ef21",inBuffer,0xf8,outBuffer,0xf8,pdwByteOut); |
||||
if(ret!=0 || pdwByteOut.getValue() < inBuffer[1]) |
||||
{ |
||||
System.out.println("执行锁内程序失败!"); |
||||
lib.S4Close(ctx); |
||||
} else { |
||||
System.arraycopy(outBuffer, 0, out, old_offset - offset, pdwByteOut.getValue()); |
||||
} |
||||
} |
||||
|
||||
return out; |
||||
} |
||||
|
||||
public boolean uploadHexExeFile() { |
||||
Sense32 lib = Sense32.instance; |
||||
|
||||
IntByReference pSize = new IntByReference(0); |
||||
int ret = 0; |
||||
long errorCount = 0; |
||||
|
||||
IntByReference lpBytesReturned = new IntByReference(0); |
||||
SENSE4_CONTEXT[] s4_context = new SENSE4_CONTEXT[0]; |
||||
|
||||
ret = lib.S4Enum(null, pSize); |
||||
|
||||
s4_context = new SENSE4_CONTEXT[pSize.getValue() / 92]; |
||||
for (int i = 0;i< pSize.getValue() / 92; i++){ |
||||
s4_context[i] = new SENSE4_CONTEXT(); |
||||
} |
||||
|
||||
ret = lib.S4Enum(s4_context[0], pSize); |
||||
checkS4ExceptionResult(ret, "Enumerate Sense4"); |
||||
errorCount += ret; |
||||
|
||||
S4OPENINFO s4_OpenInfo = new S4OPENINFO(); |
||||
s4_OpenInfo.dwS4OpenInfoSize = 8; |
||||
s4_OpenInfo.dwShareMode = lib.S4_EXCLUSIZE_MODE; |
||||
|
||||
ret = lib.S4OpenEx(s4_context[0], s4_OpenInfo); |
||||
checkS4ExceptionResult(ret, "Open Sense4"); |
||||
errorCount += ret; |
||||
|
||||
byte [] frequency = {0x04}; |
||||
ret = lib.S4Control(s4_context[0], lib.S4_LED_WINK, frequency, 1, null, 0, lpBytesReturned); |
||||
checkS4ExceptionResult(ret, "Sense4 LED wink"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4ChangeDir (s4_context[0], "\\"); |
||||
checkS4ExceptionResult(ret, "Change Dir"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4VerifyPin(s4_context[0], "123456781234567812345678", 24, lib.S4_DEV_PIN); |
||||
checkS4ExceptionResult(ret, "Verify dev pin"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4EraseDir(s4_context[0], null); |
||||
checkS4ExceptionResult(ret, "Erase MF"); |
||||
errorCount += ret; |
||||
|
||||
S4CREATEDIRINFO s4_CreateDirInfo = new S4CREATEDIRINFO(); |
||||
s4_CreateDirInfo.dwS4CreateDirInfoSize = 12; |
||||
s4_CreateDirInfo.szAtr[0] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[1] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[2] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[3] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[4] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[5] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[6] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[7] = (byte)0xFF; |
||||
|
||||
ret = lib.S4CreateDirEx(s4_context[0], "\\", 0, lib.S4_CREATE_ROOT_DIR,s4_CreateDirInfo); |
||||
checkS4ExceptionResult(ret, "Create MF"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4VerifyPin (s4_context[0], "123456781234567812345678", 24, lib.S4_DEV_PIN ); |
||||
checkS4ExceptionResult(ret, "Verify Dev Pin"); |
||||
errorCount += ret; |
||||
|
||||
// write bin file ef21
|
||||
File demofile = new File("ReadData.bin"); |
||||
long contentsize = demofile.length (); |
||||
byte [] content = new byte[1]; |
||||
try |
||||
{ |
||||
FileInputStream is = new FileInputStream (demofile); |
||||
content = new byte[(int)contentsize]; |
||||
is.read(content, 0, (int)contentsize); |
||||
is.close(); |
||||
} |
||||
catch(Exception e) |
||||
{ |
||||
System.out.println("error: read hex bing file "); |
||||
} |
||||
|
||||
ret = lib.S4WriteFile (s4_context[0], "ef21", 0, content, (int)contentsize, (int)contentsize + 20, lpBytesReturned, |
||||
lib.S4_CREATE_NEW , lib.S4_EXE_FILE ); |
||||
checkS4ExceptionResult(ret, "Write hex bin file"); |
||||
errorCount += ret; |
||||
|
||||
// write data file bf21
|
||||
byte[] data_file = new byte[0x6000]; |
||||
|
||||
ret = lib.S4WriteFile (s4_context[0], "bf21", 0, data_file, (int)data_file.length, (int)data_file.length + 20, lpBytesReturned, |
||||
lib.S4_CREATE_NEW , lib.S4_DATA_FILE ); |
||||
checkS4ExceptionResult(ret, "Write data file"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4Control (s4_context[0], lib.S4_LED_DOWN, null, 0, null, 0, lpBytesReturned); |
||||
checkS4ExceptionResult(ret, "LED Down"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4Close(s4_context[0]); |
||||
checkS4ExceptionResult(ret, "Close Sense4"); |
||||
errorCount += ret; |
||||
|
||||
return errorCount == 0; |
||||
} |
||||
|
||||
public byte[] readEliteSerial() { |
||||
byte[] serial = new byte[8]; |
||||
int ret = lib.S4Control(ctx, lib.S4_GET_SERIAL_NUMBER, null, 0, serial, 8, null); |
||||
if (ret != 0) { |
||||
System.out.println("S4_GET_SERIAL_NUMBER: " + ret); |
||||
} |
||||
|
||||
return serial; |
||||
} |
||||
|
||||
private static void checkS4ExceptionResult(int ret, String info) { |
||||
if (ret != 0) { |
||||
System.out.println("Error Code: " + ret + " Info:" + info); |
||||
} else { |
||||
System.out.println("Success: " + info); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,274 @@
|
||||
package Sense4; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
|
||||
import Sense4.Sense64.S4CREATEDIRINFO; |
||||
import Sense4.Sense64.S4OPENINFO; |
||||
import Sense4.Sense64.SENSE4_CONTEXT; |
||||
|
||||
import com.sun.jna.ptr.IntByReference; |
||||
import com.sun.jna.ptr.LongByReference; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @date 2018/11/25 |
||||
*/ |
||||
public class EliteLockIO64 implements EliteLockIO { |
||||
public static final int MAX_BUFF_SIZE = 0xf0; |
||||
public static final byte WRITE = 0; |
||||
public static final byte READ = 1; |
||||
|
||||
public SENSE4_CONTEXT ctx= new SENSE4_CONTEXT();//[] = new Sense4.SENSE4_CONTEXT[2];
|
||||
|
||||
public Sense64 lib = Sense64.instance; |
||||
|
||||
public EliteLockIO64() {} |
||||
|
||||
public void initS4(boolean changeDir) { |
||||
LongByReference pSize = new LongByReference(0); |
||||
|
||||
long ret = lib.S4Enum(ctx, pSize); |
||||
ret = lib.S4Enum(ctx, pSize); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("List列举设备失败!" + ret); |
||||
} |
||||
|
||||
ret = lib.S4Open(ctx); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("Open打开设备失败!" + ret); |
||||
} |
||||
|
||||
if (changeDir) { |
||||
ret = lib.S4ChangeDir(ctx, "\\"); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("Change切换目录失败!" + ret); |
||||
lib.S4Close(ctx); |
||||
} |
||||
|
||||
ret = lib.S4VerifyPin(ctx, "12345678", 8, lib.S4_USER_PIN); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("Verify校验用户pin失败!" + ret); |
||||
lib.S4Close(ctx); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void closeS4() { |
||||
long ret = lib.S4Close(ctx); |
||||
|
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("Close关闭设备失败!" + ret); |
||||
} |
||||
} |
||||
|
||||
public boolean write_internal_file(int offset, int write_len, byte[] write_bytes) { |
||||
int write_offset = offset; |
||||
int old_offset = write_offset; |
||||
|
||||
byte inBuffer[]=new byte[0xf8]; |
||||
byte outBuffer[]=new byte[0xf8]; |
||||
IntByReference pdwByteOut = new IntByReference(0); |
||||
|
||||
inBuffer[0]=WRITE; |
||||
|
||||
while (write_len > 0) { |
||||
old_offset = write_offset; |
||||
|
||||
inBuffer[2]=(byte)((write_offset >> 8) & 0xFF); |
||||
inBuffer[3]=(byte)(write_offset & 0xFF); |
||||
|
||||
if (write_len <= MAX_BUFF_SIZE) { |
||||
System.arraycopy(write_bytes, old_offset - offset, inBuffer, 4, write_len); |
||||
inBuffer[1] = (byte)(write_len & 0xFF); |
||||
write_len = 0; |
||||
write_offset += write_len; |
||||
} else { |
||||
System.arraycopy(write_bytes, old_offset - offset, inBuffer, 4, MAX_BUFF_SIZE); |
||||
inBuffer[1] = (byte)MAX_BUFF_SIZE; |
||||
write_len -= MAX_BUFF_SIZE; |
||||
write_offset += MAX_BUFF_SIZE; |
||||
} |
||||
|
||||
int ret = lib.S4Execute(ctx,"ef21",inBuffer,0xf8,outBuffer,0xf8, pdwByteOut); |
||||
if(ret!=0) |
||||
{ |
||||
System.out.println("执行锁内程序失败!"); |
||||
lib.S4Close(ctx); |
||||
|
||||
return false; |
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
public byte[] read_internal_file(int offset, int read_len) { |
||||
int read_offset = offset; |
||||
int old_offset = read_offset; |
||||
|
||||
byte[] out = new byte[read_len]; |
||||
IntByReference pdwByteOut = new IntByReference(0); |
||||
byte inBuffer[]=new byte[0xf8]; |
||||
byte outBuffer[]=new byte[0xf8]; |
||||
inBuffer[0]=READ; |
||||
|
||||
while (read_len > 0) { |
||||
old_offset = read_offset; |
||||
|
||||
inBuffer[2]=(byte)((read_offset >> 8) & 0xFF); |
||||
inBuffer[3]=(byte)(read_offset & 0xFF); |
||||
|
||||
if (read_len <= MAX_BUFF_SIZE) { |
||||
inBuffer[1] = (byte)read_len; |
||||
read_len = 0; |
||||
read_offset += read_len; |
||||
} else { |
||||
inBuffer[1] = (byte)MAX_BUFF_SIZE; |
||||
read_len -= MAX_BUFF_SIZE; |
||||
read_offset += MAX_BUFF_SIZE; |
||||
} |
||||
|
||||
long ret = lib.S4Execute(ctx, "ef21",inBuffer,0xf8,outBuffer,0xf8,pdwByteOut); |
||||
if(ret!=0 || pdwByteOut.getValue() < inBuffer[1]) |
||||
{ |
||||
|
||||
System.out.println("执行锁内程序失败!"); |
||||
lib.S4Close(ctx); |
||||
} else { |
||||
System.arraycopy(outBuffer, 0, out, old_offset - offset, (int)pdwByteOut.getValue()); |
||||
} |
||||
} |
||||
|
||||
return out; |
||||
} |
||||
|
||||
public boolean uploadHexExeFile() { |
||||
Sense64 lib = Sense64.instance; |
||||
|
||||
LongByReference pSize = new LongByReference(0); |
||||
long ret = 0; |
||||
long errorCount = 0; |
||||
|
||||
LongByReference lpBytesReturned = new LongByReference(0); |
||||
SENSE4_CONTEXT[] s4_context = new SENSE4_CONTEXT[0]; |
||||
|
||||
ret = lib.S4Enum(null, pSize); |
||||
|
||||
s4_context = new SENSE4_CONTEXT[(int)pSize.getValue() / 92]; |
||||
for (int i = 0;i< pSize.getValue() / 92; i++){ |
||||
s4_context[i] = new SENSE4_CONTEXT(); |
||||
} |
||||
|
||||
ret = lib.S4Enum(s4_context[0], pSize); |
||||
checkS4ExceptionResult(ret, "Enumerate Sense4"); |
||||
errorCount += ret; |
||||
|
||||
S4OPENINFO s4_OpenInfo = new S4OPENINFO(); |
||||
s4_OpenInfo.dwS4OpenInfoSize = 8; |
||||
s4_OpenInfo.dwShareMode = lib.S4_EXCLUSIZE_MODE; |
||||
|
||||
ret = lib.S4OpenEx(s4_context[0], s4_OpenInfo); |
||||
checkS4ExceptionResult(ret, "Open Sense4"); |
||||
errorCount += ret; |
||||
|
||||
byte [] frequency = {0x04}; |
||||
ret = lib.S4Control(s4_context[0], lib.S4_LED_WINK, frequency, 1, null, 0, lpBytesReturned); |
||||
checkS4ExceptionResult(ret, "Sense4 LED wink"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4ChangeDir (s4_context[0], "\\"); |
||||
checkS4ExceptionResult(ret, "Change Dir"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4VerifyPin(s4_context[0], "123456781234567812345678", 24, lib.S4_DEV_PIN); |
||||
checkS4ExceptionResult(ret, "Verify dev pin"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4EraseDir(s4_context[0], null); |
||||
checkS4ExceptionResult(ret, "Erase MF"); |
||||
errorCount += ret; |
||||
|
||||
S4CREATEDIRINFO s4_CreateDirInfo = new S4CREATEDIRINFO(); |
||||
s4_CreateDirInfo.dwS4CreateDirInfoSize = 12; |
||||
s4_CreateDirInfo.szAtr[0] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[1] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[2] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[3] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[4] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[5] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[6] = (byte)0xFF; |
||||
s4_CreateDirInfo.szAtr[7] = (byte)0xFF; |
||||
|
||||
ret = lib.S4CreateDirEx(s4_context[0], "\\", 0, lib.S4_CREATE_ROOT_DIR,s4_CreateDirInfo); |
||||
checkS4ExceptionResult(ret, "Create MF"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4VerifyPin (s4_context[0], "123456781234567812345678", 24, lib.S4_DEV_PIN ); |
||||
checkS4ExceptionResult(ret, "Verify Dev Pin"); |
||||
errorCount += ret; |
||||
|
||||
// write bin file ef21
|
||||
File demofile = new File("ReadData.bin"); |
||||
long contentsize = demofile.length (); |
||||
byte [] content = new byte[1]; |
||||
try |
||||
{ |
||||
FileInputStream is = new FileInputStream (demofile); |
||||
content = new byte[(int)contentsize]; |
||||
is.read(content, 0, (int)contentsize); |
||||
is.close(); |
||||
} |
||||
catch(Exception e) |
||||
{ |
||||
e.printStackTrace(); |
||||
System.out.println("error: read hex bing file "); |
||||
} |
||||
|
||||
ret = lib.S4WriteFile (s4_context[0], "ef21", 0, content, (int)contentsize, (int)contentsize + 20, lpBytesReturned, |
||||
lib.S4_CREATE_NEW , lib.S4_EXE_FILE ); |
||||
checkS4ExceptionResult(ret, "Write hex bin file"); |
||||
errorCount += ret; |
||||
|
||||
// write data file bf21
|
||||
byte[] data_file = new byte[0x6000]; |
||||
|
||||
ret = lib.S4WriteFile (s4_context[0], "bf21", 0, data_file, (int)data_file.length, (int)data_file.length + 20, lpBytesReturned, |
||||
lib.S4_CREATE_NEW , lib.S4_DATA_FILE ); |
||||
checkS4ExceptionResult(ret, "Write data file"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4Control (s4_context[0], lib.S4_LED_DOWN, null, 0, null, 0, lpBytesReturned); |
||||
checkS4ExceptionResult(ret, "LED Down"); |
||||
errorCount += ret; |
||||
|
||||
ret = lib.S4Close(s4_context[0]); |
||||
checkS4ExceptionResult(ret, "Close Sense4"); |
||||
errorCount += ret; |
||||
|
||||
return errorCount == 0; |
||||
} |
||||
|
||||
private static void checkS4ExceptionResult(long ret, String info) { |
||||
if (ret != 0) { |
||||
System.out.println("Error Code: " + ret + " Info:" + info); |
||||
} else { |
||||
System.out.println("Success: " + info); |
||||
} |
||||
} |
||||
|
||||
public byte[] readEliteSerial() { |
||||
byte[] serial = new byte[8]; |
||||
long ret = lib.S4Control(ctx, lib.S4_GET_SERIAL_NUMBER, null, 0, serial, 8, null); |
||||
if (ret != 0) { |
||||
System.out.println("S4_GET_SERIAL_NUMBER: " + ret); |
||||
} |
||||
|
||||
return serial; |
||||
} |
||||
} |
@ -0,0 +1,65 @@
|
||||
package Sense4; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @date 2018/11/25 |
||||
*/ |
||||
public abstract class LockUtils { |
||||
|
||||
private static EliteLockIO intance; |
||||
|
||||
public static boolean isJVMSystem32() { |
||||
String arch_model = System.getProperty("sun.arch.data.model"); |
||||
|
||||
return "32".equals(arch_model); |
||||
} |
||||
|
||||
// big-endian
|
||||
public static byte[] intToByteArray1(int i) { |
||||
byte[] result = new byte[4]; |
||||
result[0] = (byte)((i >> 24) & 0xFF); |
||||
result[1] = (byte)((i >> 16) & 0xFF); |
||||
result[2] = (byte)((i >> 8) & 0xFF); |
||||
result[3] = (byte)(i & 0xFF); |
||||
return result; |
||||
} |
||||
|
||||
// big-endian
|
||||
public static int byteArray2Int(byte[] bytes) { |
||||
int res = 0; |
||||
res += (bytes[0] & 0xff) << 24; |
||||
res += (bytes[1] & 0xff) << 16; |
||||
res += (bytes[2] & 0xff)<< 8; |
||||
res += bytes[3] & 0xff; |
||||
return res; |
||||
} |
||||
|
||||
public static String toHexString(byte[] b) { |
||||
StringBuilder sb = new StringBuilder(); |
||||
for (int i = 0; i < b.length; i++) { |
||||
String hex = Integer.toHexString(b[i] & 0xFF); |
||||
if (hex.length() == 1) { |
||||
hex = "0" + hex; |
||||
} |
||||
sb.append(hex); |
||||
} |
||||
|
||||
return sb.toString(); |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
System.out.println("System is 32-bit: " + isJVMSystem32()); |
||||
} |
||||
|
||||
public static EliteLockIO getEliteLockIOInstance() { |
||||
if (intance == null) { |
||||
if (isJVMSystem32()) { |
||||
intance = new EliteLockIO32(); |
||||
} else { |
||||
intance = new EliteLockIO64(); |
||||
} |
||||
} |
||||
|
||||
return intance; |
||||
} |
||||
} |
@ -0,0 +1,218 @@
|
||||
package Sense4; |
||||
|
||||
import com.sun.jna.Native; |
||||
import com.sun.jna.Structure; |
||||
import com.sun.jna.ptr.IntByReference; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public interface Sense32 extends com.sun.jna.Library |
||||
{ |
||||
Sense32 instance = (Sense32) Native.loadLibrary("Sense32.dll", Sense32.class); |
||||
|
||||
public static final int S4_USER_PIN = 0x000000a1; |
||||
public static final int S4_DEV_PIN = 0x000000a2; |
||||
public static final int S4_AUTHEN_PIN = 0x000000a3; |
||||
public static final int S4_CREATE_NEW = 0x000000a5; |
||||
public static final int S4_UPDATE_FILE = 0x000000a6; |
||||
|
||||
// #define S4_EXE_FILE 0x00000008 /** executable file of virtual machine*/
|
||||
public static final byte S4_EXE_FILE = 0x00000008; |
||||
public static final byte S4_DATA_FILE = 0x00000009; |
||||
public static final int S4_FILE_EXIST = 0x00006a80; |
||||
|
||||
// #define S4_LED_DOWN 0x00000008 /** LED down*/
|
||||
public static final int S4_LED_DOWN = 0x00000008; |
||||
// #define S4_LED_WINK 0x00000028 /** LED wink*/
|
||||
public static final int S4_LED_WINK = 0x00000028; |
||||
|
||||
public static final int S4_GET_SERIAL_NUMBER = 0x00000026; |
||||
|
||||
// #define S4_EXCLUSIZE_MODE 0 /** exclusive mode*/
|
||||
// #define S4_SHARE_MODE 1 /** sharable mode*/
|
||||
public static final int S4_EXCLUSIZE_MODE = 0x00000000; |
||||
public static final int S4_SHARE_MODE = 0x00000001; |
||||
|
||||
// #define S4_CREATE_ROOT_DIR 0x000000ab /** create root directory*/
|
||||
public static final int S4_CREATE_ROOT_DIR = 0x000000ab; |
||||
|
||||
public static class RTC_TIME_T extends Structure |
||||
{ |
||||
|
||||
public byte second; /* second (0-59) */ |
||||
public byte minute; /* minute (0-59) */ |
||||
public byte hour; /* hour (0-23) */ |
||||
public byte day; /* day of month (1-31) */ |
||||
public byte week; /* day of week (0-6, sunday is 0) */ |
||||
public byte month; /* month (0-11) */ |
||||
public short year; /* year (0- 138, 1900 - 2038) */ |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("second"); |
||||
list.add("minute"); |
||||
list.add("hour"); |
||||
list.add("day"); |
||||
list.add("week"); |
||||
list.add("month"); |
||||
list.add("year"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
public static class SENSE4_CONTEXT extends Structure { |
||||
public int dwIndex; /** device index; index begins at zero*/ |
||||
public int dwVersion; /** device version*/ |
||||
public int hLock; /** device handle*/ |
||||
public byte[] reserve = new byte[12*2]; /** reserved*/ |
||||
public byte[] bAtr = new byte[56]; /** ATR*/ |
||||
public byte[] bID = new byte[8]; /** device ID*/ |
||||
public int dwAtrLen; /** ATR length*/ |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("dwIndex"); |
||||
list.add("dwVersion"); |
||||
list.add("hLock"); |
||||
list.add("reserve"); |
||||
list.add("bAtr"); |
||||
list.add("bID"); |
||||
list.add("dwAtrLen"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
/** Netlock Module infomation definition*/ |
||||
// typedef struct _S4MODULEINFO {
|
||||
// WORD wModuleID; /* Module ID*/
|
||||
// WORD wLicenseCount; /* License Count */
|
||||
// } S4MODULEINFO;
|
||||
public static class S4MODULEINFO extends Structure { |
||||
public short wModuleID; |
||||
public short wLicenseCount; |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("wModuleID"); |
||||
list.add("wLicenseCount"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
// typedef struct _S4NETCONFIG {
|
||||
// DWORD dwLicenseMode; /* License Mode */
|
||||
// DWORD dwModuleCount; /* Module Count */
|
||||
// S4MODULEINFO ModuleInfo[16]; /* Module detail infomation */
|
||||
// } S4NETCONFIG;
|
||||
public static class S4NETCONFIG extends Structure { |
||||
public int dwLicenseMode; |
||||
public int dwModuleCount; |
||||
public S4MODULEINFO[] ModuleInfo = new S4MODULEINFO[16]; |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("dwLicenseMode"); |
||||
list.add("dwModuleCount"); |
||||
list.add("ModuleInfo"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
|
||||
// S4CREATEDIRINFO structure definition
|
||||
// typedef struct _S4CREATEDIRINFO {
|
||||
// DWORD dwS4CreateDirInfoSize; /* size of the structure*/
|
||||
// BYTE szAtr[8]; /* ATR information */
|
||||
// S4NETCONFIG NetConfig; /* netlock config infomation */
|
||||
// } S4CREATEDIRINFO;
|
||||
public static class S4CREATEDIRINFO extends Structure { |
||||
public int dwS4CreateDirInfoSize; |
||||
public byte[] szAtr = new byte[8]; |
||||
public S4NETCONFIG NetConfig; |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("dwS4CreateDirInfoSize"); |
||||
list.add("szAtr"); |
||||
list.add("NetConfig"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
// typedef struct _S4OPENINFO {
|
||||
// DWORD dwS4OpenInfoSize; /* size of the structure*/
|
||||
// DWORD dwShareMode; /* share mode*/
|
||||
// } S4OPENINFO;
|
||||
public static class S4OPENINFO extends Structure { |
||||
public int dwS4OpenInfoSize; |
||||
public int dwShareMode; |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("dwS4OpenInfoSize"); |
||||
list.add("dwShareMode"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
public int S4Enum(SENSE4_CONTEXT ctx, IntByReference pSize); |
||||
|
||||
|
||||
public int S4Open(SENSE4_CONTEXT ctx); |
||||
|
||||
// DWORD WINAPI S4Control(
|
||||
// IN SENSE4_CONTEXT *pS4Ctx,
|
||||
// IN DWORD dwCtlCode,
|
||||
// IN VOID *pInBuffer,
|
||||
// IN DWORD dwInBufferLen,
|
||||
// OUT VOID *pOutBuffer,
|
||||
// IN DWORD dwOutBufferLen,
|
||||
// OUT DWORD *pdwBytesReturned
|
||||
// );
|
||||
public int S4Control( |
||||
SENSE4_CONTEXT ctx, |
||||
int dwCtlCode, |
||||
byte[] pInBuffer, |
||||
int dwInBufferLen, |
||||
byte[] pOutBuffer, |
||||
int dwOutBufferLen, |
||||
IntByReference pdwBytesReturned |
||||
); |
||||
|
||||
public int S4ChangeDir(SENSE4_CONTEXT ctx, String dir); |
||||
|
||||
//
|
||||
public int S4EraseDir(SENSE4_CONTEXT ctx, String dir); |
||||
|
||||
public int S4VerifyPin(SENSE4_CONTEXT ctx, String passwd, int passwdLen, int type); |
||||
public int S4WriteFile(SENSE4_CONTEXT ctx, |
||||
String lpszFileID, |
||||
int dwOffset, |
||||
byte lpBuffer[], |
||||
int dwBufferSize, |
||||
int dwFileSize, |
||||
IntByReference pdwBytesWritten, |
||||
int dwFlags, |
||||
byte bFileType); |
||||
|
||||
|
||||
public int S4Execute(SENSE4_CONTEXT ctx, String fileID, byte[] inputBuf, int inputSize, byte[] outputBuf, int outputSize, IntByReference pSize); |
||||
public int S4Close(SENSE4_CONTEXT ctx); |
||||
|
||||
// DWORD WINAPI S4CreateDirEx(
|
||||
// IN SENSE4_CONTEXT *pS4Ctx,
|
||||
// IN LPCSTR lpszDirID,
|
||||
// IN DWORD dwDirSize,
|
||||
// IN DWORD dwFlags,
|
||||
// IN S4CREATEDIRINFO *pCreateDirInfo
|
||||
// );
|
||||
public int S4CreateDirEx( |
||||
SENSE4_CONTEXT ctx, |
||||
String lpszDirID, |
||||
int dwDirSize, |
||||
int dwFlags, |
||||
S4CREATEDIRINFO pCreateDirInfo |
||||
); |
||||
|
||||
// DWORD WINAPI S4OpenEx(
|
||||
// IN OUT SENSE4_CONTEXT *pS4Ctx,
|
||||
// IN S4OPENINFO *pS4OpenInfo
|
||||
// );
|
||||
|
||||
public int S4OpenEx(SENSE4_CONTEXT ctx, S4OPENINFO pS4OpenInfo); |
||||
} |
@ -0,0 +1,219 @@
|
||||
package Sense4; |
||||
|
||||
import com.sun.jna.Native; |
||||
import com.sun.jna.Structure; |
||||
import com.sun.jna.ptr.IntByReference; |
||||
import com.sun.jna.ptr.LongByReference; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public interface Sense64 extends com.sun.jna.Library |
||||
{ |
||||
Sense64 instance = (Sense64) Native.loadLibrary("Sense64.dll", Sense64.class); |
||||
|
||||
public static final long S4_USER_PIN = 0x000000a1; |
||||
public static final long S4_DEV_PIN = 0x000000a2; |
||||
public static final long S4_AUTHEN_PIN = 0x000000a3; |
||||
public static final long S4_CREATE_NEW = 0x000000a5; |
||||
public static final long S4_UPDATE_FILE = 0x000000a6; |
||||
|
||||
// #define S4_EXE_FILE 0x00000008 /** executable file of virtual machine*/
|
||||
public static final byte S4_EXE_FILE = 0x00000008; |
||||
public static final byte S4_DATA_FILE = 0x00000009; |
||||
public static final long S4_FILE_EXIST = 0x00006a80; |
||||
|
||||
// #define S4_LED_DOWN 0x00000008 /** LED down*/
|
||||
public static final long S4_LED_DOWN = 0x00000008; |
||||
// #define S4_LED_WINK 0x00000028 /** LED wink*/
|
||||
public static final long S4_LED_WINK = 0x00000028; |
||||
|
||||
public static final long S4_GET_SERIAL_NUMBER = 0x00000026; |
||||
|
||||
// #define S4_EXCLUSIZE_MODE 0 /** exclusive mode*/
|
||||
// #define S4_SHARE_MODE 1 /** sharable mode*/
|
||||
public static final long S4_EXCLUSIZE_MODE = 0x00000000; |
||||
public static final long S4_SHARE_MODE = 0x00000001; |
||||
|
||||
// #define S4_CREATE_ROOT_DIR 0x000000ab /** create root directory*/
|
||||
public static final long S4_CREATE_ROOT_DIR = 0x000000ab; |
||||
|
||||
public static class RTC_TIME_T extends Structure |
||||
{ |
||||
|
||||
public byte second; /* second (0-59) */ |
||||
public byte minute; /* minute (0-59) */ |
||||
public byte hour; /* hour (0-23) */ |
||||
public byte day; /* day of month (1-31) */ |
||||
public byte week; /* day of week (0-6, sunday is 0) */ |
||||
public byte month; /* month (0-11) */ |
||||
public short year; /* year (0- 138, 1900 - 2038) */ |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("second"); |
||||
list.add("minute"); |
||||
list.add("hour"); |
||||
list.add("day"); |
||||
list.add("week"); |
||||
list.add("month"); |
||||
list.add("year"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
public static class SENSE4_CONTEXT extends Structure { |
||||
public long dwIndex; /** device index; index begins at zero*/ |
||||
public long dwVersion; /** device version*/ |
||||
public long hLock; /** device handle*/ |
||||
public byte[] reserve = new byte[12*2]; /** reserved*/ |
||||
public byte[] bAtr = new byte[56]; /** ATR*/ |
||||
public byte[] bID = new byte[8]; /** device ID*/ |
||||
public long dwAtrLen; /** ATR length*/ |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("dwIndex"); |
||||
list.add("dwVersion"); |
||||
list.add("hLock"); |
||||
list.add("reserve"); |
||||
list.add("bAtr"); |
||||
list.add("bID"); |
||||
list.add("dwAtrLen"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
/** Netlock Module infomation definition*/ |
||||
// typedef struct _S4MODULEINFO {
|
||||
// WORD wModuleID; /* Module ID*/
|
||||
// WORD wLicenseCount; /* License Count */
|
||||
// } S4MODULEINFO;
|
||||
public static class S4MODULEINFO extends Structure { |
||||
public int wModuleID; |
||||
public int wLicenseCount; |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("wModuleID"); |
||||
list.add("wLicenseCount"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
// typedef struct _S4NETCONFIG {
|
||||
// DWORD dwLicenseMode; /* License Mode */
|
||||
// DWORD dwModuleCount; /* Module Count */
|
||||
// S4MODULEINFO ModuleInfo[16]; /* Module detail infomation */
|
||||
// } S4NETCONFIG;
|
||||
public static class S4NETCONFIG extends Structure { |
||||
public long dwLicenseMode; |
||||
public long dwModuleCount; |
||||
public S4MODULEINFO[] ModuleInfo = new S4MODULEINFO[16]; |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("dwLicenseMode"); |
||||
list.add("dwModuleCount"); |
||||
list.add("ModuleInfo"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
|
||||
// S4CREATEDIRINFO structure definition
|
||||
// typedef struct _S4CREATEDIRINFO {
|
||||
// DWORD dwS4CreateDirInfoSize; /* size of the structure*/
|
||||
// BYTE szAtr[8]; /* ATR information */
|
||||
// S4NETCONFIG NetConfig; /* netlock config infomation */
|
||||
// } S4CREATEDIRINFO;
|
||||
public static class S4CREATEDIRINFO extends Structure { |
||||
public long dwS4CreateDirInfoSize; |
||||
public byte[] szAtr = new byte[8]; |
||||
public S4NETCONFIG NetConfig; |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("dwS4CreateDirInfoSize"); |
||||
list.add("szAtr"); |
||||
list.add("NetConfig"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
// typedef struct _S4OPENINFO {
|
||||
// DWORD dwS4OpenInfoSize; /* size of the structure*/
|
||||
// DWORD dwShareMode; /* share mode*/
|
||||
// } S4OPENINFO;
|
||||
public static class S4OPENINFO extends Structure { |
||||
public long dwS4OpenInfoSize; |
||||
public long dwShareMode; |
||||
protected List<String> getFieldOrder() { |
||||
List<String> list = new ArrayList<String>(); |
||||
list.add("dwS4OpenInfoSize"); |
||||
list.add("dwShareMode"); |
||||
return list; |
||||
} |
||||
} |
||||
|
||||
public long S4Enum(SENSE4_CONTEXT ctx, LongByReference pSize); |
||||
|
||||
|
||||
public long S4Open(SENSE4_CONTEXT ctx); |
||||
|
||||
// DWORD WINAPI S4Control(
|
||||
// IN SENSE4_CONTEXT *pS4Ctx,
|
||||
// IN DWORD dwCtlCode,
|
||||
// IN VOID *pInBuffer,
|
||||
// IN DWORD dwInBufferLen,
|
||||
// OUT VOID *pOutBuffer,
|
||||
// IN DWORD dwOutBufferLen,
|
||||
// OUT DWORD *pdwBytesReturned
|
||||
// );
|
||||
public long S4Control( |
||||
SENSE4_CONTEXT ctx, |
||||
long dwCtlCode, |
||||
byte[] pInBuffer, |
||||
long dwInBufferLen, |
||||
byte[] pOutBuffer, |
||||
long dwOutBufferLen, |
||||
LongByReference pdwBytesReturned |
||||
); |
||||
|
||||
public long S4ChangeDir(SENSE4_CONTEXT ctx, String dir); |
||||
|
||||
//
|
||||
public long S4EraseDir(SENSE4_CONTEXT ctx, String dir); |
||||
|
||||
public long S4VerifyPin(SENSE4_CONTEXT ctx, String passwd, long passwdLen, long type); |
||||
public long S4WriteFile(SENSE4_CONTEXT ctx, |
||||
String lpszFileID, |
||||
long dwOffset, |
||||
byte lpBuffer[], |
||||
long dwBufferSize, |
||||
long dwFileSize, |
||||
LongByReference pdwBytesWritten, |
||||
long dwFlags, |
||||
byte bFileType); |
||||
|
||||
|
||||
public int S4Execute(Sense64.SENSE4_CONTEXT ctx, String fileID, byte[] inputBuf, int inputSize, byte[] outputBuf, int outputSize, IntByReference pSize); |
||||
public long S4Close(SENSE4_CONTEXT ctx); |
||||
|
||||
// DWORD WINAPI S4CreateDirEx(
|
||||
// IN SENSE4_CONTEXT *pS4Ctx,
|
||||
// IN LPCSTR lpszDirID,
|
||||
// IN DWORD dwDirSize,
|
||||
// IN DWORD dwFlags,
|
||||
// IN S4CREATEDIRINFO *pCreateDirInfo
|
||||
// );
|
||||
public long S4CreateDirEx( |
||||
SENSE4_CONTEXT ctx, |
||||
String lpszDirID, |
||||
long dwDirSize, |
||||
long dwFlags, |
||||
S4CREATEDIRINFO pCreateDirInfo |
||||
); |
||||
|
||||
// DWORD WINAPI S4OpenEx(
|
||||
// IN OUT SENSE4_CONTEXT *pS4Ctx,
|
||||
// IN S4OPENINFO *pS4OpenInfo
|
||||
// );
|
||||
|
||||
public long S4OpenEx(SENSE4_CONTEXT ctx, S4OPENINFO pS4OpenInfo); |
||||
} |
@ -0,0 +1,690 @@
|
||||
/**************************************************************************************
|
||||
* Copyright (c) 2008, Senselock Software Technology Co., Ltd |
||||
* All rights reserved. |
||||
* |
||||
* filename: sense4.h |
||||
* |
||||
* briefs: EliteIV library interface declaration, return value and some constant definition. |
||||
* |
||||
* date: 2008.04.08 |
||||
* version: 3.1 |
||||
*******************************************************************************************/ |
||||
|
||||
#ifndef __SENSE4_H__ |
||||
#define __SENSE4_H__ |
||||
|
||||
#ifdef _MSC_VER |
||||
#pragma comment(linker, "/defaultlib:setupapi.lib") |
||||
#endif |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
|
||||
#if defined WIN32 || defined _WIN32 || defined _WIN64 |
||||
#include <windows.h> |
||||
typedef HANDLE S4HANDLE; |
||||
|
||||
#elif defined __MACH__ |
||||
typedef io_connect_t S4HANDLE; |
||||
|
||||
#else |
||||
typedef void* S4HANDLE; |
||||
#endif /* defined WIN32 || defined _WIN32 || defined _WIN64 */ |
||||
|
||||
#ifndef IN |
||||
#define IN |
||||
#endif |
||||
|
||||
#ifndef OUT |
||||
#define OUT |
||||
#endif |
||||
|
||||
#if !defined _WINDOWS_ |
||||
|
||||
#define WINAPI |
||||
|
||||
#define CONST const |
||||
|
||||
typedef unsigned char UCHAR; |
||||
typedef unsigned short USHORT; |
||||
typedef unsigned int UINT; |
||||
typedef unsigned long ULONG; |
||||
|
||||
typedef char CHAR; |
||||
typedef char TCHAR; |
||||
|
||||
typedef void VOID; |
||||
|
||||
#ifndef _BYTE_DEFINED |
||||
#define _BYTE_DEFINED |
||||
typedef unsigned char BYTE; |
||||
#endif |
||||
|
||||
#ifndef _WORD_DEFINED |
||||
#define _WORD_DEFINED |
||||
typedef unsigned short WORD; |
||||
#endif |
||||
|
||||
#ifndef _DWORD_DEFINED |
||||
#define _DWORD_DEFINED |
||||
typedef unsigned long DWORD; |
||||
#endif |
||||
|
||||
typedef VOID* LPVOID; |
||||
typedef CHAR* LPSTR; |
||||
typedef CONST CHAR* LPCSTR; |
||||
typedef CONST TCHAR* LPCTSTR; |
||||
typedef BYTE* LPBYTE; |
||||
typedef WORD* LPWORD; |
||||
typedef DWORD* LPDWORD; |
||||
|
||||
#endif /* !defined _WINDOWS */ |
||||
|
||||
//@{
|
||||
/**
|
||||
device share mode definition |
||||
*/ |
||||
#define S4_EXCLUSIZE_MODE 0 /** exclusive mode*/ |
||||
#define S4_SHARE_MODE 1 /** sharable mode*/ |
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
the control code value definition |
||||
*/ |
||||
#define S4_LED_UP 0x00000004 /** LED up*/ |
||||
#define S4_LED_DOWN 0x00000008 /** LED down*/ |
||||
#define S4_LED_WINK 0x00000028 /** LED wink*/ |
||||
#define S4_GET_DEVICE_TYPE 0x00000025 /** get the device type*/ |
||||
#define S4_GET_SERIAL_NUMBER 0X00000026 /** get the device serial number*/ |
||||
#define S4_GET_VM_TYPE 0X00000027 /** get the virtual machine type*/ |
||||
#define S4_GET_DEVICE_USABLE_SPACE 0x00000029 /** get the total space of the device*/ |
||||
#define S4_SET_DEVICE_ID 0x0000002a /** set the device ID*/ |
||||
#define S4_RESET_DEVICE 0x00000002 /** reset the device*/ |
||||
#define S4_DF_AVAILABLE_SPACE 0x00000031 /** get the free space of current directory*/ |
||||
#define S4_EF_INFO 0x00000032 /** get specified file information in current directory*/ |
||||
#define S4_SET_USB_MODE 0x00000041 /** set the device as a normal usb device*/ |
||||
#define S4_SET_HID_MODE 0x00000042 /** set the device as a HID device*/ |
||||
#define S4_GET_CUSTOMER_NAME 0x0000002b /** get the customer number*/ |
||||
#define S4_GET_MANUFACTURE_DATE 0x0000002c /** get the manufacture date of the device*/ |
||||
#define S4_GET_CURRENT_TIME 0x0000002d /** get the current time of the clock device*/ |
||||
#define S4_SET_NET_CONFIG 0x00000030 /** set netlock config */ |
||||
//@}
|
||||
|
||||
|
||||
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
device type definition |
||||
*/ |
||||
#define S4_LOCAL_DEVICE 0x00 /** local device*/ |
||||
#define S4_MASTER_DEVICE 0x01 /** net master device*/ |
||||
#define S4_SLAVE_DEVICE 0x02 /** net slave device*/ |
||||
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
virtual machine type definition |
||||
*/ |
||||
#define S4_VM_51 0x00 /** inter 51*/ |
||||
#define S4_VM_251_BINARY 0x01 /** inter 251, binary mode*/ |
||||
#define S4_VM_251_SOURCE 0X02 /** inter 251, source mode*/ |
||||
|
||||
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
NetLock license mode |
||||
*/ |
||||
#define S4_MODULE_MODE 0x00000000 /** Module mode*/ |
||||
#define S4_IP_MODE 0x00000001 /** IP mode*/ |
||||
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
PIN and key type definition |
||||
*/ |
||||
#define S4_USER_PIN 0x000000a1 /** user PIN*/ |
||||
#define S4_DEV_PIN 0x000000a2 /** developer PIN*/ |
||||
#define S4_AUTHEN_PIN 0x000000a3 /** authentication key of net device*/ |
||||
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
file type definition |
||||
*/ |
||||
|
||||
#define S4_RSA_PUBLIC_FILE 0x00000006 /** RSA public key file*/ |
||||
#define S4_RSA_PRIVATE_FILE 0x00000007 /** RSA private key file*/ |
||||
#define S4_EXE_FILE 0x00000008 /** executable file of virtual machine*/ |
||||
#define S4_DATA_FILE 0x00000009 /** data file*/ |
||||
#define S4_XA_EXE_FILE 0x0000000b /** executable file of XA User mode*/ |
||||
|
||||
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
flag value definition |
||||
*/ |
||||
#define S4_CREATE_NEW 0x000000a5 /** create a new file*/ |
||||
#define S4_UPDATE_FILE 0x000000a6 /** write data to the specified file*/ |
||||
#define S4_KEY_GEN_RSA_FILE 0x000000a7 /** generate RSA key pair files*/ |
||||
#define S4_SET_LICENCES 0x000000a8 /** set the max license number of the current module for the net device*/ |
||||
#define S4_CREATE_ROOT_DIR 0x000000ab /** create root directory*/ |
||||
#define S4_CREATE_SUB_DIR 0x000000ac /** create child directory for current directory*/ |
||||
#define S4_CREATE_MODULE 0x000000ad /** create a module directory for the net device */ |
||||
/** the following three flags can only be used when creating a new executable file */ |
||||
#define S4_FILE_READ_WRITE 0x00000000 /** the new executable file can be read and written by executable file */ |
||||
#define S4_FILE_EXECUTE_ONLY 0x00000100 /** the new executable file can't be read or written by executable file*/ |
||||
#define S4_CREATE_PEDDING_FILE 0x00002000 /** create a padding file*/ |
||||
|
||||
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
execuable file executing mode definition |
||||
*/ |
||||
#define S4_VM_EXE 0x00000000 /** executing on virtual machine*/ |
||||
#define S4_XA_EXE 0x00000001 /** executing on XA User mode */ |
||||
|
||||
//@}
|
||||
|
||||
//@{
|
||||
/**
|
||||
return value definition |
||||
*/ |
||||
|
||||
#define S4_SUCCESS 0x00000000 /** success*/ |
||||
#define S4_UNPOWERED 0x00000001 /** the device has been powered off*/ |
||||
#define S4_INVALID_PARAMETER 0x00000002 /** invalid parameter*/ |
||||
#define S4_COMM_ERROR 0x00000003 /** communication error*/ |
||||
#define S4_PROTOCOL_ERROR 0x00000004 /** communication protocol error*/ |
||||
#define S4_DEVICE_BUSY 0x00000005 /** the device is busy*/ |
||||
#define S4_KEY_REMOVED 0x00000006 /** the device has been removed */ |
||||
#define S4_INSUFFICIENT_BUFFER 0x00000011 /** the input buffer is insufficient*/ |
||||
#define S4_NO_LIST 0x00000012 /** find no device*/ |
||||
#define S4_GENERAL_ERROR 0x00000013 /** general error, commonly indicates not enough memory*/ |
||||
#define S4_UNSUPPORTED 0x00000014 /** the function isn't supported*/ |
||||
#define S4_DEVICE_TYPE_MISMATCH 0x00000020 /** the device type doesn't match*/ |
||||
#define S4_FILE_SIZE_CROSS_7FFF 0x00000021 /** the execuable file crosses address 0x7FFF*/ |
||||
#define S4_CURRENT_DF_ISNOT_MF 0x00000201 /** a net module must be child directory of the root directory*/ |
||||
#define S4_INVAILABLE_MODULE_DF 0x00000202 /** the current directory is not a module*/ |
||||
#define S4_FILE_SIZE_TOO_LARGE 0x00000203 /** the file size is beyond address 0x7FFF*/ |
||||
#define S4_DF_SIZE 0x00000204 /** the specified directory size is too small*/ |
||||
#define S4_DEVICE_UNSUPPORTED 0x00006a81 /** the request can't be supported by the device*/ |
||||
#define S4_FILE_NOT_FOUND 0x00006a82 /** the specified file or directory can't be found */ |
||||
#define S4_INSUFFICIENT_SECU_STATE 0x00006982 /** the security state doesn't match*/ |
||||
#define S4_DIRECTORY_EXIST 0x00006901 /** the specified directory has already existed*/ |
||||
#define S4_FILE_EXIST 0x00006a80 /** the specified file or directory has already existed*/ |
||||
#define S4_INSUFFICIENT_SPACE 0x00006a84 /** the space is insufficient*/ |
||||
#define S4_OFFSET_BEYOND 0x00006B00 /** the offset is beyond the file size*/ |
||||
#define S4_PIN_BLOCK 0x00006983 /** the specified pin or key has been locked*/ |
||||
#define S4_FILE_TYPE_MISMATCH 0x00006981 /** the file type doesn't match*/ |
||||
#define S4_CRYPTO_KEY_NOT_FOUND 0x00009403 /** the specified pin or key cann't be found*/ |
||||
#define S4_APPLICATION_TEMP_BLOCK 0x00006985 /** the directory has been temporarily locked*/ |
||||
#define S4_APPLICATION_PERM_BLOCK 0x00009303 /** the directory has been locked*/ |
||||
#define S4_DATA_BUFFER_LENGTH_ERROR 0x00006700 /** invalid data length*/ |
||||
#define S4_CODE_RANGE 0x00010000 /** the PC register of the virtual machine is out of range*/ |
||||
#define S4_CODE_RESERVED_INST 0x00020000 /** invalid instruction*/ |
||||
#define S4_CODE_RAM_RANGE 0x00040000 /** internal ram address is out of range*/ |
||||
#define S4_CODE_BIT_RANGE 0x00080000 /** bit address is out of range*/ |
||||
#define S4_CODE_SFR_RANGE 0x00100000 /** SFR address is out of range*/ |
||||
#define S4_CODE_XRAM_RANGE 0x00200000 /** external ram address is out of range*/ |
||||
#define S4_ERROR_UNKNOWN 0xffffffff /** unknown error*/ |
||||
|
||||
|
||||
//@}
|
||||
|
||||
#define MAX_ATR_LEN 56 /** max ATR length */ |
||||
#define MAX_ID_LEN 8 /** max device ID length */ |
||||
#define S4_RSA_MODULUS_LEN 128 /** RSA key modules length,in bytes */ |
||||
#define S4_RSA_PRIME_LEN 64 /** RSA key prime length,in bytes*/ |
||||
|
||||
//@{
|
||||
/**
|
||||
structure definition |
||||
*/ |
||||
|
||||
/* file information definition*/ |
||||
typedef struct{ |
||||
WORD EfID; /* file ID*/ |
||||
BYTE EfType; /* file type*/ |
||||
WORD EfSize; /* file size*/ |
||||
}EFINFO,*PEFINFO; |
||||
|
||||
|
||||
/* device production date structure definition*/ |
||||
typedef struct { |
||||
WORD wYear; /* year*/ |
||||
BYTE byMonth; /* month*/ |
||||
BYTE byDay; /* the day of the month */ |
||||
}S4_MANUFACTURE_DATE; |
||||
|
||||
/* current time structure definition*/ |
||||
#ifndef _TM_DEFINED |
||||
|
||||
typedef struct { |
||||
int tm_sec; /* seconds after the minute - [0,59] */ |
||||
int tm_min; /* minutes after the hour - [0,59] */ |
||||
int tm_hour; /* hours since midnight - [0,23] */ |
||||
int tm_mday; /* day of the month - [1,31] */ |
||||
int tm_mon; /* months since January - [0,11] */ |
||||
int tm_year; /* years since 1900 */ |
||||
int tm_wday; /* days since Sunday - [0,6] */ |
||||
int tm_yday; /* days since January 1 - [0,365] */ |
||||
int tm_isdst; /* daylight savings time flag */ |
||||
} TM; |
||||
#define _TM_DEFINED |
||||
#endif |
||||
|
||||
|
||||
|
||||
/**
|
||||
device version definition |
||||
*/ |
||||
typedef enum{ |
||||
SENSE4_CARD_TYPE_V2_00 = 0x00020000, /** version 2.00*/ |
||||
SENSE4_CARD_TYPE_V2_01 = 0x00020001, /** version 2.10*/ |
||||
SENSE4_CARD_TYPE_V2_02 = 0x00020002, /** version 2.20*/ |
||||
SENSE4_CARD_TYPE_V2_05 = 0x00020005, /** version 2.05*/ |
||||
SENSE4_CARD_TYPE_V2_30 = 0x00020300 /** version 2.30*/ |
||||
}CARD_VERSION; |
||||
|
||||
|
||||
/**
|
||||
device information structure definition |
||||
*/ |
||||
typedef struct { |
||||
DWORD dwIndex; /** device index; index begins at zero*/ |
||||
DWORD dwVersion; /** device version*/
|
||||
S4HANDLE hLock; /** device handle*/ |
||||
BYTE reserve[12]; /** reserved*/ |
||||
BYTE bAtr[MAX_ATR_LEN]; /** ATR*/ |
||||
BYTE bID[MAX_ID_LEN]; /** device ID*/ |
||||
DWORD dwAtrLen; /** ATR length*/ |
||||
}SENSE4_CONTEXT,*PSENSE4_CONTEXT; |
||||
|
||||
|
||||
|
||||
/** RSA public key structure*/ |
||||
typedef struct { |
||||
unsigned char modulus[S4_RSA_MODULUS_LEN]; /* modulus*/ |
||||
unsigned char exponent[S4_RSA_MODULUS_LEN]; /* public exponent*/ |
||||
} S4_RSA_PUBLIC_KEY;
|
||||
|
||||
|
||||
/** RSA private key structure*/
|
||||
typedef struct {
|
||||
unsigned char modulus[S4_RSA_MODULUS_LEN]; /* modulus*/ |
||||
unsigned char publicExponent[S4_RSA_MODULUS_LEN]; /* public exponent*/ |
||||
unsigned char exponent[S4_RSA_MODULUS_LEN]; /* private exponent*/ |
||||
unsigned char prime[2][S4_RSA_PRIME_LEN]; /* prime factors*/ |
||||
unsigned char primeExponent[2][S4_RSA_PRIME_LEN]; /* exponents for CRT*/ |
||||
unsigned char coefficient[S4_RSA_PRIME_LEN]; /* CRT coefficient*/ |
||||
} S4_RSA_PRIVATE_KEY; |
||||
|
||||
/** Netlock Module infomation definition*/ |
||||
typedef struct _S4MODULEINFO { |
||||
WORD wModuleID; /* Module ID*/ |
||||
WORD wLicenseCount; /* License Count */ |
||||
} S4MODULEINFO; |
||||
|
||||
typedef struct _S4NETCONFIG { |
||||
DWORD dwLicenseMode; /* License Mode */ |
||||
DWORD dwModuleCount; /* Module Count */ |
||||
S4MODULEINFO ModuleInfo[16]; /* Module detail infomation */
|
||||
} S4NETCONFIG; |
||||
|
||||
/** S4CREATEDIRINFO structure definition*/ |
||||
typedef struct _S4CREATEDIRINFO { |
||||
DWORD dwS4CreateDirInfoSize; /* size of the structure*/ |
||||
BYTE szAtr[8]; /* ATR information */ |
||||
S4NETCONFIG NetConfig; /* netlock config infomation */ |
||||
} S4CREATEDIRINFO; |
||||
|
||||
/** S4OPENINFO structure definition*/ |
||||
typedef struct _S4OPENINFO { |
||||
DWORD dwS4OpenInfoSize; /* size of the structure*/ |
||||
DWORD dwShareMode; /* share mode*/ |
||||
} S4OPENINFO; |
||||
|
||||
//@}
|
||||
|
||||
|
||||
//@{
|
||||
/**
|
||||
@function interface |
||||
*/ |
||||
|
||||
/*
|
||||
reserved |
||||
*/ |
||||
unsigned long WINAPI S4Startup( |
||||
VOID |
||||
); |
||||
|
||||
|
||||
/*
|
||||
reserved |
||||
*/ |
||||
unsigned long WINAPI S4Cleanup( |
||||
VOID |
||||
); |
||||
|
||||
|
||||
/**
|
||||
enumerate all EliteIV devices plugged in the computer. |
||||
if pS4CtxList is NULL, the pdwCtxListSize will return the required buffer size |
||||
|
||||
@paramter pS4CtxList [out] return the device list |
||||
@paramter pdwCtxListSize [in][out] return the amount of storage of device list, in bytes. |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4Enum( |
||||
OUT SENSE4_CONTEXT *pS4CtxList, |
||||
IN OUT DWORD *pdwCtxListSize |
||||
); |
||||
|
||||
|
||||
/**
|
||||
open the EliteIV device with sharable mode |
||||
|
||||
@paramter pS4Ctx [in][out] the context pointer of the device |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4Open( |
||||
IN OUT SENSE4_CONTEXT *pS4Ctx |
||||
); |
||||
|
||||
|
||||
/**
|
||||
close the EliteIV device |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device |
||||
|
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
|
||||
*/ |
||||
DWORD WINAPI S4Close( |
||||
IN SENSE4_CONTEXT *pS4Ctx |
||||
); |
||||
|
||||
|
||||
/**
|
||||
Send control command to device |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter dwCtlCode [in] control code |
||||
@parameter pInBuffer [in] input buffer |
||||
@parameter dwInBufferLen [in] the length of input data,in bytes |
||||
@parameter pOutBuffer [out] return output data |
||||
@parameter dwOutBufferLen [in] output buffer size, in bytes |
||||
@parameter pdwBytesReturned [out] the length of output data, cannot be NULL |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4Control( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN DWORD dwCtlCode, |
||||
IN VOID *pInBuffer, |
||||
IN DWORD dwInBufferLen, |
||||
OUT VOID *pOutBuffer, |
||||
IN DWORD dwOutBufferLen, |
||||
OUT DWORD *pdwBytesReturned |
||||
);
|
||||
|
||||
|
||||
/**
|
||||
create a new child directory for the current directory, and set current directory to the new directory |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter lpszDirID [in] ID of the new directory |
||||
@parameter dwDirSize [in] size of the new directory |
||||
@parameter dwFlags [in] flag |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4CreateDir( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN LPCSTR lpszDirID, |
||||
IN DWORD dwDirSize, |
||||
IN DWORD dwFlags |
||||
); |
||||
|
||||
|
||||
/**
|
||||
set the current directory |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter lpszPath [in] ID of the specified directory |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4ChangeDir( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN LPCSTR lpszPath |
||||
); |
||||
|
||||
|
||||
/**
|
||||
erase the root and empty the device if the specified direcotry is the device root, |
||||
otherwise erase all files or child direcotries of the specified directory. |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter lpszDirID [in] reserved, must be NULL |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4EraseDir( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN LPCTSTR lpszDirID |
||||
); |
||||
|
||||
|
||||
/**
|
||||
verify the pin, to reach a security status before call S4CreateDir,S4EraseDir,S4Execute,S4WriteFile. |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter pbPin [in] PIN value |
||||
@parameter dwPinLen [in] the PIN value length, the length of User PIN is 8 bytes,the length of developer PIN is 24 bytes |
||||
@parameter dwPinType [in] PIN type |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4VerifyPin( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN BYTE *pbPin, |
||||
IN DWORD dwPinLen, |
||||
IN DWORD dwPinType |
||||
); |
||||
|
||||
|
||||
/**
|
||||
change PIN or key value。 |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter pbOldPin [in] old PIN or key value |
||||
@parameter dwOldPinLen [in] the length of old PIN or key value |
||||
@parameter pbNewPin [in] new PIN or key value |
||||
@parameter dwNewPinLen [in] the legnth of new PIN or key value |
||||
@parameter dwPinType [in] PIN or key type |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4ChangePin( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN BYTE *pbOldPin, |
||||
IN DWORD dwOldPinLen, |
||||
IN BYTE *pbNewPin, |
||||
IN DWORD dwNewPinLen, |
||||
IN DWORD dwPinType |
||||
); |
||||
|
||||
|
||||
/**
|
||||
create a new file or update file data |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter lpszFileID [in] ID of the specified file |
||||
@parameter dwOffset [in] offset to write the file |
||||
@parameter pBuffer [in] input data buffer |
||||
@parameter dwBufferSize [in] input data length |
||||
@parameter dwFileSize [in] file size |
||||
@parameter pdwBytesWritten [out] return the length of data written into the file |
||||
@parameter dwFlags [in] flag |
||||
@parameter bFileType [in] file type |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4WriteFile( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN LPCSTR lpszFileID, |
||||
IN DWORD dwOffset, |
||||
IN VOID *pBuffer, |
||||
IN DWORD dwBufferSize, |
||||
IN DWORD dwFileSize, |
||||
OUT DWORD *pdwBytesWritten, |
||||
IN DWORD dwFlags, |
||||
IN BYTE bFileType |
||||
); |
||||
|
||||
|
||||
/**
|
||||
execute the specified executable file of current directory on virtual machine |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter lpszFileID [in] ID of the executable file |
||||
@parameter pInBuffer [in] input data buffer |
||||
@parameter dwInbufferSize [in] input data length |
||||
@parameter pOutBuffer [out] output data buffer |
||||
@parameter dwOutBufferSize [in] output data buffer size |
||||
@parameter pdwBytesReturned [out] output data length |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
*/ |
||||
DWORD WINAPI S4Execute( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN LPCSTR lpszFileID, |
||||
IN VOID *pInBuffer, |
||||
IN DWORD dwInbufferSize, |
||||
OUT VOID *pOutBuffer, |
||||
IN DWORD dwOutBufferSize, |
||||
OUT DWORD *pdwBytesReturned |
||||
); |
||||
|
||||
/**
|
||||
execute the specified executable file of current directory on virtual machine |
||||
or on XA User mode |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter lpszFileID [in] ID of the executable file |
||||
@parameter dwFlag [in] executing mode |
||||
@parameter pInBuffer [in] input data buffer |
||||
@parameter dwInbufferSize [in] input data length |
||||
@parameter pOutBuffer [out] output data buffer |
||||
@parameter dwOutBufferSize [in] output data buffer size |
||||
@parameter pdwBytesReturned [out] output data length |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4ExecuteEx( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN LPCSTR lpszFileID, |
||||
IN DWORD dwFlag, |
||||
IN VOID *pInBuffer, |
||||
IN DWORD dwInbufferSize, |
||||
OUT VOID *pOutBuffer, |
||||
IN DWORD dwOutBufferSize, |
||||
OUT DWORD *pdwBytesReturned |
||||
); |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
create a new child directory for the current directory, and set the new |
||||
directory to current directory. if creating the root directory, the function |
||||
will create a ATR file at the same time. |
||||
|
||||
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||
@parameter lpszDirID [in] ID of the new directory |
||||
@parameter dwDirSize [in] size of the new directory |
||||
@parameter dwFlags [in] flag |
||||
@parameter pCreateDirInfo [in] S4CREATEDIRINFO structure pointer |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4CreateDirEx( |
||||
IN SENSE4_CONTEXT *pS4Ctx, |
||||
IN LPCSTR lpszDirID, |
||||
IN DWORD dwDirSize, |
||||
IN DWORD dwFlags, |
||||
IN S4CREATEDIRINFO *pCreateDirInfo |
||||
); |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
open the EliteIV device using specific mode |
||||
|
||||
@paramter pS4Ctx [in][out] the context pointer of the device |
||||
@paramter pS4OpenInfo [in] S4OPENINFO structure pointer |
||||
|
||||
@return value
|
||||
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||
|
||||
*/ |
||||
DWORD WINAPI S4OpenEx( |
||||
IN OUT SENSE4_CONTEXT *pS4Ctx, |
||||
IN S4OPENINFO *pS4OpenInfo |
||||
); |
||||
|
||||
|
||||
//@}
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif //__SENSE4_H__
|
Loading…
Reference in new issue