الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الحصول على الوقت و التاريخ من ال Bios

بدأه C++er في 15 يناير 2010 · 6 رد · 2,026 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

قمت بكتابة هذا الكود منذ فتره

.386
.model flat, stdcall

.code

; get BIOS current date
; CH - Century   DH - Month
; CL - Year      DL - Day

getDate PROC ; extern "C" unsigned __stdcall getDate(void)

xor eax, eax ; clear eax
mov ah , 04h ; put 4 in ah to get RTC date
int 1Ah      ; call bios 1A interrupt
ret

getDate ENDP

; get BIOS current time
; CH - Hours      DH - Seconds
; CL - Minutes    DL - 1 daylight on, 0 daylight off

getTime PROC ; extern "C" unsigned __stdcall getTime(void)

xor eax, eax ; clear eax
mov ah , 02h ; put 2 in ah to get RTC time
int 1Ah      ; call bios 1A interrupt
ret

getTime ENDP

END

الكود يقوم بالحصول على التاريخ و الوقت الحالى من الـ BIOS ذلك عن طريق استدعاء الأمر 1Ah و مع ان الكود سليم و انا متأكد من ذلك ألا انه لا يتم تنفيذه إلا من داخل الـ real mode.

و عندما ينفذ من داخل protected mode يظهر لى الخطأ التالى

اقتباس
Unhandled exception at 0x004113a4 in datetime.exe: 0xC0000005: Access violation reading location 0xffffffff.

و قد قيل لى من قبل (لا اتذكر النص تحديدا و لكن اتذكر المعنى)

اقتباس
انت بتحلم انه يتنفذ من جوا الـ protected mode

اريد من هذا الكود ان يعمل بأى وسيله كانت من داخل الويندوز (protected mode)

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 19 يناير 2010 في 04:25 — السبب: تعديل صيغة السؤال حتى احصل على اجابه

مدونتي: C++ Tips and Tricks

#2

up :blush: !!

مدونتي: C++ Tips and Tricks

#3

لا يمكن استدعاء 16bit bios interrupt من داخل protected mode مباشرة ، عليك اولا الدخول الى الـreal mode .

هناك 3 طرق لفعل ذلك :

1- الدخول الى الـreal mode واستدعاء المقاطعة : ستحتاج ان يعمل الكود بمستوى النظام .

2- استدعاء الروتين Ke386CallBios : ستحتاج الى درايفر .

3- استدعاء الخدمة NtVdmControl : هذه الخدمة يستخدمها الـ16Bit DOS Emulator الخاص بويندوز (ntvdm.exe) لاستدعاء الـInterrupts و الـIO Operations ، لكني لم اتعامل معها مسبقا .

2

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4

ربنا يكرمك ياجى. :) و ييسر لك العسير.

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#5

السلام عليكم

اقتباس
هناك 3 طرق لفعل ذلك :

1- الدخول الى الـreal mode واستدعاء المقاطعة : ستحتاج ان يعمل الكود بمستوى النظام .

هل هذه الطرق منفصلة ومختلفة عن بعض ؟ وهكذا فهمتها

ام هي مراحل اي المرحلة الاولى ثم الثانية والثالثة

اذا كانت طرق مختلفة فالطريقة الاولى كيف تقوم باستدعاء المقاطعة من الـreal mode وهو غير مهيأ للتعامل مع مقاطعات الدوس

ما فهمته ان جدول المقاطعات عندما يهيأ من قبل انظمة الدوس و9x هي مختلفة عن جدول مقاطعات أنظمة NT بمعنى ال Nt لاتحتوي

مقاطعات الدوس في جدول المقاطعات حتى يتم استدعاؤها.

فما رايكم بهذا الكلام ؟

1
#6
اقتباس
هل هذه الطرق منفصلة ومختلفة عن بعض

نعم هى حلول مختلفه يمكن تنفيذ ايها حسب رغبتك.

اقتباس
اذا كانت طرق مختلفة فالطريقة الاولى كيف تقوم باستدعاء المقاطعة من الـreal mode وهو غير مهيأ للتعامل مع مقاطعات الدوس

فى الكود الموجود بالمشاركه 1 انا لا اقوم بإستدعاء مقاطعات الدوس و لكن مقاطعات البيوس و ذلك للحصول الوقت و التاريخ الحاليين، بالنسبه لمقاطعات الدوس فلابد ان يتم تحميل الدوس الدوس اولا، و بعد تحميل الدوس يقوم هو (بعمل override لبعض المقاطعات - على حد علمى).

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#7
اقتباس
فى الكود الموجود بالمشاركه 1 انا لا اقوم بإستدعاء مقاطعات الدوس و لكن مقاطعات البيوس

نعم بالعودة لجدول المقاطعات Idt فان المقاطعة 1A وباقي مقاطعات البيوس محجوزة

0014  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
0015  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
0016  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
0017  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
0018  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
0019  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
001A  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
001B  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
001C  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
001D  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
001E  0008:8053F950   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use
001F  0008:806CFFD0   0   P   32 bits  Interrupt Gate               Intel reserved. Do not use

أخبرنا بالنتيجة عند التجربة

وبالتوفيق

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…