Форум: "WinAPI";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
ВнизЧасы реального времени (RTC Alarm) Найти похожие ветки
← →
shamanski © (2007-07-06 15:24) [0]Помогите, пожалуйста, найти код для работы с часами реального времени CMOS. В частности, мне нужно использовать будильник, который включает компьютер в определенное время.
Вот, нашел исходник на сях, работающий с IRQ8, но в сях я не понимаю совсем:http://www.frolov-lib.ru/books/bsp/v33/ch4.htm
← →
Jeer © (2007-07-06 15:29) [1]asm-команда: rdtsc
api-обращение QueryPerfomanceCounter к таймеру высокого разрешения
> будильник, который включает компьютер в определенное время.
Покупаешь механический будильник со стрелками, навешиваешь контакты и на Power switch
← →
Dib@zol © (2007-07-06 15:36) [2]
> Покупаешь механический будильник со стрелками, навешиваешь
> контакты и на Power switch
Кхм. ОМФГ. На хакер.ру некогда была статейка "проснись и пой компьютер мой!". Но тот код работает тока на Win9x :(
← →
Инс © (2007-07-06 15:40) [3]Думаю, даже если это возможно, то не из User Mode точно. Пишите драйвер.
← →
SHAMANSKI © (2007-07-06 15:52) [4]вот описание работы с нужным прерыванием на асме. Будет ли это работать под виндой, вставленное в код delphi?
Функции прерывания INT 1Ah
Для работы с часами реального времени вы можете обращаться непосредственно к перечисленным выше ячейкам памяти CMOS, используя порты 70h и 71h. Однако лучше всего воспользоваться функциями 2 - 7 прерывания INT 1Ah, описанными ниже.
Прочитать дату из часов реального времени
Регистры на входе:
AH = 04h
Регистры на выходе:
CH = столетие в BCD-формате;
CL = год в BCD-формате (например, CX=1997h означает 1997 год);
DH = месяц в BCD-формате;
DL = число в BCD-формате;
CF = CY = 1, если часы реального времени не установлены
Установить дату в часах реального времени
Регистры на входе:
AH = 05h
CH = столетие в BCD-формате;
CL = год в BCD-формате (например, CX=1997h означает 1997 год);
DH = месяц в BCD-формате;
DL = число в BCD-формате;
Регистры на выходе:
Регистры не используются
Установить будильник
Регистры на входе:
AH = 06h
CH = часы в BCD-формате;
CL = минуты в BCD-формате;
DH = секунды в BCD-формате
Регистры на выходе:
CF = CY = 1, если часы реального времени не установлены
← →
Инс © (2007-07-06 15:59) [5]
> вот описание работы с нужным прерыванием на асме. Будет
> ли это работать под виндой, вставленное в код delphi?
Разумеется нет. То, что вы привели, справедливо для MS_DOS. Почитайте про 32-разрядные системы, про защищенный режим микропроцессора, про кольца защиты. Много нового узнаете.
← →
SHAMANSKI © (2007-07-06 16:04) [6]
> Кхм. ОМФГ. На хакер.ру некогда была статейка "проснись и
> пой компьютер мой!". Но тот код работает тока на Win9x :
> (
интересная статейка, но там нужную инфу извлекают и пишут прямо в CMOS, что предполагает различия на разных материнках, а в коде, который я привел выше используют прерывание 1AH; по идее это должно запахать на всех матерях. Но поскольку я слабо шарю во всем этом, то хотелось бы найти готовый код.
← →
SHAMANSKI © (2007-07-06 16:06) [7]В общем, как я понял, в BIOS меня так просто не пустят. Извините за полное ламерство )))
← →
Инс © (2007-07-06 16:06) [8]Вы про эти штучки с прерываниями DOS и BIOS, прямым доступом к аппаратуре и прочими, на системах линейки NT забудьте.
← →
SHAMANSKI © (2007-07-06 16:12) [9]В таком случае, может существует готовый драйвер, работающий с нужным мне прерыванием?
← →
Сергей М. © (2007-07-06 16:12) [10]
> в BIOS меня так просто не пустят
Да и при "так сложно" тебе там тоже нехрена делать.
Есть ОС, ее средствами и возможностями и пользуйся.
← →
SHAMANSKI © (2007-07-06 16:15) [11]Вот воспользоваться возможностями ОС было бы для меня просто идеально. Но сколько я ни копался в нете, про функцию, которая этим делом управляет, ничего не нашел
← →
Сергей М. © (2007-07-06 16:17) [12]
> сколько я ни копался в нете
Покажи как "копался" ..
← →
SHAMANSKI © (2007-07-06 16:21) [13]вот такую вот штуку нашел:
int timer(char fn, SYSTIMER *tm)
{
reg.h.ah = fn;
switch (fn)
{
case RTC_SET_TIME:
{
reg.h.ch = tm->hour;
reg.h.cl = tm->min;
reg.h.dh = tm->sec;
reg.h.dl = tm->daylight_savings;
break;
}
case RTC_SET_DATE:
{
reg.x.cx = tm->year;
reg.h.dh = tm->month;
reg.h.dl = tm->day;
break;
}
case RTC_SET_ALARM:
{
reg.h.ch = tm->hour;
reg.h.cl = tm->min;
reg.h.dh = tm->sec;
break;
}
}
int86(0x1a,®,®);
if(reg.x.cflag == 1)
return(-1);
switch (fn)
{
case RTC_GET_TIME:
{
tm->hour = reg.h.ch;
tm->min = reg.h.cl;
tm->sec = reg.h.dh;
break;
}
case RTC_GET_DATE:
{
tm->year = reg.x.cx;
tm->month = reg.h.dh;
tm->day = reg.h.dl;
break;
}
}
return 0;
}
Но будет ли она виндах работать?
← →
Сергей М. © (2007-07-06 16:24) [14]Не будет.
← →
SHAMANSKI © (2007-07-06 16:43) [15]Хорошо. Можно подойти к вопросу с другой стороны. У меня есть проограммка auto power-on, она запускает свой сервис (poweronservice). Я могу прикрутить этот сервис к своей программе. Но как проще узнать, какие этому сервису необходимо передавать сообщения и с какими параметрами?
← →
Сергей М. © (2007-07-06 16:47) [16]
> как проще узнать, какие этому сервису необходимо передавать
> сообщения и с какими параметрами?
Это проще узнать при помощи дизассемблера и отладчика.
← →
SHAMANSKI © (2007-07-06 16:49) [17]А если пробовать перехватить сообщения, посылаемые той прогой сервису?
Такое можно организовать?
← →
Сергей М. © (2007-07-06 16:52) [18]Ну перехватил ты десяток байт с непонятным тебе содержимым - что дальше ?
← →
SHAMANSKI © (2007-07-06 16:55) [19]Плохи мои дела...
Видать из этого ничего не получится. Придется юзать wake-on-lan, с этим-то все понятно и исходников полно
← →
Инс © (2007-07-07 12:20) [20]
> Придется юзать wake-on-lan, с этим-то все понятно и исходников
> полно
Только в БИОСе по умолчанию Wake-on-lan отключен.
← →
REA (2007-07-09 10:50) [21]На Win98 работает через прерывание, под XP через драйвер. Видел хакерский трюк установки и запуска такого драйвера из программы с его удалением. Под Vista неизвестно через что...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.046 c