无忧启动论坛

标题: dos中一个关机软件的问题 [打印本页]

作者: shuini    时间: 2007-10-19 10:20
标题: dos中一个关机软件的问题
做了个软盘镜像,里面集成了如ghost之类一些应用软件,在虚拟机下测试完全正常,但在真实机器中发现一个问题:运行D.COM这个关机小软件后机器并不关机,跟没运行一样。
不解。特来这里求解。
作者: taoty    时间: 2007-10-21 23:34
DOS下没有关机软件。
作者: netwinxp    时间: 2007-10-22 02:42
有关机软件,但需要支持APM才行。
使用的是INT 15H 的AX=53XXH的功能调用来关机。下面是汇编源代码:
;ShutDown v1.2 written by BlackLight 2001
;Download my other software from my website at www.blacklight.wxs.org
;assemble this prog with the MAGIC ASSEMBLER by Magic Software Rotterdam
;Download it here (freeware):
;http://www.math.leidenuniv.nl/~bgreeven
;http://www.caiw.nl/~bert
;What's new?
;v1.2 - added smartdrive flush
;v1.1 - added command-line parameter support
;v1.0 - first version
            mov  ax,160a                  ;check for Windows
            int  2f
            cmp  ax,0000
            jne  @NoWin
            mov  dx,offset(WinErr)        ;print error message
            mov  ah,9
            int  21
            jmp  @Exit
@NoWin      jmp  @Start
WinErr      db   'This program cannot be run under Windows.' 0a 0d '$'
Txt         db   'ShutDown v1.2 ?www.blacklight.wxs.org' 0a 0d '$'
SyntaxTxt   db   'Syntax: SHUTDOWN [S(hutdown)|R(estart)]' 0a 0d '$'
Question    db   'S(hutdown), R(estart), or C(ancel)? $'
NoATX       db   'Could not shutdown! No ATX maybe?$' 0a 0d
KeyOff      db   'S'
KeyRes      db   'R'
KeyCan      db   'C'
KeyEsc      db   %d27
                                          ;-------------------------------
@Syntax     mov  ah,9
            mov  dx,offset(SyntaxTxt)
            int  21
            jmp  @Exit
                                          ;-------------------------------
@Start      mov  ah,9                     ;Show program name
            mov  dx,offset(Txt)
            int  21
                                          ;-------------------------------
            cmp  byte [0081],0d           ;Check if any parameters given
            je   @NoPars
            mov  si,81                    ;get parameters
@ParLoop    lodsb
            cmp  al,0d                    ;if end reached with no result
            je   @Syntax                  ;   show syntax
            and  al,DF                    ;convert AL to uppercase
            cmp  al,KeyOff                ;check for S parameter
            je   @DoOffW
            cmp  al,KeyRes                ;check for R parameter
            je   @DoResW
            jmps @ParLoop                 ;not recognized,goto next char.
                                          ;-------------------------------
@NoPars     mov  ah,9                     ;Show question
            mov  dx,offset(Question)
            int  21
@DoAsk      xor  ah,ah                    ;Ask for key
            int  16
            cmp  al,KeyEsc                ;Check if 'Esc'-key pressed
            je   @DoCan
            and  al,DF                    ;convert AL to uppercase
            cmp  al,KeyOff                ;Check if 'S'-key pressed
            je   @DoOff
            cmp  al,KeyRes                ;Check if 'R'-key pressed
            je   @DoRes
            cmp  al,KeyCan                ;Check if 'C'-key pressed
            je   @DoCan
            jmps @DoAsk                   ;Invalid key pressed, ask again...
@ShowKey    mov  ah,2                     ;Show the pressed key
            mov  dl,al
            int  21
            mov  ah,9                     ;Show CrLf
            mov  dx,offset(CrLf)
            int  21
            ret                           ;return
CrLf        db   0a 0d '$'
@DoRes      call @ShowKey
@DoResW     call @FlushSD
            jmpf ffff:0000                ;this instruction will reboot the
                                          ;computer
@DoOff      call @ShowKey
@DoOffW     jmps @ATXOff
@DoCan      call @ShowKey
@Exit       mov  ax,4c00                  ;exit to DOS
            int  21
@ATXOff     call @FlushSD                 ;flush smartdrive cache
            mov  ax,5301           ;Function 5301h: APM ?Connect real-mode interface
            xor  bx,bx             ;Device ID:      0000h (=system BIOS)
            int  15                ;Call interrupt: 15h
            mov  ax,530e           ;Function 530Eh: APM ?Driver version
            mov  cx,0102           ;Driver version: APM v1.2
            int  15                ;Call interrupt: 15h
            mov  ax,5307           ;Function 5307h: APM ?Set system power state
            mov  bl,01             ;Device ID:      0001h (=All devices)
            mov  cx,0003           ;Power State:    0003h (=Off)
            int  15                ;Call interrupt: 15h
            ;if the program is still running here, there was an error...
            mov  ah,9
            mov  dx,offset(NoATX)
            int  21
            jmps @Exit
FlushMsg1   db   'Flushing SMARTDRV buffers...$'
FlushMsg2   db   'done' 0a 0d '$'
@FlushSD    mov  ah,9
            mov  dx,offset(FlushMsg1)
            int  21
            mov  ax,4A10       ;flush smartdrv/pccache buffers
            mov  bx,1
            int  1A
            mov  ah,9
            mov  dx,offset(FlushMsg2)
            int  21
            ret

[ 本帖最后由 netwinxp 于 2007-10-22 02:57 AM 编辑 ]
作者: gmy    时间: 2007-10-22 10:51
一键GHOST和超级级急救盘 里提供了关机程序。
func -s 或
off.com

无法关机的原因可能是与部分台式机或笔记本不兼容,没办法。
作者: shuini    时间: 2007-10-22 23:28
谢谢各位大大的解答!
作者: lianjiang    时间: 2007-10-23 07:30
原帖由 taoty 于 2007-10-21 11:34 PM 发表
DOS下没有关机软件。

应该是ms-dos中没有关机命令。第三方工具是有的。呵呵。shutdown.com等。
作者: CMD    时间: 2007-10-28 14:13
关机软件吗?,可以看看别人的工具盘拷一个嘛,,,工具盘可以自己DIY,但软件可以拿别人的嘛!!!!
作者: ones    时间: 2007-12-8 19:37
深山红叶里的DOS工具箱里不就有关机文件的吗?
作者: lvyanan    时间: 2007-12-8 20:15
三楼有很强的汇编功底,佩服!
作者: 紫狐    时间: 2007-12-10 10:07
一些主板设计上不支持DOS下关机的就无法用软件关机,我知道的ASROCK就不支持DOS下软件关机。
作者: 玄天    时间: 2008-2-3 17:15
shutdown /s 关机
shutdown /r 重启

Shutdown.rar

489 Bytes, 下载次数: 183, 下载积分: 无忧币 -2


作者: lauey    时间: 2008-5-2 17:09
貌似又有人把Windows命令提示符误会成DOS了,

楼主没有错,

3楼的源码可能是作者的演示码,并不能编译,

至于以上的这些个都不能关机,是因为这些个软件版本太旧不支持新的电脑,

用这个小软件FDAPM.COM就可以搞定,运行参数FDAPM POWEROFF,

这个小软件目前知道的人简直太少了,我也是在E网上淘到的。

附件怎么传?
作者: netwinxp    时间: 2008-5-2 19:53
原帖由 lauey 于 2008-5-2 17:09 发表
貌似又有人把Windows命令提示符误会成DOS了,

楼主没有错,

3楼的源码可能是作者的演示码,并不能编译,

至于以上的这些个都不能关机,是因为这些个软件版本太旧不支持新的电脑,

用这个小软件 ...

不就一种调用APM,一种直接I/O两种方式?难道你还发现第三种。至于那段不能编译是你的汇编器用的不对(程序前面部分就有说明)。

[ 本帖最后由 netwinxp 于 2008-5-2 07:56 PM 编辑 ]
作者: lauey    时间: 2008-5-2 21:14
楼上你好。

源码确实可以编译,编译器是Magic Assembler (v1.12),

编译后得到shutdown.com,

但源码中有一个地方是“?”,必须改成alt+254&alt+32,才能得到和原版完全一样的shutdown.com,

这是因为源码在html网页中出现一个字符解码bug,

