{
Do not modify / remove this copyright notice
Copyright(C) 2004 by parker
Description: Sense KeyPro DLL Emulator
Version: 1.10
Last Update: 2004-2-22
}
library KeyProEmu;
uses
Windows;
const
//
功能码
KeyAPIReadMemory = $00;
//
读狗数据
KeyAPIWriteMemory = $01;
//
写狗数据
KeyAPISetPassword = $02;
//
设置密码
KeyAPIRemoveDriver = $03;
//
卸载驱动
//
返回值
APISuccess = $00;
//
调用成功
APIAddressOverflow = $01;
//
软件狗数据地址越界
APIInvalidFunction = $02;
//
调用功能码非法
APINoKeyPro = $03;
//
软件狗未找到或密码不对
APINoKeyDriver = $0F;
//
软件狗驱动未安装
//
一些常量
KeyMemFile =
'.\KeyData.dat'
;
//
记录软件狗数据的文件,128字节
MemSize = $40;
//
文件长度单位是Word
KeyMemSize = $3C;
//
狗数据长度单位是Word
Pass0 = $3C;
//
密码0在文件中的位置
Pass1 = $3D;
//
密码1在文件中的位置
Ext0 = $3E;
//
扩展数据0文件中的位置
Ext1 = $3F;
//
扩展数据1文件中的位置
type
pKeyproData=^KEYPRODATA;
//
指向KEYPRODATA结构体的指针
KEYPRODATA=record
//
结构体变量
ReturnFlag: Word;
//
返回值
FunctionCode: Word;
//
功能码
MemAddress: Word;
//
数据地址
Password0: Word;
//
密码0
Password1: Word;
//
密码1
MemContent: Word;
//
读出的数据或者要写入数据
Lock0: Word;
//
修改密码时填写,新密码0
Lock1: Word;
//
修改密码时填写,新密码1
Reserved: array[$0..$1F] of Word;
//
保留
end;
var
TKeyMem: array [$0..MemSize - 1] of Word;
//
存放软件狗数据的数组
{载入DLL时做的初始化动作,读取记录软件狗数据的文件,放入数组KeyMem中}
procedure DLLEnter;
var
hFile,Count: Cardinal;
begin
hFile:=CreateFile(KeyMemFile,GENERIC_READ,FILE_SHARE_READ,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
ReadFile(hFile, TKeyMem, SizeOf(TKeyMem), Count,nil);
CloseHandle(hFile);
end;
{卸载DLL时做的收尾动作,把数组KeyMem中的内容,保存到记录软件狗数据的文件}
procedure DLLExit(const Reason:Integer);
var
hFile,Count:Cardinal;
begin
if
Reason=DLL_PROCESS_DETACH
then
//
在卸载DLL时才进行保存动作
begin
hFile:=CreateFile(KeyMemFile,GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
WriteFile(hFile, TKeyMem, SizeOf(TKeyMem), Count,nil);
CloseHandle(hFile);
end;
end;
{模拟读取软件狗数据的功能}
procedure ReadMemory(const Stru:pKeyproData);
begin
if
Stru.MemAddress<KeyMemSize
then
//
判断要读取的狗数据的地址是否越界
begin
Stru.MemContent:=TKeyMem[Stru.MemAddress];
Stru.ReturnFlag:=APISuccess;
end
else
begin
Stru.ReturnFlag:=APIAddressOverflow;
//
地址越界
end;
end;
{模拟写入软件狗数据的功能}
procedure WriteMemory(const Stru:pKeyproData);
begin
if
Stru.MemAddress<KeyMemSize
then
//
判断要写入的狗数据的地址是否越界
begin
TKeyMem[Stru.MemAddress]:=Stru.MemContent;
Stru.ReturnFlag:=APISuccess;
end
else
begin
Stru.ReturnFlag:=APIAddressOverflow;
//
地址越界
end;
end;
{模拟设置软件狗密码的功能}
procedure SetPassword(const Stru:pKeyproData);
begin
TKeyMem[Pass0]:=Stru.Lock0;
TKeyMem[Pass1]:=Stru.Lock1;
Stru.ReturnFlag:=APISuccess;
end;
{模拟卸载软件狗驱动的功能}
procedure RemoveDriver(const Stru:pKeyproData);
begin
Stru.ReturnFlag:=APISuccess;
end;
{设置KeyproData结构体的元素的数据,主要供FoxPro使用}
procedure PutData(const Data:Word;const Stru:Integer;const Pos:Integer);stdcall;
export
;
var
StruData:^Word;
begin
StruData:=Pointer(Stru+Pos);
StruData^:=Data;
end;
{读取KeyproData结构体的元素的数据,主要供FoxPro使用}
function
GetData(const Stru:Integer;const Pos:Integer):Integer;stdcall;
export
;
var
StruData:^Word;
begin
StruData:=Pointer(Stru+Pos);
Result:=StruData^;
end;
{模拟对软件狗的所有操作}
procedure KEYPRO(const Stru:pKeyproData);stdcall;
export
;
begin
if
TKeyMem[Ext0]=0
then
//
设置是否模拟软件狗的比较密码功能
begin
//
扩展数据为0时比较密码,为非0时不比较
if
(Stru.Password0<>TKeyMem[Pass0]) or (Stru.Password1<>TKeyMem[Pass1])
then
begin
Stru.ReturnFlag:=APINoKeyPro;
//
密码错误
Exit;
end;
end;
case
Stru.FunctionCode of
//
根据功能码选择模拟的功能
KeyAPIReadMemory: ReadMemory(Stru);
KeyAPIWriteMemory: WriteMemory(Stru);
KeyAPISetPassword: SetPassword(Stru);
KeyAPIRemoveDriver: RemoveDriver(Stru);
else
begin
Stru.ReturnFlag:=APIInvalidFunction;
//
功能码错误
end;
end;
end;
exports
PutData,
GetData,
KEYPRO;
begin
DLLProc:=@DLLExit;
DLLEnter;
end.