نگاشته شده توسط: M.J | می 31, 2008

کمک به وب

یه چند وقتی هست که چیز جدیدی ننوشتم شاید به خاطر بی حوصلگیم تو این مدت باشه شاید هم به خاطر این باشه حرف نداشتم که بنویسیم

اگه الان دارم می نویسم به این خاطره که چند روزی دارم دنبال چیزی می گردم که براش مستندات خیلی کمی گیر آوردم گفتم حالا که خودم فهمیدم چیه یه چیزی در موردش بنویسم شاید یکم به گسترش محتوا تو وب کمک بشه.

من می خواستم بتونم حافظه ای که هر پروسسه برای خودش گرفته رو بخونم و ببینم توش چی نوشته برای اینکار خیلی دنبال تابع ها بدرد بخور گشتم ولی تقریبا هیچ جا چیزی گیر نیاوردم. تو یه سرچ که داشتم در مورد لیست کردن پروسس ها جستجو می کردم یه یونیت دلفی رو دیدم که تاحالا نمی دونستم وجود داره 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;


یک پاسخ بگذارید

Your response:

دسته‌ها