PDA

View Full Version : دسترسی مستقیم روی حافظه



مهدی رحیم زاده
جمعه 13 شهریور 1388, 09:24 صبح
سلام
میخواستم بدونم به زبان C یا ++C هم میشه مثل اسمبلی دسترسی مستقیم روی سکتور های حافظه داشت یا نه؟
با تشکر

tdkhakpur
جمعه 13 شهریور 1388, 14:42 عصر
چرا نشه!


typedef struct _MID { // size offset
char filer1[3]; // 3 1
char CompName[8]; // 8 4
short BytePerSector; // 2 12
BYTE SectorPerCluster;// 1 14
BYTE ReservedSectors; // 1 15
BYTE Filer2; // 1 16
BYTE TotalFats; // 1 17
short Directory; // 2 18
short TotalSectors; // 2 20
char filer4[3]; // 3 22
short SectorPerTrack; // 2 25
char filer5[11]; // 11 27 -----
long midSerialNum; // 4 38
BYTE midVolLabel[11]; // 11 42
BYTE midFileSysType[8];// 8 53
char filer6[451+45]; //452 61
} MID, *PMID;
HANDLE hDevice, hDev;
MID mid={0};
BOOL fResult;
DWORD cb;
#define SECTORSIZE 512
long LogicalSector = 1;
int nDrive = 0; // Drive C:
hDevice = CreateFile("\\\\.\\a:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
ReadFile( hDevice, &mid, (LogicalSector*SECTORSIZE), &cb, NULL );
nDrive = 0;
CloseHandle(hDevice);

مهدی رحیم زاده
شنبه 14 شهریور 1388, 21:19 عصر
دوست عزیز
تا اینجاش که حسابی شرمنده کردین.:خجالت:
میشه در مورد این کد و نحوه استفادش برام توضیح بدین . ممنون میشم.

tdkhakpur
شنبه 14 شهریور 1388, 21:44 عصر
دوست عزیز
تا اینجاش که حسابی شرمنده کردین.:خجالت:
میشه در مورد این کد و نحوه استفادش برام توضیح بدین . ممنون میشم.
روی کد های بالا خیلی وقت پیش کار کردم در مورد کدها توضیح مختصر را میدم خودتان ار Help کامپایلرتان بابت پارامترهایش تحقیق کنید.(زیاد کار سختی نیست)


#define SECTORSIZE 512 // طول سکتور
long LogicalSector = 1; عدد مربوط به سکتور
int nDrive = 0; // Drive C:
//\\\\.\\a:", همان نام درایوی هست که میخواهید روش عملیانت انجام دهید از این درایو برای تست برنامه استفاده کنید
hDevice = CreateFile("\\\\.\\a:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
// خط زیر مانند خواندن از فایل تعداد بایتها را از موقعیت دیسکت میخواند
ReadFile( hDevice, &mid, (LogicalSector*SECTORSIZE), &cb, NULL );

مهدی رحیم زاده
یک شنبه 15 شهریور 1388, 00:07 صبح
مقاله ای در این مورد ندارین؟

هانی هاشمی
یک شنبه 15 شهریور 1388, 05:17 صبح
استفاده از این کد چه جوریه ؟؟؟

با ویژوال 2008 یه پروژه mfc درست کردم و کدتون رو بردم تو تابع و اجرا کردم اما کامپایلر این خطا رو می ده:
cannot convert parameter 1 from 'const char [7]'to 'LPCWSTR'

ممنون

tdkhakpur
یک شنبه 15 شهریور 1388, 15:40 عصر
سلام
در مورد مقاله شرمنده ام .
ولی در مورد اشکال در مورد تبدیل فوق ارسال نکردید که مربوط به کدام خط هست ولی احتمال دارد خط زیر باشد.


// اصلاح برای ویژال(ولی با کامپایلر شما آشنایی ندارم)
ReadFile( hDevice, (char *)&mid, (LogicalSector*SECTORSIZE), (unsigne log *)&cb, NULL );

مهدی رحیم زاده
دوشنبه 16 شهریور 1388, 13:38 عصر
حالا یک سئوال دیگه :
اگه بخوام این اطلاعاتی که از هارد خونده میشه فقط اطلاعات یک فایل باشه باید چکار کنیم؟
یعنی مثلا از ابتدای آدرس شروع یک فایل تا انتهاش!
ممنون

tdkhakpur
دوشنبه 16 شهریور 1388, 14:21 عصر
خوب اسم فایل را به تابع رد کنید.


hDevice = CreateFile("test.txt", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);

مهدی رحیم زاده
دوشنبه 16 شهریور 1388, 21:22 عصر
دوست عزیز یک زحمت دیگه هم برات دارم
البته میدونم خیلی اذیتت کردم اما مشکل اینجاست که من با ++C اصلا کار نکردم. یعنی با Turbo تحت داس قبلا کار می کردم.
حالا اینه که نمیتونم کد شما رو اجرا کنم . میشه یک زحمتی بکشی و بگی که چطور و با چی این برنامه رو اجرا کنم؟
اگه وقت داشته باشین و یک نمونه از اون رو خودتون اجرا کنید و برنامه رو اینجا آپلود کنید که دیگه واقعا ممنون میشم.
با تشکر فراوان

tdkhakpur
سه شنبه 17 شهریور 1388, 16:18 عصر
مشکل اینجاست که من با ++C اصلا کار نکردم. یعنی با Turbo تحت داس قبلا کار می کردم.
حالا اینه که نمیتونم کد شما رو اجرا کنم . میشه یک زحمتی بکشی و بگی که چطور و با چی این برنامه رو اجرا کنم؟
یک نمونه از اون رو خودتون اجرا کنید و برنامه رو اینجا آپلود کنید که دیگه واقعا ممنون میشم.
با تشکر فراوان
من با بورلند سی برای ویندوز کار میکنم و سورس هم برای کامپایلر مربوط به ویندوز هست(bcb6-2009)

هانی هاشمی
پنج شنبه 19 شهریور 1388, 02:07 صبح
اینم یه نمونه دیگه http://barnamenevis.org/forum/showpost.php?p=801604&postcount=26

مهدی رحیم زاده
پنج شنبه 19 شهریور 1388, 16:38 عصر
حالا یک سئوال اگه این برنامه رو هم بخواییم طوری تنظیم کنیم که از ابتدای شروع یک فایل شروع و تا انتهاش رو بخونه باید چکار کنیم؟
یعنی کجاهای برنامه باید تغییر کنه و اینکه آیا بعدا میشه این داده ها رو بعد از تغیید دوباره روی همون سکتور ها نوشت؟ با تشکر

tdkhakpur
پنج شنبه 19 شهریور 1388, 20:09 عصر
یعنی کجاهای برنامه باید تغییر کنه و اینکه آیا بعدا میشه این داده ها رو بعد از تغیید دوباره روی همون سکتور ها نوشت؟ با تشکر
خوب شما باید از توابع موجود برای فایل مانند fopen و fread و fwrite استفاده کنید.
ولی در جواب سوال شما باید عرض کنم که تغییرات در فایل باعث تغییر موقعیت داده های فایل در سکتور جاری نمیکند.

مهدی رحیم زاده
پنج شنبه 19 شهریور 1388, 20:57 عصر
پس چطور میتونیم این داده های خونده شده از سکتور ها رو مجددا یه جایی بنویسیم طوری که تشکیل همون فایل قبلی رو بدن؟
یعنی مثلا داده ها رو از یکسری سکتور بخونیم و یه جایی ذخیره کنیم بعد اونا رو انتقال بدیم و یه چای دیگه روی یکسری سکتور دیگه کپی کنیم طوری که سیستم عامل اون رو همون فایل قبلی بشناسه؟
با تشکر

tdkhakpur
پنج شنبه 19 شهریور 1388, 22:27 عصر
پس چطور میتونیم این داده های خونده شده از سکتور ها رو مجددا یه جایی بنویسیم طوری که تشکیل همون فایل قبلی رو بدن؟

ببیند کار با فایل با کار کردن با سکتورها یا همان دسترسی مستقیم با دیسک فرق دارد.
تغییردادن یک فایل به طوری که هیچ داده ای از فایل کم یا زیاد نشود باعث تغییر جای فایل در سکتور نمیشود و در حقیقت همان جای قبلی فایل است..
ولی اینکه شما داده ای را در یک سکتور خاص بنویسید خیلی واضح و روشنه, شما باید به اندازه سکتور مثلا 512 بایت خق نوشتن دارید وو داده های بیشتر از این از محدوده سکتور عبور خواهد کرد.
برای این کار شما طول سکتور ها را پیدا کرده و به همان اندازه در سکتور مورد نظر بنویسید.

مهدی رحیم زاده
جمعه 20 شهریور 1388, 21:45 عصر
ببینید دوست من هدف از این کار انتقال اطلاعات «یک فایل» به یک کامپیوتر دیگست!
برای این کار باید اطلاعات ذخیره شده این فایل روی سکتور های فایل رو بخونم ، با استفاده از چند تا الگوریتم اونو کد کنم و بعد فایل حاصل شده رو منتقل کنم و بعد اونو در مقصد دیکد کنم و دوباره طوری روی هار بنویسم که تشکیل فایل قبلی رو بده .
ممنون میشم حالا هم یک سری توضیحات بدین.
با تشکر بسیار

هانی هاشمی
شنبه 21 شهریور 1388, 11:02 صبح
تقریبا مثل همون کاریه که من انجام دادم

اطلاعاتم رو ریخنم تو سکتور 500 به بعد و در مقصد خوندمشون و تو یه فایل ریختم و تحویل کاربر دادم

مهدی رحیم زاده
شنبه 21 شهریور 1388, 13:13 عصر
ببخشید که من این همه سئوال می پرسم، اما کار برام خیلی مهمه پس بازم یک دنیا شرمنده.
آیا میشه روی یک سکتور یعنی یک بخشی از سکتور ها اطلاعات خاصی رو نوشت؟
بازم شرمنده و ممنون بابت تمام جواب ها حوصله دوستا ن عزیز

هانی هاشمی
شنبه 21 شهریور 1388, 21:56 عصر
از تابع WriteFile به جای ReadFile استفاده کنید

مهدی رحیم زاده
یک شنبه 22 شهریور 1388, 14:01 عصر
ممنون دوست عزیز
میشه یک مقاله خوب و کامل در مورد همین بحث معرفی کنید؟
مقاله یا لینکی که کار با این موارد رو کاملا توضیح داده باشه.
با تشکر

هانی هاشمی
دوشنبه 23 شهریور 1388, 01:12 صبح
http://www.cs.rpi.edu/academics/courses/fall01/os/WriteFile.html
http://msdn.microsoft.com/en-us/library/aa365747%28VS.85%29.aspx
google

موفق باشین

مهدی رحیم زاده
پنج شنبه 02 مهر 1388, 00:31 صبح
سلام مجدد خدمت دوستان عزیز
با عرض شرمندگی می خواستم ببینم کسی از دوستان وقت داره که زحمتی بکشه و برنامه رو ط.ری تغییر بده که از ابتدای شروع یک فایل تا انتهاش همه اطلاعات مربوط به اون فایل رو از هارد بخونه و بعد نشون بده؟
با تشکر خیلی زیاد

هانی هاشمی
شنبه 04 مهر 1388, 14:31 عصر
مثلا اطلاعاتتون داخل سکتور 200 هستش و تا 4 تا سکتور بعد فایلتون ادامه داره
سکتورای 200 تا 204 رو می خونین و داخل یه فایل قرار می دین

کجاشو مشکل دارین ؟؟

مهدی رحیم زاده
شنبه 04 مهر 1388, 23:11 عصر
همین
از کحا متوجه بشم که از سکتور 200 این فایل شروع شده و تا 4 تا سکتور ادامه پیدا کرده؟
بازم شرمنده که وقتتونو میگیرم اما خودم به نتیجه نرسیدم.
با تشکر

هانی هاشمی
سه شنبه 07 مهر 1388, 11:05 صبح
شرمنده که دیر شد

دو تا کار می تونید بکنید
1. اول فایلتون رو با یه علامت خاص مشخص کنید .
2. تو چند تا سکتور از پیش تعیین شده اسم کل فایلاتون و شروع و پایانشون رو بدین

مهدی رحیم زاده
سه شنبه 07 مهر 1388, 22:43 عصر
اول فایلتون رو با یه علامت خاص مشخص کنید .
2. تو چند تا سکتور از پیش تعیین شده اسم کل فایلاتون و شروع و پایانشون رو بدی
میشه بیشتر برام توضیح بدین>
ببین دوست من من میخوام که اطلاعات ذخیره شده روی سکتور های هارد رو بخونم و این اطلاعات مربوط به فایلیه که کاربر انتخاب می کنه
با تشکر