📄 plugin.pas.svn-base
字号:
RegisteredFunctions2: array of TPluginfunctionType2;
RegisteredFunctions3: array of TPluginfunctionType3;
RegisteredFunctions4: array of TPluginfunctionType4;
RegisteredFunctions5: array of TPluginfunctionType5;
end;
type TPluginHandler=class
private
pluginMREW: TMultiReadExclusiveWriteSynchronizer;
plugins: array of TPlugin;
function GetDLLFilePath(pluginid: integer):string;
public
function GetPluginID(dllname:string):integer;
function GetPluginName(dllname:string):string;
function LoadPlugin(dllname: string):integer;
procedure FillCheckListBox(clb: TCheckListbox);
procedure EnablePlugin(pluginid: integer);
procedure DisablePlugin(pluginid: integer);
function handledebuggerplugins(devent:PDebugEvent):integer;
function handlenewprocessplugins(processid: dword; peprocess:dword):boolean;
function handlechangedpointers(section: integer):boolean;
function registerfunction(pluginid,functiontype:integer; init: pointer):integer;
function unregisterfunction(pluginid,functionid: integer): boolean;
property dllfilepath[pluginid: integer]: string read getdllfilepath;
constructor create;
end;
var pluginhandler: TPluginhandler;
exportedfunctions: TExportedFunctions2;
implementation
uses mainunit,memorybrowserformunit,formsettingsunit;
function TPluginHandler.GetDLLFilePath(pluginid: integer):string;
begin
pluginMREW.BeginRead;
result:=plugins[pluginid].filepath;
pluginMREW.EndRead;
end;
function TPluginHandler.registerfunction(pluginid,functiontype:integer; init: pointer):integer;
type Tfunction1=record
name: pchar;
callbackroutine: pointer;
end;
type Tfunction3=record
callbackroutine: pointer;
end;
type PFunction1=^TFunction1;
type PFunction2=^TFunction1; //same
type PFunction3=^TFunction3;
type PFunction4=^TFunction3;
type PFunction5=^TFunction3;
var i: integer;
newmenuitem: TMenuItem;
f1: TPluginfunctionType1;
f2: TPluginfunctionType2;
f3: TPluginfunctionType3;
f4: TPluginfunctionType4;
f5: TPluginfunctionType5;
begin
result:=-1;
pluginmrew.BeginWrite;
try
if pluginid>=length(plugins) then exit;
case functiontype of
0: begin
//plugin for the rightclick on the addresslist
f1:=TPluginfunctionType1.Create;
f1.pluginid:=pluginid;
f1.functionid:=plugins[pluginid].nextid;
f1.name:=PFunction1(init).name;
f1.callback:=PFunction1(init).callbackroutine;
if not mainform.Plugins1.Visible then
mainform.Plugins1.Visible:=true;
newmenuitem:=tmenuitem.Create(mainform);
newmenuitem.Caption:=f1.name;
newmenuitem.Tag:=dword(f1);
newmenuitem.onclick:=mainform.plugintype1click;
mainform.Plugins1.Add(newmenuitem);
f1.menuitem:=newmenuitem;
setlength(plugins[pluginid].RegisteredFunctions1,length(plugins[pluginid].RegisteredFunctions1)+1);
plugins[pluginid].RegisteredFunctions1[length(plugins[pluginid].RegisteredFunctions1)-1]:=f1;
result:=plugins[pluginid].nextid;
end;
1: begin
//plugin for the memorybrowser
f2:=TPluginfunctionType2.Create;
f2.pluginid:=pluginid;
f2.functionid:=plugins[pluginid].nextid;
f2.name:=Pfunction2(init).name;
f2.callback:=Pfunction2(init).callbackroutine;
if not memorybrowser.Plugins1.Visible then
memorybrowser.Plugins1.Visible:=true;
newmenuitem:=tmenuitem.Create(mainform);
newmenuitem.Caption:=f2.name;
newmenuitem.Tag:=dword(f2);
newmenuitem.onclick:=memorybrowser.plugintype2click;
memorybrowser.Plugins1.Add(newmenuitem);
f2.menuitem:=newmenuitem;
setlength(plugins[pluginid].Registeredfunctions2,length(plugins[pluginid].Registeredfunctions2)+1);
plugins[pluginid].Registeredfunctions2[length(plugins[pluginid].Registeredfunctions2)-1]:=f2;
result:=plugins[pluginid].nextid;
end;
2: begin
//debugger for the memorybrowser
f3:=TPluginfunctionType3.Create;
f3.pluginid:=pluginid;
f3.functionid:=plugins[pluginid].nextid;
f3.callback:=Pfunction3(init).callbackroutine;
setlength(plugins[pluginid].Registeredfunctions3,length(plugins[pluginid].Registeredfunctions3)+1);
plugins[pluginid].Registeredfunctions3[length(plugins[pluginid].Registeredfunctions3)-1]:=f3;
result:=plugins[pluginid].nextid;
end;
3: begin
//process created
f4:=TPluginfunctionType4.Create;
f4.pluginid:=pluginid;
f4.functionid:=plugins[pluginid].nextid;
f4.callback:=Pfunction3(init).callbackroutine;
setlength(plugins[pluginid].RegisteredFunctions4, length(plugins[pluginid].Registeredfunctions4)+1);
plugins[pluginid].Registeredfunctions4[length(plugins[pluginid].Registeredfunctions4)-1]:=f4;
result:=plugins[pluginid].nextid;
end;
4: begin
//function pointers changed
f5:=TPluginfunctionType5.Create;
f5.pluginid:=pluginid;
f5.functionid:=plugins[pluginid].nextid;
f5.callback:=Pfunction3(init).callbackroutine;
setlength(plugins[pluginid].RegisteredFunctions5, length(plugins[pluginid].Registeredfunctions5)+1);
plugins[pluginid].Registeredfunctions5[length(plugins[pluginid].Registeredfunctions5)-1]:=f5;
result:=plugins[pluginid].nextid;
end;
end;
inc(plugins[pluginid].nextid);
finally
pluginmrew.EndWrite;
end;
end;
function TPluginHandler.unregisterfunction(pluginid,functionid: integer): boolean;
var i,j: integer;
f: ^TPluginfunctionType1;
begin
//remove it
result:=false;
pluginmrew.BeginWrite;
try
if pluginid>=length(plugins) then exit;
//function1 check
for i:=0 to length(plugins[pluginid].RegisteredFunctions1)-1 do
if plugins[pluginid].RegisteredFunctions1[i].functionid=functionid then
begin
if plugins[pluginid].RegisteredFunctions1[i].menuitem.Parent<>nil then
begin
if plugins[pluginid].RegisteredFunctions1[i].menuitem.Parent.Count=1 then
plugins[pluginid].RegisteredFunctions1[i].menuitem.Parent.Visible:=false;
end;
plugins[pluginid].RegisteredFunctions1[i].menuitem.Free;
plugins[pluginid].RegisteredFunctions1[i].Free;
for j:=i to length(plugins[pluginid].RegisteredFunctions1)-2 do
plugins[pluginid].RegisteredFunctions1[j]:=plugins[pluginid].RegisteredFunctions1[j+1];
setlength(plugins[pluginid].RegisteredFunctions1,length(plugins[pluginid].RegisteredFunctions1)-1);
result:=true;
exit;
end;
//function2 check
for i:=0 to length(plugins[pluginid].RegisteredFunctions2)-1 do
if plugins[pluginid].RegisteredFunctions2[i].functionid=functionid then
begin
if plugins[pluginid].RegisteredFunctions2[i].menuitem.Parent<>nil then
begin
if plugins[pluginid].RegisteredFunctions2[i].menuitem.Parent.Count=1 then
plugins[pluginid].RegisteredFunctions2[i].menuitem.Parent.Visible:=false;
end;
plugins[pluginid].RegisteredFunctions2[i].menuitem.Free;
plugins[pluginid].RegisteredFunctions2[i].Free;
for j:=i to length(plugins[pluginid].RegisteredFunctions2)-2 do
plugins[pluginid].RegisteredFunctions2[j]:=plugins[pluginid].RegisteredFunctions2[j+1];
setlength(plugins[pluginid].RegisteredFunctions2,length(plugins[pluginid].RegisteredFunctions2)-1);
result:=true;
exit;
end;
//function3 check
for i:=0 to length(plugins[pluginid].RegisteredFunctions3)-1 do
if plugins[pluginid].RegisteredFunctions3[i].functionid=functionid then
begin
plugins[pluginid].RegisteredFunctions3[i].Free;
for j:=i to length(plugins[pluginid].RegisteredFunctions3)-2 do
plugins[pluginid].RegisteredFunctions3[j]:=plugins[pluginid].RegisteredFunctions3[j+1];
setlength(plugins[pluginid].RegisteredFunctions3,length(plugins[pluginid].RegisteredFunctions3)-1);
result:=true;
exit;
end;
//function4 check (processwatcher)
for i:=0 to length(plugins[pluginid].RegisteredFunctions4)-1 do
if plugins[pluginid].RegisteredFunctions4[i].functionid=functionid then
begin
plugins[pluginid].RegisteredFunctions4[i].Free;
for j:=i to length(plugins[pluginid].RegisteredFunctions4)-2 do
plugins[pluginid].RegisteredFunctions4[j]:=plugins[pluginid].RegisteredFunctions4[j+1];
setlength(plugins[pluginid].RegisteredFunctions4,length(plugins[pluginid].RegisteredFunctions4)-1);
result:=true;
exit;
end;
//function5 check (changed pointers)
for i:=0 to length(plugins[pluginid].RegisteredFunctions5)-1 do
if plugins[pluginid].RegisteredFunctions5[i].functionid=functionid then
begin
plugins[pluginid].RegisteredFunctions5[i].Free;
for j:=i to length(plugins[pluginid].RegisteredFunctions5)-2 do
plugins[pluginid].RegisteredFunctions5[j]:=plugins[pluginid].RegisteredFunctions5[j+1];
setlength(plugins[pluginid].RegisteredFunctions5,length(plugins[pluginid].RegisteredFunctions5)-1);
result:=true;
exit;
end;
finally
pluginmrew.EndWrite;
end;
end;
procedure TPluginHandler.EnablePlugin(pluginid: integer);
var e: texportedfunctions2;
x: boolean;
begin
e:=exportedfunctions; //save it to prevent plugins from fucking it up
pluginMREW.BeginRead;
if pluginid>=length(plugins) then exit;
try
if not plugins[pluginid].enabled then
begin
x:=plugins[pluginid].EnablePlugin(e,pluginid);
if not x then raise exception.Create('Error enabling '+plugins[pluginid].dllname);
plugins[pluginid].enabled:=true;
end;
finally
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -