فایل command.com موقع بوت شدن ویندوز در کدام سکتور هستش ؟

mangool

Member
سلام
واقعا از اینکه راهنمایی می کنید ممنونم
این سایتی که لینک داده بودین متاسفانه باز نکرد !
قبل از اینکه سوالم رو واضح تر بگم اگه امکان داره همون فایل های pdf کتاب pc intern رو واسم بفرستین یا لینکشو بدین من دانلودش کنم البته اگه امکانش وجود داره
میل من : [email protected]
در خصوص سوالم باید خدمتتون عرض کنم که ببینید من می خوام برنامه ای بنویسم که قبل از بالا اومدن سیستم عامل اجرا بشه پس طبیعیه که از وقفه های سیستم عامل نباید استفاده کرد و باید از وقفه های بایوس استفاده کرد
و کاری که انجام می ده اینه که میاد یک کلید صفحه رو حالتشو عوض می کنه یعنی اینکه اگه مثلا کلید + رو از صفحه کلید زدیم کلید منفی نوشته بشه یا کلید اسلش رو زدیم کلید بک اسلش نوشته بشه ...
و این برنامه هم حتما باید سریعتر نوشته بشه و البته خیلی خیلی هم مهمه اگه لطف کنید راهنماییم کنید که واقعا لطف بزرگی کردین
بازم ممنون
بای
 

Old User

Member
واقعا از اینکه راهنمایی می کنید ممنونم

خواهش میکنم ...

ین سایتی که لینک داده بودین متاسفانه باز نکرد !

من الان امتحان کردم برای من که مشکلی نداره باز میشه...

اگه امکان داره همون فایل های pdf کتاب pc intern رو واسم بفرستین

حجم این کتاب زیاده از دست جی میل هم کاری برنمیاد ... دانلود نکردم وگرنه لینکشو میدادم بهت... اگه جایی سراغ داری که بتونم برات آپ کنم بگو ...

من تا حالا این برنامرو کار نکردم ولی حتما براتون میپرسم ... تاجایی که بتونم کمکتون میکنم ، خودمم دوست دارم بدونم چه جوریه .

پیغام خصوصیتو چک کن...

موفق باشی
 

mazoolagh

Active Member
من می خوام برنامه ای بنویسم که قبل از بالا اومدن سیستم عامل اجرا بشه پس طبیعیه که از وقفه های سیستم عامل نباید استفاده کرد و باید از وقفه های بایوس استفاده کرد
و کاری که انجام می ده اینه که میاد یک کلید صفحه رو حالتشو عوض می کنه یعنی اینکه اگه مثلا کلید + رو از صفحه کلید زدیم کلید منفی نوشته بشه یا کلید اسلش رو زدیم کلید بک اسلش نوشته بشه ...

شما از اول سئوالتون رو اشتباه مطرح کردین - باید یک console driver بنویسی: مثل ansi.sys
داخل این درایور باید روتین int16 رو ریدایرکت کنی.

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

mangool

Member
بابت پاسخ هایی که می دین واقعا ممنون
همون طور که old user گفتن می شه یکم بیشتر توضیح بدین که چطور میشه همچین برنامه ای نوشت
برنامه sys رو چطور میشه نوشت و چطور میشه داخله اون روتین int16 رو ریدایرکت کرد ؟
منم می خوام طوری باشه که از بایوس استفاده بشه و از سیستم عامل استفاده نشه !
درضمن یه سایتی پیدا کردم که در مورد بایوس هست و در لینک زیر وقفه های بایوس نشان داده شده که همین وقفه 16 با آدرسش هست ولی متاسفانه من نمیدونم چطور برنامشو بنویسم اگه راهنمایی کنید خیلی لطف بزرگی کردین
بازم ممنون
 

mazoolagh

Active Member
از نظر فنی که کار خیلی سنگینی هست - حتی در dos قدیم هم که مثل windows پیچیده نبود کار راحتی محسوب نمیشد.
درایور نرم افزار رابط بین هسته سیستم عامل و سخت افزار هست. درایور کنسول عملیات خواندن از کیبرد و
نوشتن روی مونیتور رو به عهده داره. هر درایور یک ساختار تعریف شده و معین داره که نوع درایور و ظایف اون رو مشخص میکنه و بخش کد اون به زبان ماشین هست که البته میتونه توسط یک زبان مثل c نوشته و بعد کامپایل بشه ولی نوشتن مستقیم به اسمبلی خیلی راحتتر است (حداقل در داس که اینطور بود)!

برای ویندوز این ساختار خیلی پیچیده تر هست و ابزارهای مخصوصی نیاز داره و بدون تعارف انجامش از سطح اطلاعات من خیلی بالاتره.

پیشنهاد میکنم از روشهای ساده تر شروع کنید و اگر پاسخگو نبود بسراغ روشهای پیچیده تر برین:
یک برنامه اجرایی (نه درایور) بنویسین که بیاد روتین شما رو در حافظه لود کنه و entry point اون رو جایگزین آدرس INT16 در IVT قرار بده.
این روتین شما فقط باید سابفانکشن مربوط به فشرده شدن کلید رو چک کنه، اگر غیر از این هست که روتین اصلی INT16 رو call کنه و تموم بشه در غیر اینصورت بیاد روتین اصلی رو اجرا کنه و مقدار برگشتی رو با توجه به جدولی که بتعیین میشه xlat کنه.
بعد این برنامه اجرایی رو در به همون روش که قبلا گفتم در رجیستری معرفی کنین. باحتمال 99 درصد باید به خواسته تون برسین.
 

mangool

Member
از اینکه پاسخ دادین خیلی خیلی ممنونم
راهی که پیشنهاد کردین باز هم با استفاده از سیستم عامل هستش و با رجیستری در صورتی که این برنامه اصلا ارتباطی به سیستم عامل نداره و دستوراتش قبل از سیستم عامل اجرا می شه و داخل سکتور صفر قرار می گیره و از وقفه های بایوس استفاده می شه و بعد از اجرای اون به سیستم عامل جامپ می شه !
مثل اینکه خیلی برنامش سخته چون واقعا دیگه نا امید شدم
ولی خوب دوست ندارم کاری که شروع کرد رو نا تموم بذارم
راه دیکه نداره و نه؟
در هرصورت ممنون
 

mangool

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

mazoolagh

Active Member
بعنوان راهنمایی:

بافر صفحه نمایش در حالت TEXT از آدرس B800:0 شروع میشه. هر کارآکتر 2 بایت اشغال میکنه که بایت اول کد اسکی کارآکتر و بایت دوم ATTRIBUTE اون هست یعنی رنگ متن و زمینه و پررنگ یا کمرنگ یا چشمک زن و ...

من یک مثال با دیباگ میزنم که متوجه بشی:
MOL1.GIF


اگر دقت کنی میبینی که صفحه متنی ما اولین سطرش با عبارت Microsoft شروع شده و در آدرس B800 بایت اول مقدارش 4D هست که کد اسکی حرف M در مبنای hex و بایت بعدی 07 هست یعنی رنگ متن سفید کمرنگ و رنگ زمینه مشکی.

حالا فرض کن بخواهیم حرف M اول مایکروسافت رو به N و رنگ اون رو به قرمز روی زمینه سبز تغییر بدیم - کافیه در آدرس B800 کد حرف N و در بایت بعدی کد رنگ مربوطه رو وارد کنیم:
MOL2.GIF
 

mangool

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

mazoolagh

Active Member
یک راه دیگه اینه که شما خودت یک بوت لودر بنویسی - البته کار حساس و دقیقی هست.

بهتره اینکار رو روی فلاپی انجام بدی و هارد دیسک رو هم از سیستم جدا کنی. من الآن به کتابهای مرجع دسترسی ندارم و ساختار بوت سکتور هم یادم نیست که دقیقا" بگم کجا رو تغییر بدی. اما میتونی بوت سکتور فلاپی رو بخونی و کد خودت رو به اولش اضافه کنی و مجددا" روش بنویسی.
 

mangool

Member
دوست عزیز واقعا شرمنده می کنید که پاسخ سوالاتمو می دین واقعا ممنون

ببینید اصلا برنامه من یه چیز تو همین مایه های بوت لودر هستش ولی من می خواستم که روش برنامشو یاد بگیرم ...
حالا هدفمو از نوشتنه این برنامه واستون می گم ولی واقعا وقته منو گرفت اونم خیلی ....
ببینید من می خواستم در درجه اول برنامم به نوعی در سکتور صفر بشینه (در سکتور صفر به آدرسش جامپ بشه) بعد از اون که برنامم دستوراتش اجرا شد ( واسه همین تاکید داشتم که از وقفه های بایوس استفاده بشه نه از وقفه های سیستم عامل ! ) بعد در آخر برنامه دوباره جامپ بشه به آدرسه سیستم عامل و سیستم عامل بالا بیاد پس با هر بار بالا اومدن سیستم عامل این برنامه هم اجرا می شه ... ولی متاسفانه اینکه چطور اون آدرسه سکتور صفر رو عوض کنم که به برنامه من جامپ بشه و چطور آخر دستورات خودم جامپ کنم به آدرسه سیستم عامل رو نمی دونم (ادرسه سیستم عامل رو ندارم )
ولی به قدری منو درگیره خودش کرده این برنامه که حد نداره اگه کمکم کنید که این برنامه رو بسازم واقعا لطف بزرگی کردین حتی اگه اجازه بدین خدمتون برسم و حضوری از شما کمک بگیرم
منتظر پاسختون و راهنمایی هاتون هستم
بازم ممنون
 

