تستخدم تقنية ال File Mapping لتبادل البيانات بين البرامج و لذا فهي مرتبطة ارتباطا وثيقا بالhook
وكان هذا الاخير اهم الاسباب التي دعتني الى كتابة هذه الموضوع المتواضع
تستخدم تقنية ال File Mapping لتبادل البيانات بين البرامج و لذا فهي مرتبطة ارتباطا وثيقا بالhook
وكان هذا الاخير اهم الاسباب التي دعتني الى كتابة هذه الموضوع المتواضع
ان هذه جوهر هذه التقنية هو انشاء مكان او متغير في الذاكرة يمكن لاكثر من برنامج ان يصل اليها ليقوم البرنامج الاخر او المكتبة الاخرى باستعمال القيمة ومن ثم تغييرها وهكذا
قبل كل شي قم بانشاء مكتبة dll واكتب فيها الكود التالي
library ShareLib;
uses
ShareMem,
Windows,
SysUtils,
Classes;
const
cMMFileName: PChar = 'SharedMapData';
type
//****************************
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = record
S: String[50];
I: Integer;
end;
//****************************
var
GlobalData : PGlobalDLLData;
MapHandle : THandle;
هذه الدالة سيتم تصديرها لكي تستدعيها البارمج التي ستستخدم هذه المكتبة
{ GetDLLData will be the exported DLL function }
procedure GetDLLData(var AGlobalData: PGlobalDLLData); StdCall;
begin
{ Point AGlobalData to the same memory address referred to by GlobalData. }
AGlobalData := GlobalData;
end;
procedure OpenSharedData;
var
Size: Integer;
begin
{ Get the size of the data to be mapped. }
Size := SizeOf(TGlobalDLLData);
{ Now get a memory-mapped file object. Note the first parameter passes
the value $FFFFFFFF or DWord(-1) so that space is allocated from the system's
paging file. This requires that a name for the memory-mapped
object get passed as the last parameter. }
عملية انشاء مقبس من اجل المتغير العام
MapHandle := CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, Size, cMMFileName);
if MapHandle = 0 then
RaiseLastWin32Error;
{ Now map the data to the calling process's address space and get a
pointer to the beginning of this address }
هنا عملية ربط المفبس السابق بالمتغير
GlobalData := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, Size);
{ Initialize this data }
وهذه واضحة عملية منح قيم لحقول المتغير العام ....
GlobalData^.S := 'ShareLib';
GlobalData^.I := 1;
if GlobalData = nil then
begin
CloseHandle(MapHandle);
RaiseLastWin32Error;
end;
end;
وهنا عملية التخلص من المتغير العام ومن المقبس ستسدعى هذه الدالة عند الخروج من المكتبة
procedure CloseSharedData;
{ This procedure un-maps the memory-mapped file and releases the memory-mapped
file handle }
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MapHandle);
end;
وهنا نحدد ترتيب استدعاء الدوال (التوابع)
procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenSharedData;
DLL_PROCESS_DETACH: CloseSharedData;
end;
end;
exports
GetDLLData;
begin
{ First, assign the procedure to the DLLProc variable }
DllProc := @DLLEntryPoint;
{ Now invoke the procedure to reflect that the DLL is attaching
to the process }
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.هذا اول جزء