DOS API
此条目翻译自其他语言维基百科,需要相关领域的编者协助校对翻译。 |
DOS API最初是86-DOS中的应用程序接口(API),并也被MS-DOS/PC-DOS及其他DOS兼容操作系统使用。大多数对DOS API的调用是使用中断21h(INT 21h)。在调用INT 21h时,在AH 寄存器中带有子函数号,其他寄存器中带有其他参数,从而调用各个DOS服务。DOS服务包括键盘输入、视频输入、磁碟文件访问、执行程序、内存分配及其他事务。在1980年代后期,围绕DOS保护模式接口(DPMI)的DOS扩展器允许程序在16位或32位的保护模式下运行,并仍可访问DOS API。
DOS API的历史
编辑在86-DOS和MS-DOS 1.0中的原始DOS API在设计上与CP/M兼容。文件访问使用文件控制块(FCB)。在MS-DOS 2.0中的DOS API大大扩展了数个Unix概念,包括使用文件描述符、分层目录和设备I/O控制的文件访问。[1]DOS 3.1中添加了网络重定向器的支持。MS-DOS 3.31中,INT 25h/26h函数被增强以支持大于32MB的硬盘。MS-DOS 5添加了使用高端内存块(UMB)的支持。在MS-DOS 5之后,连续、独立发布的DOS没有改变DOS API。
DOS API与Windows
编辑在Windows 9x,DOS通常作为引导加载程序加载受保护模式的操作系统和图形外壳。DOS通常从一个DOS虚拟机(VDM)访问,但也可以不加载Windows而直接启动到实模式的MS-DOS 7.0。DOS API已增强国际化和长文件名支持,尽管长文件名支持仅在VDM中可用。随着Windows 95 OSR2,DOS被更新到7.1,添加了FAT32及对其DOS API的支持。Windows 98和Windows Me也实现了MS-DOS 7.1 API,尽管Windows ME本身自称为MS-DOS 8.0。
Windows NT及基于它的系统(例如Windows XP和Windows Vista)不是基于MS-DOS,但也可使用一个虚拟机——NTVDM处理DOS API。NTVDM将DOS程序在虚拟8086模式(Intel 80386及更高处理器上可在保护模式下进行实模式的仿真)模式下运行。NTVDM支持DOS 5.0 API。面向Linux的DOSEMU使用类似的方法。
DOS使用的中断向量
编辑中断向量 | 描述 | 版本 | 备注 |
---|---|---|---|
20h
|
终止程序并检查空白空间 | 1.0+ | 在DOS内核中实现 |
21h
|
Main DOS API | 1.0+ | 在DOS内核中实现 |
22h
|
程序终止地址 | 1.0+ | 返回调用程序中的地址 |
23h
|
Control-C处理器地址 | 1.0+ | 默认处理程序在命令外壳(通常是COMMAND.COM) |
24h
|
严重错误处理器地址 | 1.0+ | 默认处理程序在命令外壳(通常是COMMAND.COM) |
25h
|
绝对磁碟读取 | 1.0+ | 在DOS内核中实现,在DOS 3.31中增强,最多支持2 GB分区 |
26h
|
绝对磁碟写入 | 1.0+ | 在DOS内核中实现,在DOS 3.31中增强,最多支持2 GB分区 |
27h
|
终止并驻留 | 1.0+ | DOS 1.0中在COMMAND.COM中实现,DOS 2.0+中则在DOS内核 |
28h
|
Idle callout | 2.0+ | 等待输入时由DOS内核调用 |
29h
|
快速控制台输出 | 2.0+ | 由内建的控制台设备驱动程式或替换驱动程式(如ANSI.SYS)实现 |
2Ah
|
网络和关键部分 | 3.0+ | 由DOS内核调用,与网络软件交互 |
2Bh
|
未使用 | ||
2Ch
|
未使用 | ||
2Dh
|
未使用 | ||
2Eh
|
Reload transient | 2.0+ | 在COMMAND.COM中实现 |
2Fh
|
Multiplex | 3.0+ | 在DOS内核和各种程序(PRINT、MSCDEX、DOSKEY、APPEND等)中实现,取决于子功能号码 |
DOS INT 21h服务
编辑AH
|
描述 | 版本 |
---|---|---|
00h
|
程序终止 | 1.0+ |
01h
|
字符输入 | 1.0+ |
02h
|
字符输出 | 1.0+ |
03h
|
辅助输入 | 1.0+ |
04h
|
辅助输出 | 1.0+ |
05h
|
打印机输出 | 1.0+ |
06h
|
直接控制台I/O | 1.0+ |
07h
|
无回显直接控制台输入 | 1.0+ |
08h
|
无回显控制台输入 | 1.0+ |
09h
|
显示字符串 | 1.0+ |
0Ah
|
缓冲的键盘输入 | 1.0+ |
0Bh
|
获取输入状态 | 1.0+ |
0Ch
|
刷新输入缓冲区和输入 | 1.0+ |
0Dh
|
磁碟重置 | 1.0+ |
0Eh
|
设置默认驱动器 | 1.0+ |
0Fh
|
打开文件 | 1.0+ |
10h
|
关闭文件 | 1.0+ |
11h
|
查找第一个文件 | 1.0+ |
12h
|
查找下一个文件 | 1.0+ |
13h
|
删除文件 | 1.0+ |
14h
|
顺序读 | 1.0+ |
15h
|
顺序写 | 1.0+ |
16h
|
创建或截断文件 | 1.0+ |
17h
|
重命名文件 | 1.0+ |
18h
|
保留 | 1.0+ |
19h
|
获取默认驱动器 | 1.0+ |
1Ah
|
设置磁碟传输地址 | 1.0+ |
1Bh
|
获取默认驱动器的分配资讯 | 1.0+ |
1Ch
|
获取指定驱动器的分配资讯 | 1.0+ |
1Dh
|
保留 | 1.0+ |
1Eh
|
保留 | 1.0+ |
1Fh
|
获取默认驱动器的磁碟参数块 | 1.0+ |
20h
|
保留 | 1.0+ |
21h
|
随机读取 | 1.0+ |
22h
|
随机写入 | 1.0+ |
23h
|
获取记录中的文件大小 | 1.0+ |
24h
|
设置随机记录号 | 1.0+ |
25h
|
设置中断向量 | 1.0+ |
26h
|
创建PSP | 1.0+ |
27h
|
随机块读取 | 1.0+ |
28h
|
随机块写入 | 1.0+ |
29h
|
解析文件名 | 1.0+ |
2Ah
|
获取日期 | 1.0+ |
2Bh
|
设置日期 | 1.0+ |
2Ch
|
获取时间 | 1.0+ |
2Dh
|
设置时间 | 1.0+ |
2Eh
|
设置验证标志 | 1.0+ |
2Fh
|
获取磁碟传输地址 | 2.0+ |
30h
|
获取DOS版本 | 2.0+ |
31h
|
终止并驻留 | 2.0+ |
32h
|
获取指定驱动器的磁碟参数块 | 2.0+ |
33h
|
获取或设置Ctrl-Break | 2.0+ |
34h
|
获取InDOS标志指针 | 2.0+ |
35h
|
获取中断向量 | 2.0+ |
36h
|
获取可用磁碟空间 | 2.0+ |
37h
|
获取或设置开关字符 | 2.0+ |
38h
|
获取或设置国家/地区资讯 | 2.0+ |
39h
|
创建子目录 | 2.0+ |
3Ah
|
移除子目录 | 2.0+ |
3Bh
|
更改当前目录 | 2.0+ |
3Ch
|
创建或截断文件 | 2.0+ |
3Dh
|
打开文件 | 2.0+ |
3Eh
|
关闭文件 | 2.0+ |
3Fh
|
读取文件或设备 | 2.0+ |
40h
|
写入文件或设备 | 2.0+ |
41h
|
删除文件 | 2.0+ |
42h
|
移动文件指针 | 2.0+ |
43h
|
获取或设置文件属性 | 2.0+ |
44h
|
设备的I/O控制 | 2.0+ |
45h
|
复制句柄 | 2.0+ |
46h
|
重定向句柄 | 2.0+ |
47h
|
获取当前目录 | 2.0+ |
48h
|
分配内存 | 2.0+ |
49h
|
释放内存 | 2.0+ |
4Ah
|
重新分配内存 | 2.0+ |
4Bh
|
执行程序 | 2.0+ |
4Ch
|
用指定返回代码终止 | 2.0+ |
4Dh
|
获取程序返回代码 | 2.0+ |
4Eh
|
查找第一个文件 | 2.0+ |
4Fh
|
查找下一个文件 | 2.0+ |
50h
|
设置当前PSP | 2.0+ |
51h
|
获取当前PSP | 2.0+ |
52h
|
获取DOS内部指针(SYSVARS) | 2.0+ |
53h
|
创建磁碟参数块 | 2.0+ |
54h
|
获取验证标志 | 2.0+ |
55h
|
创建程序PSP | 2.0+ |
56h
|
重命名文件 | 2.0+ |
57h
|
获取或设置文件的日期和时间 | 2.0+ |
58h
|
获取或设置分配策略 | 2.11+ |
59h
|
获取扩展错误资讯 | 3.0+ |
5Ah
|
创建唯一文件 | 3.0+ |
5Bh
|
创建新文件 | 3.0+ |
5Ch
|
锁定或解锁文件 | 3.0+ |
5Dh
|
文件共享功能 | 3.0+ |
5Eh
|
网络功能 | 3.0+ |
5Fh
|
网络重定向功能 | 3.0+ |
60h
|
限定文件名 | 3.0+ |
61h
|
保留 | 3.0+ |
62h
|
获取当前PSP | 3.0+ |
63h
|
获取DBCS引导字节表指针 | 3.0+ |
64h
|
设置等待外部事件标志 | 3.2+ |
65h
|
获取扩展的国家资讯 | 3.3+ |
66h
|
获取或设置代码页 | 3.3+ |
67h
|
设置句柄数 | 3.3+ |
68h
|
提交文件 | 3.3+ |
69h
|
获取或设置ID | 4.0+ |
6Ah
|
提交文件 | 4.0+ |
6Bh
|
保留 | 4.0+ |
6Ch
|
扩展的打开/创建文件 | 4.0+ |
支持MS-DOS API的操作系统
编辑- MS-DOS - 最广泛的化身
- PC DOS - MS-DOS的IBM OEM版本
- DR-DOS - 数字研究DOS系列,包括DR-DOS、DR-DOS, DR-DOS等。 Template:Needfix
- PTS-DOS - PhysTechSoft和Paragon DOS克隆,包括S/DOS
- ROM-DOS - Datalight ROM DOS版本
- FreeDOS - 自由、开源的DOS克隆
- ReactOS(IA-32和X86-64版本)
- Windows 95 - 包含MS-DOS 7.0
- Windows 98 - 包含MS-DOS 7.1
- Windows 98 - 包含MS-DOS 7.1
- Windows Me - 包含MS-DOS 8.0
- Windows NT(64位版本外的所有版本)
支持MS-DOS API的程序
编辑- Concurrent CP/M-86(仅3.1)的PCMODE – 基于CP/M-86的Digital Research操作系统,使用可选的PC DOS模拟器
- Concurrent DOS – 内建PC DOS模拟器的Digital Research CDOS家族
- DOS Plus – Concurrent PC DOS 4.1–5.0的一个简化的单用户变种
- 多用户DOS – Digital Research/Novell MDOS家族,包含Datapac System Manager、IMS REAL/32等。
- 用于Windows NT的NTVDM.EXE
- 用于Linux的DOSEMU
- DOSBox
参见
编辑参考资料
编辑- ^ Ray Duncan. Advanced MS-DOS Programming: The Microsoft Guide for Assembly Language and C Programmers. Microsoft Press. 1988. ISBN 0914845772.
- The x86 Interrupt List(页面存档备份,存于互联网档案馆) (a.k.a. RBIL, Ralf Brown's Interrupt List)
- ctyme.com - INT Calls by function(页面存档备份,存于互联网档案馆)
- wustl.edu - Description of MS-DOS services
- Microsoft MS-DOS Programmer's Reference - The Official Technical Reference to MS-DOS, Microsoft Press, 1993 ISBN 1556155468
- The MS-DOS Encyclopedia, Microsoft Press, 1988, ISBN 1556151748
- Ray Duncan. Advanced MS-DOS Programming: The Microsoft Guide for Assembly Language and C Programmers. Microsoft Press. 1988. ISBN 0914845772.
- The Programmer's PC Sourcebook by Thom Hogan, Microsoft Press, 1991 ISBN 155615321X
- The New Peter Norton Programmer's Guide to the IBM PC & PS/2 by Peter Norton and Richard Wilton, Microsoft Press, 1987 ISBN 1-55615-131-4.
- IBM PC DOS 7 Technical Update
- Caldera, Inc. (1997). OpenDOS Developer's Reference Series — OpenDOS Programmer's Guide — System and Programmer's Guide. Printed in the UK, August 1997. Caldera Part No. 200-DOPG-003 ([1]).