mazoolagh

Active Member
آقا شما به کجا رسیدی؟

یک فلاپی بوت داس (مثلا" 6.22) تهیه کن و فایل debug.com رو هم بریز روش. وقتی آماده شد خبرش رو بده تا بگم چه شکلی برنامه بوت رو از روی فلاپی بخونی تغییرش بدی و دوباره بنویسی.
 

mangool

Member
سلام
ممنون که راهنمایی می کنین حال دنبال این کار هستم ولی دوست عزیز این برنامه من مانند یک فایل اجرایی هستش که وقتی مثلا من روی اون کلیک می کنم اون خودش می یاد ادرسه بوت سکتور رو عوض می کنه و در اونجا قرار می گیره ! و هر بار بالا اومدنه ویندوز یه بار اجرا می شه !
با این روشی که می گین یعنی میشه ؟
ممنون از شما
 

mazoolagh

Active Member
آدرس بوت سکتور در اختیار من و شما نیست (حداقل قدیمها که اینطوری بود:d ) که عوضش کنیم.
بایوس بوت سکتور رو از روی آدرس مشخصی که براش تعیین شده (سیلندر صفر - هد صفر - سکتور یک) میخونه و در حافظه بار میکنه و کنترل اجرا رو به آدرس مشخصی از اون منتقل میکنه.

تنها کاری که در تئوری میتونیم بکنیم (اگر در عمل بتونیم) اینه که کد اجرایی خودمون رو (که باید کم حجم باشه) در این بوت سکتور قرار بدیم بنحوی که اول اون اجرا بشه بعد کد اصلی.
 

mangool

Member
دوست عزیز سلام
ببینید آدرسه سیستم عامل داخله بوت سکتور هست ( اینو که خودتون می دونید ) حالا من چطور می تونم آدرسه سیستم عامل رو عوض کنم و یا بیام در آدرسه جاییکه سیستم عامل هست برنامه خودم رو بذارم و بعد آخر دستوراتم آدرسه سیستم عامل رو بنویسم ( البته این روش نمیشه چون استادمون می گه آدرسه سیستم عامل ثابته ) پس باید آدرسه موجود در بوت سکتور رو عوض کنم و آدرسه برنامه خودمو بدم و بعد آخر برنامم آدرسه سیستم عامل رو بدم ! ( نمی دونم آدرسش 7c00 هستش فکر کنم ) ولی مشکله من اینه که چطور می تونم برم آدرسه اونجا رو تغییر بدم؟
منتظر پاسختون هستم
ممنونم از شما
 

mazoolagh

Active Member
اون آدرس رو شما نميتوني عوض كني (همون 7c ) ولي ميتوني بوت سكتور رو كلا" بياري در حافظه load كني (توسط debug) بعد از همون آدرس unassemble كني ببيني كدش چي هست و كي تموم ميشه.

حالا ميتوني اون كد رو يك جاي ديگه كپي كني و بعد كد خودت رو بگذاري از آدرس 7c شروع بشه و بعدش كد اصلي رو از اون جايي كه كپي كردي برگردوني به انتهاي كد خودت بچسبوني. حالا بايد كد تغيير يافته رو در بوت سكتور بنويسي (باز هم توسط debug)

فقط كد اصلي رو بايد با دقت بخوني و حواست به jumpها و refrenceهاي احتماليش باشه!
 

mangool

Member
دوست عزیز واقعا ممنون که جواب می دی
ببینید دستور باید اینجوری باشه درسته ؟
L 0 2 0 1
یعنی لود کنه از آدرسه صفر درایو C واز سکتور صفرش به اندازه یک قطاع در حافظه
اگه این دستور درسته ( البته در کامند داس جواب نداد و من نتونستم جواب بگیرم ! ) بعد باید دستور U رو استفاده کنم ولی نمی دونم چطور و چیکار می کنه ( اون Range چیه؟ ) و چطور کد رو نشون میده ؟
میشه بیشتر توضیح بدین و چه کار کنم اون مشکلات آخر برام پیش نیاد ؟
بازم ممنونم که جواب می دی البته می دونم سوالام خیلی مبتدیانست چون هیچی از این چیزا نمی دونم
منتظر پاسختون هستم
 

جدیدترین ارسال ها

بالا