现在电脑是acpi,所以用apm是不行的,必须用acpi的电源管理。

附件我一并传上来,OK。

[ 本帖最后由 lauey 于 2008-5-2 09:19 PM 编辑 ]

dosshut.rar

26.14 KB, 下载次数: 183, 下载积分: 无忧币 -2


作者: 玄天    时间: 2008-5-2 22:56
用中国dos联盟msdos7.10中的shutdown.com
作者: netwinxp    时间: 2008-5-2 23:19
好像是往CF9写3,不太记得了,不过要先判断支不支持ACPI。有空我自己写一个,那个代码确实太老了。

[ 本帖最后由 netwinxp 于 2008-5-2 11:22 PM 编辑 ]
作者: lauey    时间: 2008-5-7 14:21
期待acpi版的shutdown.dos.asm

虽然正真的高手都知道直接关电源(精确点是指220V插座开关)的才是高手,但是平常人会觉得你太粗暴,怎么会放心呢?

顺便提一下:
1、DOS下按电源键(一按马上松掉),电脑可能会变成黑屏,但再按就恢复了,这是因为现在电脑在BIOS级别就支持DOS的休眠了
2、Windows下按电源键(一按马上松掉),会正常的关机,就像键盘上的“Power”一样,和在电脑中点:开始—》关机—》关机,一样的都是正常关机
3、市场上的很多培训教材第一章往往会讲什么电脑基础知识,其实全部都是抄的以前的旧教材,错误很多,不要”尽信书“,家庭用户更是不用看,其中就有”按电源键是非法关机“的话,我看了很多本都是一样,都有这些话,不知道是不是抄的以前的某个版本
4、BIOS设置中有个关于关机按钮的设置(windows下也有相关设置),通常都有”立即关机“,”4秒关机“,”只是休眠“等选项,有空可以自己详细研究下
作者: 紫狐    时间: 2008-5-9 15:20
13楼推荐的FDAPM.COM就支持acpi。
作者: netwinxp    时间: 2008-5-9 18:47
原帖由 紫狐 于 2008-5-9 15:20 发表
13楼推荐的FDAPM.COM就支持acpi。

是的,FDAPM确实支持ACPI,最好使用2007-06-27版本,可以看出作者在2005年已经支持ACPI了。国内直到Vista加入SLIC段才开始研究ACPI,甚至CSDN还在说只有windows才能用ACPI,真是令人汗颜。
最近在研究ACPI,略有所得...
其实DOS可以从F000段搜索"RSD PTR "字串,然后在其后面+10H处取得RSDT的DWORD指针,最后通过段选择子取得RSDT数据。
另外现在的ACPI加入SLIC,然后修改OEMID但却没有修改校验和@_@
========目前已经完全搞清楚的字段======
1、RSDP(在F000段),长度20字节
字段    长度 位置 值    描述
标志    8   00H 'RSD PTR ' 标志串
校验和   1   08H xxH    和其他所有字节之和为0
OEM ID   6  09H 'xxxxxx'
ACPI版本  1  0FH  ?     0为ACPI 1.0
RSDT指针  4  10H ....    从这里可以取得RSDT表的地址,通常在物理地址3FFFxxxx
2、RSDT
字段    长度 位置 值    描述
标志    4   00H 'RSDT'   标志串
长度    4   04H  xxH
版本    1   08H ?
校验和   1   09H xxH    算法和上面的一样
OEM ID    6   0AH 'xxxxxx'
OEM表ID  8   10H 'xxxxxxxx'
OEM版本  4   18H 'x?.?'
创建者ID  4   1CH 'xxxx'
创建者版本 4   20H ????
FADT指针   4   24H ....    可能不一定是这个表,从这后面是一堆指针,具体对应哪个表要看表的标志串,总共多少项,看长度(04H)...

[ 本帖最后由 netwinxp 于 2008-5-9 07:27 PM 编辑 ]
作者: pear4093    时间: 2008-5-9 20:17
FDAPM就支持ACPI,我上传一个FDAPM.COM和shutdown.com 这两个软件,有需要的下
DOS关机软件.rar (7.68 KB, 下载次数: 225)
作者: vincenho    时间: 3 天前





欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3