📄 rockey.pas
字号:
unit rockey;
interface
uses Windows, SysUtils;
type
// 1. 查找计算机上连接的 Rockey2 加密锁设备
ET99_Find = function(pid: PChar; var Count: Cardinal): Integer; stdcall;
// 2. 打开指定的加密锁
ET99_Open = function(var Handle: THandle; pid: PChar; Index: Cardinal): Integer; stdcall;
// 3. 关闭指定的加密锁
ET99_Close = function(Handle: THandle): Integer; stdcall;
// 4. 验证USERPIN
ET99_Verify = function(Handle: THandle; flags: Cardinal; pin: PChar): Integer; stdcall;
// 5. 读取加密锁内容
ET99_Read = function(Handle: THandle; offset: Cardinal; Len: Cardinal; buffer512: PChar): Integer; stdcall;
// 6. 写入加密锁内容
ET99_Write = function(Handle: THandle; offset: Cardinal; Len: Cardinal; buffer512: PChar): Integer; stdcall;
// 7. 修改USERPIN
ET99_ChangeUserPIN = function(Handle: THandle; pucOldPIN: PChar; pucNewPIN: PChar): Integer; stdcall;
// 8. 生成SOPIN
ET99_GenSoPIN = function(Handle: THandle; SeedLen: Cardinal; pucSeed: PChar; pucNewSoPIN: PChar): Integer; stdcall;
// 9. 重设USERPIN
ET99_ResetPIN = function(Handle: THandle; pucSoPIN: PChar): Integer; stdcall;
// 10. 生成PID
ET99_GenPid = function(Handle: THandle; SeedLen: Cardinal; pucSeed: PChar; pid: PChar): Integer; stdcall;
// 11. 设置ET99
ET99_SetupToken = function(Handle: THandle; bSoPINRetries: Byte; bUserPINRetries: Byte; bUserReadOnly: Boolean; bReserved: Byte): Integer; stdcall;
var
ET_Find: ET99_Find;
ET_Open: ET99_Open;
ET_Close: ET99_Close;
ET_Verify: ET99_Verify;
ET_Read: ET99_Read;
ET_Write: ET99_Write;
ET_ChangeUserPIN: ET99_ChangeUserPIN;
ET_GenSoPIN: ET99_GenSoPIN;
ET_ResetPIN: ET99_ResetPIN;
ET_GenPid: ET99_GenPid;
ET_SetupToken: ET99_SetupToken;
const
AUTO_MODE: Integer = 0;
HID_MODE: Integer = -1;
ROCKEY2_DISABLE_WRITE_PROTECT: Integer = 0;
ROCKEY2_ENABLE_WRITE_PROTECT: Integer = 1;
const
// 成功,没有错误
ET_SUCCESS: Integer = 0;
// 权限不够
ET_ACCESS_DENY: Integer = $1;
// 通讯错误,没有打开设备
ET_COMMUNICATIONS_ERROR: Integer = $2;
// 给出的参数错误
ET_INVALID_PARAMETER: Integer = $3;
// 没有设置PID
ET_NOT_SET_PID: Integer = $4;
// 调用 GenUID 功能的时候,给出的 seed 字符串长度超过了 64 个字节(参数错误)
ET_NOTFOUND_DEVICE: Integer = $5;
// 无法打开设备
ET_UNIT_NOT_FOUND: Integer = $5;
// 试图改写已经写保护的硬件(硬件错误)
ET_HEAD_ERROR: Integer = $6;
// 未知错误(Windows 错误)
ET_UNKNOWN: Integer = $7;
const
etLibName = 'rockey.dll';
var
etHandle: THandle = 0;
function OpenET(pid, userPin: string): Integer;
function ReadET(const pid, userPin: string; var Data: string): Integer;
function WriteET(const pid, soPin, userPin, Data: string): Integer;
function ChangeET(const pid, soPin, userPin: string): Integer;
implementation
procedure LoadLib_ET(APath: PChar);
var
S: string;
A: array[0..80] of Char;
begin
if etHandle = 0 then
begin
S := APath + etLibName;
if not FileExists(S) then
begin
GetSystemDirectory(PChar(@A), 80);
S := string(A) + '\' + etLibName;
end;
if not FileExists(S) then Exit;
etHandle := LoadLibrary(PChar(S));
if etHandle <> 0 then
begin
@ET_Find := GetProcAddress(etHandle, 'et_FindToken');
@ET_Open := GetProcAddress(etHandle, 'et_OpenToken');
@ET_Close := GetProcAddress(etHandle, 'et_CloseToken');
@ET_Verify := GetProcAddress(etHandle, 'et_Verify');
@ET_Read := GetProcAddress(etHandle, 'et_Read');
@ET_Write := GetProcAddress(etHandle, 'et_Write');
@ET_ChangeUserPIN := GetProcAddress(etHandle, 'et_ChangeUserPIN');
@ET_GenSoPIN := GetProcAddress(etHandle, 'et_GenSOPIN');
@ET_ResetPIN := GetProcAddress(etHandle, 'et_ResetPIN');
@ET_GenPid := GetProcAddress(etHandle, 'et_GenPID');
@ET_SetupToken := GetProcAddress(etHandle, 'et_SetupToken');
end;
end;
end;
procedure FreeLib_ET;
begin
if etHandle <> 0 then
begin
try
ET_Close(etHandle);
except
end;
FreeLibrary(etHandle);
end;
@ET_Find := nil;
@ET_Open := nil;
@ET_Close := nil;
@ET_Verify := nil;
@ET_Read := nil;
@ET_Write := nil;
@ET_ChangeUserPIN := nil;
@ET_GenSoPIN := nil;
@ET_ResetPIN := nil;
@ET_GenPid := nil;
@ET_SetupToken := nil;
etHandle := 0;
end;
function OpenET(pid, userPin: string): Integer;
var
aCount: Cardinal;
begin
LoadLib_ET(PChar(ExtractFilePath(ParamStr(0))));
if (Length(pid) = 0) or (Length(userPin) = 0) then
begin
Result := ET_INVALID_PARAMETER;
Exit;
end;
Result := ET_Find(PChar(PID), aCount);
begin
if (Result <> 0) then Exit;
end;
Result := ET_Open(etHandle, PChar(PID), 1);
if Result <> 0 then Exit;
Result := ET_Verify(etHandle, 0, PChar(userPin));
if Result <> 0 then Exit;
end;
function ChangeET(const pid, soPin, userPin: string): Integer;
var
aCount: Cardinal;
begin
LoadLib_ET(PChar(ExtractFilePath(ParamStr(0))));
try
if (Length(pid) = 0) or (Length(userPin) = 0) then
begin
Result := ET_INVALID_PARAMETER;
Exit;
end;
Result := ET_Find(PChar(PID), aCount);
begin
if (Result <> 0) then Exit;
end;
Result := ET_Open(etHandle, PChar(PID), 1);
if Result <> 0 then Exit;
//恢复密码
Result := ET_ResetPIN(etHandle, PChar(soPin));
if Result <> 0 then Exit;
//重新设置密码
Result := ET_ChangeUserPIN(etHandle, PChar('FFFFFFFFFFFFFFFF'), PChar(userPin));
if Result <> 0 then Exit;
finally
FreeLib_ET;
end;
end;
function ReadET(const pid, userPin: string; var Data: string): Integer;
var
i: Integer;
buffer: array[0..59] of Char;
begin
Result := OpenET(pid, userPin);
try
if Result <> 0 then Exit;
Data := '';
for i := 0 to 10 do
begin
Result := ET_Read(etHandle, i * 60, 60, @buffer);
if Result <> 0 then
begin
Data := '';
Exit;
end;
Data := Data + string(buffer);
end;
finally
FreeLib_ET;
end;
end;
function WriteET(const pid, soPin, userPin, Data: string): Integer;
var
i: Integer;
begin
ChangeET(pid, soPin, userPin);
Result := OpenET(pid, userPin);
try
if Result <> 0 then Exit;
for i := 0 to 10 do
begin
Result := ET_Write(etHandle, i * 60, 60, PChar(Copy(Data, i * 60 + 1, 60)));
if Result <> 0 then Exit;
end;
finally
FreeLib_ET;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -