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

Тема в разделе "WASM.BEGINNERS", создана пользователем senseysensor, 20 мар 2009.

  1. senseysensor

    senseysensor New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2009
    Сообщения:
    17
    Здравствуйте!
    Вопрос, собственно, в заголовке. Есть ли способ вырубить комп с помощью функций/прерываний/манипуляций с портами DOS/BIOS? Или это на каждой материнке/BIOS'е по-своему?

    Спасибо!
     
  2. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Посмотри int 15, ah=53h. У Ральфа Брауна все описания есть. Также можно гугол-> advanced power management.
     
  3. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    ....
    message db 'Теперь питание компьютера можно выключить!',0dh,0ah,'$'
    .....
    mov ah,9
    mov dx,offset message
    int 21h
     
  4. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    jaja +1 х) ХD
     
  5. Clerk

    Clerk Забанен

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Интересный вопрос. Если посмотреть как это делает хал. Он даже может считать состояние кнопки "Power" системника.
    Ребут или выключение выполняется посредством HalReturnToFirmware().
    Если это ребут, то всё просто - запись в системный порт 0x64 значения 0xFE, что приведёт к сбросу процессора.
    После подготовки к сбросу в HalpReboot() вызывается HalpWriteResetCommand(), которая собственно и выполняет сброс/выключает ибп:
    Код (Text):
    1. 003668C0 _HalpWriteResetCommand@0   /$  33C9            xor ecx,ecx
    2. 003668C2                            |.  41              inc ecx
    3. 003668C3                            |.  380D 48263700   cmp byte ptr ds:[372648],cl
    4. 003668C9                            |.  0F86 9A000000   jbe hal.00366969
    5. 003668CF                            |.  F605 B1263700 0>test byte ptr ds:[3726B1],4
    6. 003668D6                            |.  0F84 8D000000   je hal.00366969
    7. 003668DC                            |.  380D 48343700   cmp byte ptr ds:[_HalpMustUseResetReg],cl
    8. 003668E2                            |.  74 09           je short hal.003668ED
    9. 003668E4                            |.  F605 AD263700 0>test byte ptr ds:[3726AD],2
    10. 003668EB                            |.  75 7C           jnz short hal.00366969
    11. 003668ED                            |>  0FB605 B4263700 movzx eax,byte ptr ds:[3726B4]
    12. 003668F4                            |.  83E8 00         sub eax,0                                               ;  Switch (cases 0..2)
    13. 003668F7                            |.  74 4E           je short hal.00366947
    14. 003668F9                            |.  48              dec eax
    15. 003668FA                            |.  74 36           je short hal.00366932
    16. 003668FC                            |.  48              dec eax
    17. 003668FD                            |.  75 6A           jnz short hal.00366969
    18. 003668FF                            |.  A1 B8263700     mov eax,dword ptr ds:[3726B8]                           ;  Case 2 of switch 003668F4
    19. 00366904                            |.  51              push ecx                                                ; /Arg6
    20. 00366905                            |.  8BC8            mov ecx,eax                                             ; |
    21. 00366907                            |.  81E1 FF000000   and ecx,0FF                                             ; |
    22. 0036690D                            |.  51              push ecx                                                ; |Arg5
    23. 0036690E                            |.  8B0D BC263700   mov ecx,dword ptr ds:[3726BC]                           ; |
    24. 00366914                            |.  C1E8 0B         shr eax,0B                                              ; |
    25. 00366917                            |.  68 C0263700     push hal.003726C0                                       ; |Arg4 = 003726C0
    26. 0036691C                            |.  25 E0000000     and eax,0E0                                             ; |
    27. 00366921                            |.  83E1 1F         and ecx,1F                                              ; |
    28. 00366924                            |.  0BC1            or eax,ecx                                              ; |
    29. 00366926                            |.  50              push eax                                                ; |Arg3
    30. 00366927                            |.  6A 00           push 0                                                  ; |Arg2 = 00000000
    31. 00366929                            |.  6A 05           push 5                                                  ; |Arg1 = 00000005
    32. 0036692B                            |.  E8 1E060000     call hal.HalSetBusDataByOffset                          ; \HalSetBusDataByOffset
    33. 00366930                            |.  EB 37           jmp short hal.00366969
    34. 00366932                            |>  33C0            xor eax,eax                                             ;  Case 1 of switch 003668F4
    35. 00366934                            |.  A0 C0263700     mov al,byte ptr ds:[3726C0]
    36. 00366939                            |.  50              push eax
    37. 0036693A                            |.  FF35 B8263700   push dword ptr ds:[3726B8]
    38. 00366940                            |.  E8 77210000     call hal.WRITE_PORT_UCHAR
    39. 00366945                            |.  EB 22           jmp short hal.00366969
    40. 00366947                            |>  51              push ecx                                                ; /Arg3; Case 0 of switch 003668F4
    41. 00366948                            |.  FF35 BC263700   push dword ptr ds:[3726BC]                              ; |Arg2 = 00000000
    42. 0036694E                            |.  FF35 B8263700   push dword ptr ds:[3726B8]                              ; |Arg1 = 00000000
    43. 00366954                            |.  E8 D1100000     call hal._HalpMapPhysicalMemoryWriteThrough64@12        ; \_HalpMapPhysicalMemoryWriteThrough64@12
    44. 00366959                            |.  33C9            xor ecx,ecx
    45. 0036695B                            |.  8A0D C0263700   mov cl,byte ptr ds:[3726C0]
    46. 00366961                            |.  51              push ecx
    47. 00366962                            |.  50              push eax
    48. 00366963                            |.  FF15 A8053600   call dword ptr ds:[<&ntoskrnl.WRITE_REGISTER_UCHAR>]    ;  ntoskrnl.WRITE_REGISTER_UCHAR
    49. 00366969                            |>  68 FE000000     push 0FE                                                ;  Default case of switch 003668F4
    50. 0036696E                            |.  6A 64           push 64
    51. 00366970                            |.  E8 47210000     call hal.WRITE_PORT_UCHAR
    52. 00366975                            \.  C3              ret
    К сожалению этот код нельзя продебажить сисером, возможно wmware + windbg поможет.
    Параметр для той функции является одним из следующих:
    Код (Text):
    1. {
    2.      HalHaltRoutine,
    3.      HalPowerDownRoutine,
    4.      HalRestartRoutine,
    5.      HalRebootRoutine,
    6.      HalInteractiveModeRoutine,
    Именно HalPowerDownRoutine и выключает питание. В приведённом дизасме это исполнит запись в порт:
    Код (Text):
    1. 00366932                            |> \33C0            xor eax,eax                                             ;  Case 1 of switch 003668F4
    2. 00366934                            |.  A0 C0263700     mov al,byte ptr ds:[3726C0]
    3. 00366939                            |.  50              push eax
    4. 0036693A                            |.  FF35 B8263700   push dword ptr ds:[3726B8]
    5. 00366940                            |.  E8 77210000     call hal.WRITE_PORT_UCHAR
    6. ]
    Как видно порт не является константой, также это не проекция пространства регистров IO. Порт определяется(и не только этот) при инициализации хал наверно в функции HalpSetupAcpiPhase0().
    Но не понятно, тот массив содержит нули, если система не готовится к выключению. Код весьма сложен, сурцов нет, максимум это реактос, теже сурцы винды :dntknw:, но так как это закрытый майкрософт код, в реактос нет кода выключающего питание.
    http://www.reactos.org/generated/doxygen/da/d40/haltypes_8h.html
    http://www.reactos.org/pipermail/ros-diffs/2006-November/014541.html
    Должно изучить матчать, это единственный вариант, который позволит понять как исполняется выключение атх.
     
  7. senseysensor

    senseysensor New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2009
    Сообщения:
    17
    да.
    не так это, оказывается, просто.... но за ответ в любом случае спасибо всем!
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Посмотри спецификацию на APM.
    Всё там просто (относительно).
    Clerk просто ядро с ACPI в отладчике смотрел, а с ACPI там действительно не всё так просто.
    Хотя тоже ничего сверхъестественного нету.
    Вообще говоря и через ACPI можно в три команды машину выключить, но будет зависимо от чипсета.
    А чтоб было независимо - надо таблицы ACPI парсить.
    В общем APM самый простой способ - раза три вызовеш int 15h и выключишь.
    APM BIOS Interface Specification Revision 1.2
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    А вот и примерчик
    Код (Text):
    1. POWER_OFF
    2. mov ax, 0x5301
    3. xor bx, bx
    4. int 0x15
    5. mov ax, 0x5308
    6. mov bx, 1  
    7. mov cx, bx  
    8. int 0x15  
    9. mov ax, 0x530D  
    10. mov bx, 1  
    11. mov cx, bx  
    12. int 0x15
    13. mov ax, 0x530F
    14. mov bx, 1
    15. mov cx, bx
    16. int 0x15
    17. mov ax, 0x530E
    18. xor bx, bx
    19. mov cx, 0x102
    20. int 15h
    21. mov ax, 0x5307
    22. mov bx, 1
    23. mov cx, 3
    24. int 0x15
    25. jmp $
     
  10. tahir

    tahir New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2009
    Сообщения:
    22
    был у меня исходник , если очень надо свяжись со мной по почте spolyr@rambler.ru
     
  11. senseysensor

    senseysensor New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2009
    Сообщения:
    17
    Ребята, большое спасибо вам! проблему можно считать решённой :)