中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-01 19:40
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [求助]QB,如何知道程序是在纯DOS下还是在WINDOWS下运行 查看 1,320 回复 7
楼 主 [求助]QB,如何知道程序是在纯DOS下还是在WINDOWS下运行 发表于 2006-11-23 09:24 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
积分 36
发帖 15
注册 2006-02-18 20:42
20年会员
UID 50588
状态 离线
 如题,希望朋友能够提供示范程序. 先谢谢大家了。
2 发表于 2006-11-24 06:27 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
积分 36
发帖 15
注册 2006-02-18 20:42
20年会员
UID 50588
状态 离线
我记得像GHOST,PQ这类软件在WINDOWS下运行都会有不能在WINDOWS下运行的提示,那编程的时候是如何知道程序是不是在纯DOS下运行呢?是不是要用到汇编啊?
3 发表于 2006-11-24 08:59 ·  中国 陕西 西安 电信
新手上路
积分 6
发帖 2
注册 2006-11-24 08:26
19年会员
UID 71558
性别 男
状态 离线
那要看你是在什么样的环境中编程了吧?EXE文件的头部有个标识符,告诉操作系统,这个程序的运行环境。可以用文本编辑器打开exe看一看。dos下的EXE文件头部有这样的标识:MZ,然后后面有这样的句子"This program cannot be run in DOS mod"
这就是PE文件的头部吧。
4 发表于 2006-11-24 22:55 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
积分 36
发帖 15
注册 2006-02-18 20:42
20年会员
UID 50588
状态 离线
楼上的朋友非常热心,先谢过了。 不过我想要得到的信息正好相反,我要写一个纯DOS程序,使它能保证是在纯DOS环境下而不是WINDOWS的NTVDM中运行。
5 发表于 2006-11-24 23:34 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
积分 36
发帖 15
注册 2006-02-18 20:42
20年会员
UID 50588
状态 离线
自己找到答案了.

当 Windows 运行程序, 它提供名为 " windir " 环境变量, 指定是安装 Windows 目录的完整路径。 注意此环境变量名称拼写是否用小写字母。

如果是在 MicrosoftWindows, 运行 Basic 程序 ENVIRON$("windir") 表达式返回一个非空字符串, 否则返回空字符串。
回到顶端

示例代码
IF ENVIRON$("windir") <> "" THEN
PRINT "running under Windows"
ELSE
PRINT "not running under Windows"
END IF
6 发表于 2006-11-28 00:55 ·  中国 江苏 苏州 电信
中级用户
★★
积分 298
发帖 118
注册 2006-03-01 13:30
20年会员
UID 51161
状态 离线
Good!
7 发表于 2006-11-28 00:59 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
学习!

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
8 发表于 2006-11-29 02:22 ·  IANA 本机地址
初级用户
积分 54
发帖 25
注册 2006-10-31 03:27
19年会员
UID 68958
性别 男
来自 疯人院
状态 离线
google 到鬼方法,smsw 由于还是 privileged instruction,感觉上由 emulator 决定给不给读

http://www.osdev.org/osfaq2/index.php/What%20is%20v8086%20mode%3F

http://www.sandpile.org/post/msgs/20000745.htm


How do i detect v8086 ?

EFLAGS.VM is NEVER pushed onto the stack if the V86 task uses PUSHFD. You should check if CR0.PE=1 and then assume it's V86 if that bit is set.

detect_v86:
smsw ax
and eax,1 ;CR0.PE bit
ret

论坛跳转: