View Full Version : access violation زمان خواندن بخش مشخصی از حافظه
MEhdi Sobhani
یک شنبه 28 آذر 1389, 00:39 صبح
با عرض سلام و خسته نباشید .
از طریق کد زیر سعی کردم یه قسمت از حافظه رو بخونم و وارد یک رشته بکنم :
var
MYStr:string
begin
SetString(MyStr, PChar(Ptr($FFFFFF)), 2000);
اما خطای access violation گرفتم .
آیا راهی هست که این خطا رو مهار کرد ؟ و اگر نیست آیا راه دیگه ای وجود داره که هر قسمتی از حافظه رو خواستیم بتونیم بخونیم ، مثلا وارد آرایه بایتی بکنبم و ....
با تشکر فراوان
Felony
یک شنبه 28 آذر 1389, 04:27 صبح
در ویندوز پروسه ها از هم ایزوله هستن و نمیشه به هرجایی از حافظه که خواستید به اون صورت توسط پروسه برنامه خودتون دسترسی داشته باشید ، مثلا ممکنه اون قسمت از حافظه جزئی باشه که فقط کرنل حق دسترسی بهش رو داره و شما با اون کار حریم رو نقض کردید و Memory Manager این نقض حریم رو با Access Violation به اطلاع Thread برنامتون میرسونه ، مگر اینکه از فضای اشتراکی ( Mapped Files ) استفاده کنید یا برنامتون اجازه خوندن و نوشتن و دسترسی به پروسه مقصد رو داشته باشه و در اون صورت از توابع ReadProcessMemory و WriteProcessMemory استفاده کنید .
Mahmood_M
یک شنبه 28 آذر 1389, 05:03 صبح
شما در حالت عادی ( User Mode ) نمی تونید خارج از محدوده ی مشخص شده برای برنامه ی خودتون ( فضای محدوده ی Process ) به صورت مستقیم به هر کجا از حافظه دسترسی داشته باشید ، دسترسی شما محدود به فضای در نظر گرفته شده برای Process هست ولی میتونید یک Process دیگه رو باز کنید و قسمت مشخصی از اون رو بخونید ، اینجا (http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21226884.html) و اینجا (http://stackoverflow.com/questions/3760744/stackwalk-of-other-process-in-delphi) مثالهایی هست که می تونه کمکتون کنه ، دیدن این سورس (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=386&lngWId=7) هم بی فایده نیست ! ، برای دسترسی آزاد به هر جای حافظه باید دسترسی Kernel Mode داشته باشید که ایجاد این دسترسی با استفاده از دلفی اصلا منطقی و به صرفه نیست ، قبلا یک تاپیک در این زمینه ایجاد شده بود ، موفق باشید ...
ویرایش : انگار زودتر جواب داده شد ! ، به هر حال ، دیدن لینک های بالا می تونه مفید باشه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.