یه چند وقتی هست که چیز جدیدی ننوشتم شاید به خاطر بی حوصلگیم تو این مدت باشه شاید هم به خاطر این باشه حرف نداشتم که بنویسیم
اگه الان دارم می نویسم به این خاطره که چند روزی دارم دنبال چیزی می گردم که براش مستندات خیلی کمی گیر آوردم گفتم حالا که خودم فهمیدم چیه یه چیزی در موردش بنویسم شاید یکم به گسترش محتوا تو وب کمک بشه.
من می خواستم بتونم حافظه ای که هر پروسسه برای خودش گرفته رو بخونم و ببینم توش چی نوشته برای اینکار خیلی دنبال تابع ها بدرد بخور گشتم ولی تقریبا هیچ جا چیزی گیر نیاوردم. تو یه سرچ که داشتم در مورد لیست کردن پروسس ها جستجو می کردم یه یونیت دلفی رو دیدم که تاحالا نمی دونستم وجود داره TlHelp32 ( متاسفانه مستنداتی نداره که لینک بدم ( از معدود یونیت هایی بد که تاحالا اسمش رو هم نشنیده بودم وقتی توابع توش رو دیدم فهمیدم دقیقا همون چیزیه که میخوام توابع توش اینا بودن
CreateToolhelp32Snapshot
InitToolHelp
Heap32First
Heap32Next
Heap32ListFirst
Heap32ListNext
Module32First
Module32Next
Module32FirstW
Module32NextW
Process32First
Process32Next
Process32FirstW
Process32NextW
Thread32First
Thread32Next
Toolhelp32ReadProcessMemory
خب خیلی پیشرفت خوبی بود فقط یه مشکل خیلی خیلی کوچیک وجود داشت دلفی هیچ مستنداتی از اینا نداشت تو ام اس دی انی هم که من رو سی دی دارم هیچی ازش نبود. من فقط یه مثال از لیست کردن پروسس ها داشتم یعنی فقط یه مثال داشتم که می گفت چطوری از سه تا از اینا استفاده کنم تا بهم لیست پروسس ها سیستم رو بده تنها مستندات وجود از این تابع ها که تونستم گیر بیارم MSDN انلاین بود اونم فقط یه توضیح چند خطی در مورد این تابع ها داده بود بالاخره به هر زحمتی بود بعد حدود هت هشت ساعت کار تونستم یه برنامه بنویسیم که حافظه رو برام بخونه که در نوع خودش پیشرفت عالیه هست اصلا فکرش رو نمی کردم که بتونم یه روزه این برنامه رو بنویسم الان فقط یه مشکل دارم اونم اینکه برنامه ام اجازه نداره حافظه برنامه ی یوزر ها دیگه رو بخونه امیدوارم بتونم اینم رفع کنم.
ولی خب برای گشترس محتوای فارسی روش استفاده از اینا رو توضیح می دم
اولین کار اینکه یه snapshot از چیزی که می خواییم لیستش کنیم داشته باشیم
ما می تونم لیست پروسس ها ,لیست نخ ها , لیست قطعات حافظه هیپ که به هر پروسس اختصاص داده شده لیست فضاهایی از این ان قطعات که رزو شده و لیست ماژول هایی که برنامه لود کرده رو داشته باشیم برای تمام اینا به جز لیست حافظه هایی که از رو هیپ رزو شده باید یه snapshot بگیرم برای اینکه snapshot بگیریم از تابع CreateToolhelp32Snapshot استفاده می کنیم پارمتر اول مشخص می کنه چه نوع تصویری لازم داریم و پارامتر دوم ID پروسس هدف رو مشخص می کنه برای لیست کردن پروسس ها لازم نیست ای دی هدف بدیم برای لیست کردن ترد ها هم اگه بدیم نادیده می گیره در بقیه موارد اگه ندیدیم پروسه جاری به عنوان هدف در نظر گرفته می شه مرحله بعد از گرفتن تصویر انکه از اون تصویر استفاده کینم برای استفاده نیاز به ساختار متناسب با چیزی که می خواییم لیست کنیم داریم. ساختارها عبارتند از
MODULEENTRY32
HEAPENTRY32
HEAPLIST32
MODULEENTRY32W
PROCESSENTRY32
PROCESSENTRY32W
THREADENTRY32
با توجه به تابعی که قراره استفاده کنید یکی از اینا رو انتخاب می کنید بعد که متغییر مورد نظر رو تعریف کردید باید مقدار فیلد dwSize رو برابر اندازه رکورد قرار بدید و این رکورد رو همراه هندلی که تابع CreateToolhelp32Snapshot به عنوان هندل تصویر بهتون داده بدید به تابع مورد نظر دقت کنید که باید نسخه First اونو فراخوانی کنید بعد اگه این تابع مقدار true برگردونه ساختار با مقدار های درست پر شده و اطلاعات اولین پروسس(نخ ماژول …) رو دارید برای بعدی کافیه تابع Next رو خوانی کنید و تا وقتی مقدار false برنگردونده اونو فراخوانی کنید.
فقط یه نکته می مونه که تابع Heap32First و Heap32Next با بقیه فرق دارن اولا که نیاز به تصویر ندارن دوما پارمتر های Heap32First ساختار که مقدار ها داخلش قرار می گیره بعد PID پروسس و پارمتر آخر هم ID قطعه هیپ که می تونید با تابع های Heap32ListFirst و Heap32ListNext بدستش بیارید و Heap32Next هم فقط یه پارمتر می گیره و اون ساختاری هست که باید مقدار ها داخلش قرار بگیره است.
در مورد فیلد ها این ساختار هم چون به قدر کافی واضح هست صحبت نمی کنم احتمالا با یه بار دیدن متوجه طریقه استفاده ازشون می شید. در آخر هم یه مثال از لیست کردن تردها ی جاری رو سیستم
uses TlHelp32;
procedure TForm1.Button1Click(Sender: TObject);
var
struct:TThreadEntry32;
h:THandle;
begin
ListBox1.Clear;
h:=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
struct.dwSize:=sizeof(struct);
if Thread32First(h,struct) then
repeat
ListBox1.AddItem(inttostr(struct.th32ThreadID),nil);
until Thread32Next(h,struct)=false;
end;