无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 9939|回复: 20
打印 上一主题 下一主题

dos中一个关机软件的问题

[复制链接]
跳转到指定楼层
1#
发表于 2007-10-19 10:20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了个软盘镜像,里面集成了如ghost之类一些应用软件,在虚拟机下测试完全正常,但在真实机器中发现一个问题:运行D.COM这个关机小软件后机器并不关机,跟没运行一样。
不解。特来这里求解。
2#
发表于 2007-10-21 23:34:56 | 只看该作者
DOS下没有关机软件。
回复

使用道具 举报

3#
发表于 2007-10-22 02:42:10 | 只看该作者
有关机软件,但需要支持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 编辑 ]
回复

使用道具 举报

4#
发表于 2007-10-22 10:51:11 | 只看该作者
一键GHOST和超级级急救盘 里提供了关机程序。
func -s 或
off.com

无法关机的原因可能是与部分台式机或笔记本不兼容,没办法。
回复

使用道具 举报

5#
 楼主| 发表于 2007-10-22 23:28:47 | 只看该作者
谢谢各位大大的解答!
回复

使用道具 举报

6#
发表于 2007-10-23 07:30:49 | 只看该作者
原帖由 taoty 于 2007-10-21 11:34 PM 发表
DOS下没有关机软件。

应该是ms-dos中没有关机命令。第三方工具是有的。呵呵。shutdown.com等。
回复

使用道具 举报

7#
发表于 2007-10-28 14:13:42 | 只看该作者
关机软件吗?,可以看看别人的工具盘拷一个嘛,,,工具盘可以自己DIY,但软件可以拿别人的嘛!!!!
回复

使用道具 举报

8#
发表于 2007-12-8 19:37:53 | 只看该作者
深山红叶里的DOS工具箱里不就有关机文件的吗?
回复

使用道具 举报

9#
发表于 2007-12-8 20:15:54 | 只看该作者
三楼有很强的汇编功底,佩服!
回复

使用道具 举报

10#
发表于 2007-12-10 10:07:07 | 只看该作者
一些主板设计上不支持DOS下关机的就无法用软件关机,我知道的ASROCK就不支持DOS下软件关机。
回复

使用道具 举报

11#
发表于 2008-2-3 17:15:50 | 只看该作者
shutdown /s 关机
shutdown /r 重启

Shutdown.rar

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

回复

使用道具 举报

12#
发表于 2008-5-2 17:09:34 | 只看该作者
貌似又有人把Windows命令提示符误会成DOS了,

楼主没有错,

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

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

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

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

附件怎么传?
回复

使用道具 举报

13#
发表于 2008-5-2 19:53:23 | 只看该作者
原帖由 lauey 于 2008-5-2 17:09 发表
貌似又有人把Windows命令提示符误会成DOS了,

楼主没有错,

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

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

用这个小软件 ...

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

[ 本帖最后由 netwinxp 于 2008-5-2 07:56 PM 编辑 ]
回复

使用道具 举报

14#
发表于 2008-5-2 21:14:51 | 只看该作者
楼上你好。

源码确实可以编译,编译器是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

回复

使用道具 举报

15#
发表于 2008-5-2 22:56:15 | 只看该作者
用中国dos联盟msdos7.10中的shutdown.com
回复

使用道具 举报

16#
发表于 2008-5-2 23:19:29 | 只看该作者
好像是往CF9写3,不太记得了,不过要先判断支不支持ACPI。有空我自己写一个,那个代码确实太老了。

[ 本帖最后由 netwinxp 于 2008-5-2 11:22 PM 编辑 ]
回复

使用道具 举报

17#
发表于 2008-5-7 14:21:53 | 只看该作者
期待acpi版的shutdown.dos.asm

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

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

使用道具 举报

18#
发表于 2008-5-9 15:20:31 | 只看该作者
13楼推荐的FDAPM.COM就支持acpi。
回复

使用道具 举报

19#
发表于 2008-5-9 18:47:30 | 只看该作者
原帖由 紫狐 于 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 编辑 ]
回复

使用道具 举报

20#
发表于 2008-5-9 20:17:11 | 只看该作者
FDAPM就支持ACPI,我上传一个FDAPM.COM和shutdown.com 这两个软件,有需要的下
DOS关机软件.rar (7.68 KB, 下载次数: 225)
回复

使用道具 举报

21#
发表于 6 天前 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-25 09:25

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表