Как програмно включить компьютер ?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Clerk, 11 апр 2008.

  1. aidos

    aidos New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2008
    Сообщения:
    12
    Тут по-любому внешние устройства должны быть. Насчет таймера - его мона сделать любым. Насчет биоса - всё-таки попробуй прописаться в нем - думаю сам знаешь, чтО должна твоя прога делать в этом случае - проверять питание на компе, включен ли он уже - если нет, то по таймеру вкл в нужное время.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Пробовал запрограммировать таймер вручную. Не включается, но если в конфиге биос установить 'Resume By Alarm' в Enable, то включается, но тогда сбрасывается время и дата(при загрузке биос записывает время и дату будильника установленную в нём в cmos и если их поменять в cmos, то текущая дата и время сбрасываются).
    Код (Text):
    1. ;CMOS_ADDRESS_PORT  equ 70h
    2. ;CMOS_DATA_PORT equ 71h
    3.  
    4. CMOS_CLOCK struct
    5. Seconds     BYTE ?  ;+00h Текущая секунда
    6. SecondsAlarm    BYTE ?  ;+01h Сигнальная секунда
    7. Minutes     BYTE ?  ;+02h Текущая минута
    8. MinutesAlarm    BYTE ?  ;+03h Сигнальная минута
    9. Hours       BYTE ?  ;+04h Текущий час
    10. HoursAlarm  BYTE ?  ;+05h Сигнальный час
    11. DayOfWeek       BYTE ?  ;+06h Текущий день недели (1 - Воскресенье)
    12. DayOfMonth  BYTE ?  ;+07h Текущий день месяца
    13. Month       BYTE ?  ;+08h Текущий месяц
    14. Year            BYTE ?  ;+09h Текущий год (2 последние цифры его)
    15. CMOS_CLOCK ends
    16.  
    17. CMOS_CSR struct ;Control Status Registers
    18. RegisterA       BYTE ?
    19. RegisterB       BYTE ?
    20. RegisterC       BYTE ?
    21. RegisterD       BYTE ?
    22. CMOS_CSR ends
    23.  
    24. CMOS_RTC struct
    25. Clock   CMOS_CLOCK <>
    26. Csr     CMOS_CSR <>
    27. CMOS_RTC ends
    28.  
    29. CMOS_ALL_REGISTERS      equ 80h ;128, число всех регистров
    30. CMOS_STORAGE_REGISTERS  equ CMOS_ALL_REGISTERS - SizeOf CMOS_RTC    ;72h
    31.  
    32. CMOS struct
    33. Rtc             CMOS_RTC <>
    34. StorageRegisters    BYTE CMOS_STORAGE_REGISTERS DUP (?)
    35. CMOS ends
    36. PCMOS typedef ptr CMOS
    37.  
    38. CmosCheckAmount equ 2Eh
    39.  
    40. ;Флаги PostStatus
    41. POST_CLOCK_CORRECT      equ 00000100b   ;Время правильное
    42. POST_HDD_INVALID        equ 00001000b   ;Неверный загрузочный жесткий диск
    43. POST_RAM_INVALID        equ 00010000b   ;Неверный размер ОЗУ
    44. POST_DEVICE_INVALID     equ 00100000b   ;Неверное оборудование
    45. POST_CMOS_INVALID       equ 01000000b   ;Неверная контрольная сумма CMOS
    46. POST_BATTERY_INVALID    equ 10000000b   ;Батарея CMOS разряжена
    47.  
    48. CMOS_DATA struct    ;x CMOS_STORAGE_REGISTERS
    49. PostStatus  BYTE ?  ;+0Eh Байт диагностики загрузки POST_
    50. ShutdownStatus  BYTE ?  ;+0Fh Байт статуса завершения работы ПК
    51. FloppyType  BYTE ?  ;+10h Тип дисковода
    52. Reserved1       BYTE ?  ;+11h
    53. HddType     BYTE ?  ;+12h Тип винчестера
    54. Reserved2       BYTE ?  ;+13h
    55. DeviceFlags BYTE ?  ;+14h
    56. BaseMemory  WORD ?  ;+15h
    57. AddMemory       WORD ?  ;+17h
    58. HddType0        BYTE ?  ;+19h
    59. Undefined1  BYTE 6 DUP (?)  ;+1Ah
    60. HddType1        BYTE ?  ;+20h
    61. Undefined2  BYTE 0Dh DUP (?)    ;+21h
    62. CheckAmount WORD ?  ;+2Eh Контрольная сумма значений по адресам от 10Н по 20Н
    63. Reserved3       BYTE 2 DUP (?)  ;+30h
    64. Age         BYTE ?  ;+32h Век, в BCD формате
    65. Reserved4       BYTE 0Dh DUP (?)    ;+33h
    66. CMOS_DATA ends
    67. PCMOS_DATA typedef ptr CMOS_DATA
    68.  
    69. CMOS_EX struct
    70. Rtc     CMOS_RTC <>
    71. Data        CMOS_DATA <>
    72. CMOS_EX ends
    73. PCMOS_EX typedef ptr CMOS_EX
    74.  
    75. ;Control Status Register B
    76. CMOS_CSRB_DSE   equ 00000001b   ;Daylight Saving Enable
    77. CMOS_CSRB_HF    equ 00000010b   ;Hour Format (1 = 24-hour format, 0 = 12-hour format)
    78. CMOS_CSRB_DF    equ 00000100b   ;Data Format (1 = Binary, 0 = BCD)
    79. CMOS_CSRB_SQWE  equ 00001000b   ;Square-Wave Enable (1 = Enabled, 0 = Disabled and held low)
    80. CMOS_CSRB_UIE   equ 00010000b   ;Update Cycle Interrupt Enable (1 = Enabled, 0 = Disabled)
    81. CMOS_CSRB_AIE   equ 00100000b   ;Alarm Interrupt Enable (1 = Enabled, 0 = Disabled)
    82. CMOS_CSRB_PIE   equ 01000000b   ;Periodic Interrupt Enable (1 = Enabled, 0 = Disabled)
    83. CMOS_CSRB_UTI   equ 10000000b   ;Update Transfer Inhibit (1 = Inhibits transfer and clears UIE, 0 = Allows transfer)
    84.  
    85. _Delay_ macro
    86.     pushfd
    87.     popfd
    88.     jmp short $+2
    89. endm
    90. ;------------------------------------------------------------------------
    91.     mov al,CMOS.Rtc.Csr.RegisterB   ;Register B
    92.     _Delay_
    93.     out CMOS_ADDRESS_PORT,al
    94.     _Delay_
    95.     in al,CMOS_DATA_PORT
    96.     _Delay_
    97.     or al,CMOS_CSRB_UTI or CMOS_CSRB_PIE or CMOS_CSRB_AIE or CMOS_CSRB_HF or CMOS_CSRB_DF
    98.     out CMOS_DATA_PORT,al
    99.     _Delay_
    100.    
    101.     mov al,CMOS.Rtc.Clock.SecondsAlarm
    102.     out CMOS_ADDRESS_PORT,al
    103.     _Delay_
    104. Ring0SetAlarm_Seconds__:
    105.     mov al,-1       ;Seconds <------------
    106.     out CMOS_DATA_PORT,al
    107.    
    108.     mov al,CMOS.Rtc.Clock.MinutesAlarm
    109.     _Delay_
    110.     out CMOS_ADDRESS_PORT,al
    111.     _Delay_
    112. Ring0SetAlarm_Minutes__:
    113.     mov al,-1       ;Minutes <------------
    114.     out CMOS_DATA_PORT,al  
    115.  
    116.     mov al,CMOS.Rtc.Clock.HoursAlarm
    117.     _Delay_
    118.     out CMOS_ADDRESS_PORT,al
    119.     _Delay_
    120. Ring0SetAlarm_Hours__:
    121.     mov al,-1       ;Hours <------------
    122.     out CMOS_DATA_PORT,al
    123.     _Delay_
    124.    
    125.     mov al,CMOS.Rtc.Csr.RegisterB   ;Register B
    126.     out CMOS_ADDRESS_PORT,al
    127.     _Delay_
    128.     in al,CMOS_DATA_PORT
    129.     _Delay_
    130.     and al,not(CMOS_CSRB_UTI)
    131.     out CMOS_DATA_PORT,al
    132.     _Delay_
    Наверно придётся в биос лезть..
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Сделал с десяток дампов CMOS, оказывается есть область, наверно там биос параметры будильника хранит:
    Так как эта область нигде не документирована, вероятно для разных материнских плат смещение будет различным, для Gigabyte GA-8IPE1000MK:
    Код (Text):
    1. BiosAlarmOffset equ 54h ;Возможно зависит от материнской платы.
    2.  
    3. BIOS_ALARM_ENABLE equ 1h
    4.  
    5. BIOS_ALARM struct
    6. Flags   BYTE ?  ;54h - BIOS_ALARM_ENABLE, разрешает или запрещает будильник
    7. Period  BYTE ?  ;55h - (если ноль то каждый день)
    8. Seconds BYTE ?  ;56h
    9. Minutes BYTE ?  ;57h
    10. Hours   BYTE ?  ;58h
    11. BIOS_ALARM ends
    Видимо это то что надо, попробую установить.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ещё вопрос.
    "Функция 06h прерывания 1Ah BIOS позволяет установить будильник на заданное время." - это может помочь ?
    Можно это через ntos!Ke386CallBios() вызвать и надо ли будет вектор прерывания RTC менять ?
     
  5. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Гм-гм-гм... Я почти также копал, только уперся всётаки в ACPI... и забросил.
    Вот читаем тут http://www.xlevel.ru/forum/YaBB.cgi?board=programming;action=display;num=1190899535
    там все расмышлизмы, пробы, ошибки и успехи, как на ладони. Может кто добъёт это дело или сообща это забороть.
    Вообще то непорядок! Народ выключать умеет и довольно популярно, а включать НЕТ!
    Вендорозависимость и прочий комерческий беспредел :)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    С CMOS всё отлично работает. Выключаю компьютер обычным способом и включается!!!
    Оказывается сбрасывалась CMOS из-за ещё одной контрольной суммы.
    Написал рабочий код. Попробую через Ke386CallBios. Ведь если через CMOS то привязан код к железу.
     
  7. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    А спящий-то режим чем вам не нравится? Удобно и без привязки к железу.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    А как в спящем режиме включить ?
    Сегодня вызову через прерывание биос, вдруг заработает..
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Пытаюсь вызвать это:
    NTSTATUS
    Ke386CallBios (
    IN ULONG BiosCommand,
    IN OUT PCONTEXT BiosArguments)
    BIOS:
    Функция 06h (Установить будильник)
    Эта функция позволяет установить будильник на время, заданное в соответствующих регистрах процессора.
    На входе:
    o AH = 06h;
    o CH = часы в BCD-формате;
    o CL = минуты в BCD-формате;
    o DH = секунды в BCD-формате.
    На выходе:
    o CF = CY = 1, если часы реального времени не установлены.
    -------------------------------------------------------------
    Бсод на инструкции cli глубоко в ntos с кодом KERNEL_MODE_EXCEPTION_NOT_HANDLED_M (0x1000008E)

    Bugcheck code 1000008E
    Arguments c0000005 804de0c7 f7badcf0 00000000
    ChildEBP RetAddr Args to Child
    f7badd64 80701005 badb0d00 8054d1c9 804ddf0f ntoskrnl+0x70c7
    0012ff9b 80145d00 00007000 12ffb400 00000000 0x80701005
    12ffc000 00000000 00000000 00000000 00000000 0x80145d00

    eax=00000030 ebx=8054d1d6 ecx=0012fbb8 edx=8054d1c9 esi=00801051 edi=0012fcc1
    eip=804de0c7 esp=f7badd64 ebp=f7badd64 iopl=0 nv up ei pl nz na po nc
    cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010206
    ntoskrnl+70c7:
    804de0c7 fa cli

    Что передавать в структуру CONTEXT в BiosArguments (все поля заполнять чтоли надо) ?
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кто с этим сталкивался, плиз помгите, может через это вызвать:
    KeI386Call16BitFunction (
    IN OUT PCONTEXT Regs):VOID
    Вообще как BIOS прерывание вызвать ?
     
  11. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Clerk, из спящего/ждущего режима CreateWaitableTimer/SetWaitableTimer с установленным fResume/WaitForSingleObject разбудят без проблем. Просто и работает везде.

    По сабжу могу сказать, что тоже в своё время немного с этим ковырялся, но ничего особенного не нашёл. Есть, правда, программка Bilarm, которая позволяет установить время включения (ничего особенного, у неё база данных, по какому смещению в CMOS что писать для какой материнки), могу выложить. Но у меня она не работает (старая Intel-овская мать), и я буду очень рад, если ваши поиски увенчаются успехом.
     
  12. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Спящий режим (если глубоко понимать как там он получается) это тоже ACPI просто его сервисом пользуются в "готовом виде"...
    1. Прерывания BIOS тут ни при чем, кстати что именно имеется в виду? IRQ8?
    2. Установки в CMOSе это так сказать, необходимый финал, о чем можно понять почитав по моей ссылке выше. И программа Bilarm не занимается ACPI, она просто меняет по своей базочке CMOS ячеечки в зависимости от производителя. Собственно это и я пытался и видимо Clerk
    3. Получается, что если мы входим в биос и ставим включение в:xxx.......,
    то помимо уставок в CMOS он (биос) программирует железячные дела power тематики ACPI далее МЫ МОЖЕМ загрузится и поменять корректно из приложения дату, время и пр.... и он действительно СТРАБОТАЕТ ПОСЛЕ ВЫКЛЮЧЕНИЯ, т.е. ВКЛЮЧИТСЯ!
    Но! Но, обязательное условие НАЛИЧИЕ питания в машине, т.е. машинка выключена при этом вилка в розетке, однако запитана мышь клава и пр...... и тот самый включатель КОНЕЧНО тоже и он взведен! А вот при совпадении даты и времени этот включатель лишь "толкает" БП АTX и "заводит" основную часть питания машинки.
    Так что батарейка CMOSа тут не канает и она бессильна что либо сделать, если по ряду причин будет сброшен этот самый "включатель" (скорее всего элементрарный триггер).
    4. Таким образом включалка далека от идеала надежности регулярного включения по ежедневному расписанию, например.
    5. Собственно полноценная прога должна не только уметь CMOS установ делать (вендоорзависимый!) но и проверять взведен ли "включатель" (ACPIем владеть по данному параметру прямо или косвенно). Тогда выключая машинку можно быть уверенным что она сработать должна таки, если.... если ночью никто рубильником щёлкать не будет выясняя, где его лампочка "сидит"... :):):)
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Int 1Ah
     
  14. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    это совсем не в ту степь... Заблуждение.
    Надеюсь мои факты и доводы были весомыми.
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Почему же не в ту степь, очень даже в ту. Даже если с помощью ntos не удастся пробиться к биос, я попытаюсь переходом в реалмоде.
     
  16. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    остается надеяться на твой оптимизм и интуицию. Я со своим писсимизмом получается, вижу это дело сложным, хотя, как говорится все гениальное просто (у меня к сожалению по жизни - наоборот :)
    Надеюсь отпишеться при удаче, а может дашь потестить. У тя мать гигабайтная, а они "любят" ALARm PowerON.
    У меня мать видимо весьма совместима с твоей (по крайней мере по поводу CMOS сета) Gigabyte GA-8I915P-D
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    угу, тоже ковырялся в будильниках. Там делается через вендорозависимые модификация cmos'а.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    VaStaNi
    Ты был прав насчёт 'тригера'. Устанавливаю таймер, выключаю компьютер, затем отключаю питание на несколько секунд и снова включаю - будильник не срабатывает.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Оказалось что бсодило потомочто я пз.. вместо 6 функции пятую скормил, но всёравно не работает, типа нет доступа выдаёт.
     
  20. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Все то, что связано с Power управлением достойно внимания и изучения для успеха в этом деле. Т.е. и система и ее функции и сервис и чипсет и порты и дескрипторы... Но на самом низком уровне, вернее я бы сказал на уровне +1 находится ACPI. Я сначала своих "деяний" по данному сабжу пытался прямым копанием в "кишках" BIOSа нащупать самый чтони на есть "0" уровень, т.е. прямое воздействие через порт(порты) чипсета, которые позволяют взводить этот клятый триггер в боевую готовность и чихать я хотел на всех посредников типа таблицы ACPI, дескрипторы, зависимость от системы и ее фичи, сервис...
    Но вот все уперлось видимо в копание и понимание ACPI. Но он какой то "мутный" по сабжу и вообще карусель типа таблица таблиц ради таблицы где порт указан будет мне не нравится... Происки империализма, блин... :)