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.