NP的重啓代碼(記錄備份)!

 
NP的重啓代碼(記錄備份)!
2009-05-14 16:20

貌似很多遊戲保護系統都是這麼重啓的
mov dx, 64h
mov al, feh
out dx, al

HS的重啓

cli
push 000000FE
push 00000064
Call WRITE_PORT_UCHAR
hlt

異曲同工之處!

BIOS知識點滴Follow Bini系列之---系統重啓

複製內容到剪貼板
代碼:
;----------------------------------------------
; 文件名:KBCReset.asm
;----------------------------------------------
;    2007-12-11    bini.Yi/易祝兵    For teaching
;----------------------------------------------
    .386
    .model tiny
    .code
    org     100h
  
;; 如下代碼參照 《PC技術內幕》第8章 鍵盤系統

START:
    mov     bl, 0FEh                ; KBC Reset命令
    call    keyboard_cmd            ; 不應該有返回
    hlt

IODELAY MACRO
    out    0EDh, al
ENDM

;----------------------------------------------
;    keyboard_cmd()
;----------------------------------------------
;    如果由於緩衝區滿超時,則 ah 返回非零

;    調用    bl = 命令字節
;            ds = cs
;
;    返回    如果 ah =0,則成功
;            如果 ah =1,則失敗
;----------------------------------------------

keyboard_cmd    PROC    NEAR
    xor     cx, cx                  ; 超時計數器(64K)

cmd_wait:
    in      al, 64h                 ; 獲取控制器狀態
    IODELAY
    test    al, 2                   ; bit1,輸入緩衝區滿?(控制器是否有數據沒處理完)
    jz      cmd_send                ; 緩衝區空,準備接收命令.
    loop    cmd_wait                ; 緩衝區滿,重試
  
    jmp     cmd_error               ; 超時,失敗
  
cmd_send:
    mov     al, bl                  ; 取 bl 中的命令字節
    out     64h, al                 ; 發送命令字節
    IODELAY

    xor     cx, cx                  ; 超時計數器(64K)
cmd_accept:
    in      al, 64h                 ; 獲取控制器狀態
    IODELAY
    test    al, 2                   ; bit1,輸入緩衝區滿?(控制器是否有數據沒處理完)
    jz      cmd_ok                  ; 緩衝區空,處理完
    loop    cmd_accept              ; 緩衝區滿,重試
  
cmd_error:                          ; 超時失敗
    mov     ah, 1                   ; 失敗返回狀態非零
    jmp     cmd_exit

cmd_ok:
    xor     ah, ah                  ; 成功返回零
  
cmd_exit:
    ret
keyboard_cmd    ENDP

    END    START
2、PORT 92h


從EISA系統之後,系統控制端口定義了一位用來快速重啓的寄存器,就是在PORT 92h的Bit0,這種方式最終結果是和KBC一樣的,HOST會拉CPU的INIT#以讓系統重啓。但這種方式不通過KBC,所以速度更快一點,代碼如下:

複製內容到剪貼板
代碼:
in al, 92h
IODELAY
or al, 1
out 92h, al
hlt

3、Reset Control Register(Port CF9h)


用此方法控制Reset,各Chip極有可能各芯片產商的做法會不同。

計算機研發論壇,BIOS技術網站,BIOS技術論壇,BIOS SPEC,BIOS手冊,BIOS入門,ACPI,SMBIOS,BIOS技術,EC資料,EC開發,PS/2,KBC) f$ w9 t7 X) l) h6 U

這裏大家可以認識幾種Reset的名詞: Platform Reset, PCI Reset, System Reset, Reset CPU.我們來看Intel的文檔,如下圖:    

1.GIF (21.4 KB)


大家注意看,如果System Reset bit位爲1,那麼如果Reset CPU bit從0變爲1時,系統就會產生Platform Reset(包括產生PCI、FWH、SIO、LPC、MCH Reset),即稱爲Hard Reset;如System Reset bit位爲0,那麼系統就會產生Soft Reset,即:和KBC/PORT 92h Bit0一樣,下拉CPU INIT# 16個PCI Clock。

因此你可以用下如代碼Hard Reset:

複製內容到剪貼板
代碼:
mov al, 6
mov dx, 0CF9h
out dx, al
jmp $

也可以用如下代碼“關機”(看你的機器的做法,也就是對SLP_S3#,SLP_S4#,SLP_S5#的處理):

複製內容到剪貼板
代碼:
mov al, 0Eh
mov dx, 0CF9h
out dx, al
jmp $

4、Ctrl+Alt+Del

    這種方法“基本”是在“DOS”下有效,教課書上常稱爲"熱啓"。鍵盤中斷會hook住你的按鍵,Hook就是BIOS的INT 09h軟中斷,當你按下這三個鍵時,就相當於Far jmp到 F000:FFF0處。用如下代碼在DOS可實現熱啓動。

複製內容到剪貼板
代碼:
    jmp     F000:FFF0
  
OK,你對系統重啓是否又清楚了一些呢?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章