DOS程序员手册(十三)

744页

在DPMI 1.0下,系统会修改并重新装载所有含选择符的段寄存器,并且将所有

含有要释放的选择符的寄存器清空为0。

客户程序绝不能修改或释放该功能分配的任何描述符。Int 31h、功能0101h

会自动地解除对它们的分配。

系统

Int 31h     功能0200h                          DPMI版本0.9

            获取实模式中断向量

返回当前虚拟机器的实模式中断向量的内容

调用寄存器: AX            0200h

              BL          中断号

返回寄存器:进位标志清除

              CX:DX    实模式中断向量的段:偏移值

注释:通过CX返回的值是实模式段地址,而不是一个选择符。试图把这个值

放入段寄存器会引起通用的保护错误(GP错)。

系统

Int 31h       功能0201h                        DPMI版本0.9

              设置实模式中断向量

为指定的中断设置当前虚拟机器的实模式中断向量

调用寄存器: AX            0201h

              BL          中断号

              CX:DX     实模式中断处理程序的段:偏移值

返回寄存器:进位标志清除

注释:通过CX传送的地址必须为实模式段地址,而不能是选择符。同时,处

理程序必须常驻在DOS内存中,或者客户程序必须分配一个实模式回调地

址。

如果将要挂接的中断是一个硬件中断,则必须锁定由处理程序使用的内存。

系统

Int 31h       功能0202h                        DPMI版本0.9

              获取处理器异常处理程序向量

返回与指定异常号相对应的当前客户保护模式异常处理程序的地址

745页

调用寄存器: AX                0202h

                BL            异常号(00h-1Fh)

返回寄存器:如果成功

                进位标志清除

                CX:(E)DX    异常处理程序的选择符:偏移值

                如果未成功

                进位标志置位

                AX            8021h,无效值

注释:在DPMI 1.0中,该功能作为向下兼容功能而得到支持;并且,DPMI

1.0客户必须使用Int 31h、功能0210h和0211h。在这里,CX的值为选择符,

而不是段地址。同时,对于32位的客户程序来说,该功能将通过EDX返回一

个32位的偏移值。

系统

Int 31h         功能0203h                              DPMI版本0.9

                设置处理器异常处理程序向量

设置用于处理器CPU异常或出错处理程序的地址

调用寄存器: AX                0203h

              BL              异常号(00h-1Fh)

              CX:(E)DX   异常处理程序的选择符:偏移值

返回寄存器:如果成功

              进位标志清除

                如果未成功

              进位标志置位

              AX              出错代码

                              8021h,无效值

                              8022h,无效选择符

注释: CX的值必须是有效的保护模式代码选择符,而不是段地址。 32位的客

户程序必须通过EDX提供一个32位的偏移值。

      DPMI 1.0必须避免使用这种用来提供向后兼容的功能,并应使用Int

31、功能0212和0213h来代替它。

系统

Int 31h         功能0204h                            DPMI版本0.9

                获取保护模式中断向量

746页

返回一个用于指定中断的当前保护模式中断处理程序的地址

调用寄存器: AX              0204h

              BL            中断号

返回寄存器:进位标志清除

              CX:(E)DX  中断处理程序的选择符:偏移值

注释: CX的值为有效的保护模式选择符,而不是实模式的段。对于32位客

户程序来说,该功能会通过EDX返回一个32位的偏移值。

系统

Int 31h       功能0205h                              DPMI版本0.9

              设置保护模式中断向量

设置一个保护模式中断处理程序(用于处理指定地址片的特定中断)的地址

调用寄存器: AX            0205h

            BL          中断号

            CX:(E)DX  中断处理程序的选择符:偏移值

返回寄存器:如果成功

            进位标志清除

            如果未成功

            进位标志置位

            AX            出错代码

                          8022h,无效选择符

注释:通过CX传递的值必须是有效的保护模式选择符,而不是实模式的段

地址。同时,32位的客户程序必须通过EDX传送一个32位的偏移值。

系统

Int 31h       功能0210h                            DPMI版本1.0

              获取扩展处理器异常处理程序向量(保护模式)

返回用于处理指定保护模式异常情况的客户保护模式处理程序的地址

调用寄存器: AX            0210h

            BL            异常号(00h-1Fh)

返回寄存器:如果成功

            进位标志清除

            CX:(E)DX   异常处理程序的选择符:偏移值

            如果未成功

            进位标志置位

747页

                AX              出错代码

                                8021h,无效值

注释: DPMI 1.0客户必须使用该功能,而不能使用Int 31h,功能0202h。

系统

Int 31h         功能0211h                            DPMI版本1.0

                获取扩展处理器异常处理程序向量(实模式)

返回用于处理指定实模式异常的客户保护模式处理程序的地址

调用寄存器: AX              0211h

              BL            异常号(00h-1Fh)

返回寄存器:如果成功

              进位标志清除

              CX:(E)DX  异常处理程序的选择符:偏移值

              如果未成功

              进位标志置位

              AX              出错代码

                            8021h,无效值

注释: CX:(E)DX是一个选择符:偏移值对,而不是一个段:偏移值对。该

功能返回的地址是在实模式处理程序实现了把模式切换到保护模式之后,在

保护模式中将接收控制权的功能的地址。

系统

Int 31h         功能0212h                            DPMI版本1.0

                设置扩展处理器异常处理程序向量(保护模式)

设置用于处理特定保护模式异常情况的客户保护模式处理程序的地址

调用寄存器: AX              0212h

              BL            异常号(00h-1Fh)

              CX:(E)DX 异常处理程序的选择符:偏移值

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX            出错代码

                            8021h,无效值

                            8022h,无效选择符

注释: DPMI 1.0客户程序必须使用该功能来代替Int 31h、功能0203h。

 

748页

系统

Int 31h         功能0213h                              DPMI版本1.0

                设置扩展处理器异常处理程序向量(实模式)

设置用于处理指定保护模式异常的客户保护模式处理程序的地址

调用寄存器: AX              0213h

              BL            异常号(00h-1Fh)

              Cx:(E)DX  异常处理程序的选择符:偏移值

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX            出错代码

                            8021h,无效值

                            8022h,无效选择符

注释:该功能返回的地址是一种保护模式处理程序的地址,实模式异常处理程

序在实现了模式切换之后,将把控制权传送给这一保护模式处理程序。

系统

Int 31h       功能0300h                              DPMI版本0.9

              模拟实模式中断

模拟在实模式下的中断

调用寄存器: AX              0300h

              BL            中断号

              BX            标志(全部为0)

              CX            将从保护模式堆栈复制到实模式堆栈的字数

              ES:(E)DI 实模式寄存器数据结构的选择符:偏移值

返回寄存器:如果成功

              进位标志清除

              ES:(E)DI    被修改的实模式寄存器数据结构的选择符:

                            偏移值

              如果未成功

              进位标志置位

              AX            出错代码

                            8012h,线性内存不能用

                            8013h,物理内存不能用

                            8014h,备用存储不能用

749页

                                8021h,无效值

    注释:该功能可把控制权传送给实模式中断向量指定的实模式中断处理程

    序。cs:PI值被忽略。而SS:IP则通常由实模式处理程序使用。除非系统已

    将它置为0;在这种情况下,DPMI宿主会提供一个实模式堆栈。同时,系统还

    将指定标志压到实模式中断处理程序的IRET框架上;并清除中断标志和跟

    踪标志,此外,段寄存器值必须是实模式段地址,而不能是选择符。并且系统

    不要求16位的宿主程序去传送32位寄存器或FS以及GS寄存器的高位字,

    即使该程序是在80386机器上运行。在从中断处理程序中返回时,数据结构将

    保存由实模式中断处理程序返回的值。

    实模式寄存器的结构设置如下:

偏移值          内容

0000h                 (E)DI

0004h                 (E)SI

0008h                 (E)BP

000Ch                 保留;必须为0

0010h                   (E)Bx

0014h                   (E)Dx

0018h                   (E)Cx

001Ch                   (E)Ax

0020h                 CPU标志

0022h                     ES

0024h                     DS

0026h                     FS

0028h                     GS

002Ah                      IP(被忽略)

002Ch                      CS(被忽略)

002Eh                     SP

0030h                     SS

系统

Int 31h       功能0301h                          DPMI版本0.9

              通过远返回框架调用实模式过程

模拟一个对实模式过程的远调用

调用寄存器: AX              0301h

              BH            标志(必须为0)

              CX            将从保护模式堆栈中复制到实模式堆栈的

                            字数

返回寄存器:如果成功

              进位标志清除

              ES:(E)DI   被修改的实模式寄存器数据结构的

                            选择符:偏移值

              如果未成功

              进位标志置位

              AX            出错代码

                            8012h,线性内存不能用

 

750页

                                8013h,物理内存不能用

                                8014h,备用存储器不能用

                                8021h,无效值

    注释:该功能可把控制权传送给通过CS:IP值指定的实模式过程。 SS:IP

    值通常由实模式处理程序使用。除非系统已将它置为0;在这种情况下,DPMI

    宿主会提供一个实模式堆栈。段寄存器值必须为实模式段地址;而不能是选择

    符。同时,该功能不要求16位的宿主程序去传送32位寄存器或FS和GS寄

    存器高位字,即使该程序是在80386机器上运行。在从中断处理程序中返回

    时,数据结构将保存由实模式中断处理程序返回的值。

    实模式寄存器的结构设置如下:

偏移值            内容

0000h                     (E)DI

0004h                     (E)SI

0008h                     (E)BP

000Ch                     保留;必须为0

0010h                     (E)Bx

0014h                     (E)Dx

0018h                     (E)Cx

001Ch                     (E)Ax

0020h                     CPU标志

0022h                     ES

0024h                     DS

0026h                     FS

0028h                     GS

002Ah                     IP

002Ch                     CS

002Eh                     SP

0030h                     SS

该进程必须通过执行RETF(远返回)指令来返回。

系统

Int 31h         功能0302h                                DPMI版本0.9

                通过IRET框架访问实模式过程

通过将标志压入堆栈来模拟对实模式过程的远调用

调用寄存器: AX              0302h

              BH            标志(必须为0)

              CX            将从保护模式堆栈中复制到实模式堆栈的字

                            数

              ES:(E)DI   实模式寄存器数据结构的选择符:偏移值

返回寄存器:如果成功

              进位标志清除

              ES:(E)DI   已被修改的实模式寄存器数据结构的

                          选择符:偏移值

              如果未成功

751页

                进位标志置位

                AX            出错代码

                              8012h,线性内存不能用

                              8013h,物理内存不能用

                              8014h,备用存储不能用

                              8021h,无效值

    注释:该功能可把控制权传送给通过CS:PI值指定的实模式进程。通常情

况下,SS:IP值通常由实模式处理程序使用。除非系统已将它置为0;在这种

情况下,DPMI宿主会提供一个实模式堆栈,同时,系统还通过清除中断标志

和跟踪标志把这些标值压到实模式堆栈的IRET框架内。段寄存器值必须为

    实模式段地址;而不能是选择符。同时,该功能不要求16位的宿主程序去传送

    32位寄存器或FS和GS寄存器高位字,即使该程序是在80386机器上运行。

    在从中断处理程序中返回时,数据结构将保存由实模式中断处理程序返回的

值。

    实模式寄存器的结构设置如下:

偏移值            内容

0000h                   (E)DI

0004h                   (E)SI

0008h                   (E)BP

000Ch                   保留;必须为0

0010h                   (E)BX

0014h                   (E)DX

0018h                   (E)CX

001Ch                   (E)AX

0020h                   CPU标志

0022h                     ES

0024h                     DS

0026h                     FS

0028h                     GS

002Ah                     IP

002Ch                     CS

002Eh                     SP

0030h                     SS

该进程必须通过执行RETF(远返回)或RETF(2)指令才能返回。

系统

Int 31h       功能0303h                              DPMI版本0.9

              分配实模式回调地址

返回一个独一无二的实模式段:偏移值,亦即众所周知的“实模式回调”,它能

从实模式中把控制权传送给保护模式进程。

调用寄存器: AX              0303h

              DS:(E)SI  要调用的保护模式进程的选择符:偏移值

              ES:(E)DI  在调用回调例程时面向所使用的实模式寄存

                            器数据结构的32h字节缓冲区的选择符:偏

 

752页

                              移值

返回寄存器:如果成功

                进位标志清除

               CX:DX     实模式回调的段:偏移值

                如果未成功

                进位标志置位

                AX             8015h,回调不能用

注释:该功能请求DPMI宿主以提供每个客户16个回调地址的最小值。但

是,回调地址是一种限制资源,并且在不需要的时候必须释放它。

在没有进行实际回调用之前,数据结构保存的值无效。

系统

Int 31h         功能0304h                            DPMI版本0.9

                释放实模式回调地址

释放先前由Int 31h、功能0303h分配的回调地址

调用寄存器: AX              0304h

              CX:DX      要释放的实模式回调地址,

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX             8024h,无效回调地址

注释:实模式回调是一种有限系统资源。在不再需要的时候,客户程序必须释

放它。

系统

Int 31h       功能0305h                            DPMI版本0.9

              获取状态保存/恢复地址

返回用于保存当前任务的寄存器的两个例程的地址

调用寄存器: AX              0305h

返回寄存器:进位标志清除

              AX            按字节计算缓冲区大小

              BX:CX       保存/恢复功能的实模式地址

              SI:(E)DI   保存/恢复功能的保护模式地址

注释:实模式地址是例行程序的地址,只能从实模式调用,并且能保存和恢复

保护模式寄存器的状态。保护模式地址也是例行程序的地址,但只能从保护模

753页

式中调用,并且能保存和恢复实模式寄存器的状态。

只能当客户在使用原始切换服务程序时才需要调用这些例程,并且,这些例程

不要求功能0300h、0301h和0302h。

      通过把ES:(E)DI设置为状态保存缓冲区的地址,并通过对适当的例程

发出一个远调用,系统就能把AL设置为0来调用例程,以保存状态;或把AL

设置为1来调用例程以恢复状态,状态保存缓冲区必须至少有AX返回的值

那么大。有时候,DPMI宿主可能不要求保存寄存器;在此情况下,该功能会返

回一个0大小。此时,调用保存/恢复例程仍然是安全的,只是不会有任何结

果。

系统

Int 31h       功能0306h                            DPMI版本0.9

获取原始模式切换地址

返回一个可调用来实现低级模式切换的例程的地址

调用寄存器: AX                0306h

返回寄存器:进位标志清除

              BX:CX         实模式至保护模式切换例程地址

              SI:(E)DI  保护模式向实模式切换例程地址

注释:只能从实模式中调用实模式至保护模式切换例程,并且也只能从保护

模式中调用保护模式至实模式切换例程。模式切换例程是通过用下列参数进

行一次远跳转(FAR JUMP)来输入的:

          AX        新的DS值

          CX        新的ES值

          DX        新的SS值

          (E)BX   新的(E)SP值

          SI        新的CS值

          (E)DI   新的(E)IP值

      在模式切换之后,(E)AX、(E)BX、(E)CX、(E)DX、(E)DI和(E)SI的值

都未得到定义。在80386和80486的CPUs中,系统将FS和GX设置为0。这

样,在调用模式切换时,如果系统禁止了中断,那么DPMI宿主将不会重新允

许它们。客户程序只能等到模式切换之后才能做这一工作。

      在向保护模式切换时,如果指定的选择符值无效,那么系统中就会出现异

常情况。

      如果必须保留寄存器状态,那么此时必须使用那些可通过功能0305h访

问的功能。

754页

系统

Int 31h       功能0400h                          DPMI版本0.9

              获取版本号

返回宿主支持的DPMI规格的版本号以及与宿主功能有关的信息

调用寄存器: AX            0400h

返回寄存器:进位标志清除

              AH           DPMI主版本号(二进制)

              AL           DPMI次版本号(二进制)

              BX          标志

              位0         0=16位实现程序

                          1=32位实现程序

              位1         0=CPU因反射中断返回到虚拟86方式

                          1=CPU因反射中断返回到实地址方式

              位2         0=不支持虚拟内存

                          1=支持虚拟内存

              位3-15     保留

              CL          处理器类型

                                    02h,80286

                                   03h,80386

                                    04h,80486

                  DH                虚拟的主PIC基本中断的当前值

                  DL                虚拟的从属PIC基本中断的当前值

注释:版本0.9将显示出AH=0、AL=5A(90十进制);而版本1.0则会显

示出AH=0、AL=1。

系统

Int 31h       功能0401h                          DPMI版本0.9

              获取DPMI功能

返回DPMI宿主的有关信息

调用寄存器: AX              0401h

返回寄存器:如果成功

              进位标志清除

              AX            功能标志

              位0           0=不支持页被访问/已修改

                            1=支持页被访问/已修改

              位1           0=不支持从异常中再启动的能力

755页

                              1=支持从异常中重新启动的能力

                位2           0=不支持设备映象

                              1=支持设备映象

                位3           0=不支持常规内存映象

                              1=支持常规内存映象

                位4           0=不支持填零请求

                              1=支持填零请求

                位5           0=不支持写保护客户

                              1=支持写保护客户

                位6           0=不支持写保护宿主

                              1=支持写保护宿主

                CX            0

                      DX                    0

                      ES:(E)DI              128字节宿主信息缓冲区的选择符:偏移植

                      如果未成功

                      进位标志置位

      注释:在版本0.9下,该功能总是会失败。

        页被访问/已修改是一种功能,宿主可借此来维护页访问和页已修改位,

    这些位可通过功能0506h来读取,并可通过功能0507h来写入。如果DPMI宿

    主没有提供请求式分页的虚拟内存,那么它必须支持这种功能,否则,该功能

    是任选的。如果该功能存在,它将允许客户读取或写入由宿主维护的虚拟页访

    问和页已修改位。

        异常重启动功能是一种当客户的异常处理程序纠正了导致异常的错误并

    返回时,能在宿主内存核中重新启动查错指令的功能。

        设备映象指明系统是否支持功能0508h。

        常规内存映象指明系统是否支持功能0509h。

        系统如果支持请求填零功能,则意味着系统在创建它保存的所有页时就

    已将它们初始化为0。如果不支持,则表明系统未定义页的内容。

        写保护功能可保护页不让客户写并可防止产生页故障。

        写保护宿主功能可保护页不受宿主写的干扰,并可防止产生页故障。

        宿主信息缓冲区的定义如下:

偏移值        长度        含    义

    0           字节        宿主的主版本号

    1           字节        宿主的次版本号

    2           126字节     标识宿主的零终止字符串

756页

宿主的主、次版本号是OEM特有的版本号,而不是DPMI版本号。

系统

Int 31h       功能0500h                              DPMI版本0.9

              获取自由内存信息

返回可用内存量的有关信息

调用寄存器: AX              0500h

              ES:(E)DI      48字节缓冲区的选择符:偏移值

返回寄存器:进位标志清除

注释:在版本1.0中,功能0508h已取代了这一功能。

48字节缓冲区的定义如下:

偏移值      长度                  内    容

    00h       双字    按字节计算最大的可用自由内存块(如果将分配该内存块并令其

                      继续处于非锁定状态,那么应分配最大的连续线性内存块)。

    04h       双字    按字节计算可分配的最大的未锁定页。这个值是将偏移为0的值

                      除以页大小而得来的。如果来得到支持,则该值为FFFFFFFFh。

    08h       双字    按页计算可分配的最大锁定页(必须分配最大的且是被锁定的

                      页)。如果系统不支持,其值为FFFFFFFFh。

    0Ch       双字    按字节计算的线性地址空间大小,包括已分配的线性空间。如果

                    系统不支持,则其值为FFFFFFFFh。

    10h       双字    未被锁定的总页数,可以将这些页调用出,也可以包括任何自由

                      页。如果系统不支持,则其值为FFFFFFFFh。

    14h       双字    总自由页数(当前未投入使用的物理页数)。如果系统不支持,则

                      其值为FFFFFFFFh。

    18h       双字    总物理页数。其中包括自由页、已锁定页和未锁定页。如果系统不

                      支持,则其值为FFFFFFFFh。

    1Ch       双字    按页计数的自由线性地址空间大小。如果系统不支持,则其值为

                      FFFFFFFFh。

    20h       双字    按页计算的分页/文件分区大小。

    24h       双字    保留;所有字节都被设置为0。

页大小可从功能0604h中获得。

系统

Int 31h       功能0501h                              DPMI版本0.9

              分配内存块

分配线性内存块

调用寄存器: AX                0501h

757页

                BX:CX        按字节计算的块大小;不能为0

返回寄存器:如果成功

                进位标志清除

                BX:CX      已分配的内存块的线性地址

               SI:DI        内存块句柄

                如果未成功

                AX            出错代码

                              8012h,线性内存不能用

                              8013h,物理内存不能用

                              8014h,备用存储器不能用

                              8016h,句柄不能用

                              8021h,无效值

注释:该功能要求块至少是段边界对齐的,并且该功能创建的页面得到了保

存;如果系统支持虚拟内存,这些页面还是未锁定的页面。未锁定的页面可用

功能0600h来锁定。在此过程中,该功能不过问分配描述符的事情;而是由客

户负责分配并初始化那些需要用户来访问内存块的描述符。

      在许多DPMI版本中,分配的内存块为页粒度;即是说,如果所请求分配

的内存块为n页加上1个字节,那么系统就会分配n+1页。因而,在通常情况

下,最好以粒度为单位来分配内存。可调用功能0604h来获取粒度的单位;如

果这一调用失败,则建议使用4K作为粒度单位。

系统

Int 31h         功能0502h                                DPMI版本0.9

                释放内存块

释放通过调用功能0501h或0504h而分配的内存块

调用寄存器: AX              0502h

              SI:DI      内存块句柄

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX             8023h,无效句柄

注释:该功能能够准确地释放被保存的页、未被保存的页和已被映射的页。但

它不释放已映射给内存块的描述符。在释放线性内存块之前,描述符必须是自

由的。

 

758页

系统

Int 31h       功能0503h                              DPMI版本0.9

              重新规定内存块的大小

改变由功能0501h或0504h所分配的内存块大小

调用寄存器: AX              0503h

              BX:CX      按字节计算的新的块大小,不能为0

              SI:DI      内存块句柄

返回寄存器:如果成功

              进位标志清除

              BX:CX      块的新线性地址

              SI:DI      新内存块句柄

              如果未成功

              AX            出错代码

                            8012h,线性内存不能用

                            8013h,物理内存不能用

                            8014h,备用存储器不能用

                            8016h,句柄不能用

                            8021h,无效值

                            8023h,无效句柄

注释:该功能可使旧句柄变得无效,并禁止使用旧的句柄。当增加块的大小

时,系统会保存所创建的页。而在减少块大小时,系统会准确地释放那些未被

使用的页。在此过程中,由客户负责更新可映射新内存块的描述符。

系统

Int 31h       功能0504h                              DPMI版本0.9

              分配线性内存块

分配页边界对齐的线性地址空间块

调用寄存器: AX              0504h

              EBX           所期望的页边界对齐的线性地址(如为0,表

                            示调用程序不要求页对齐)

              ECX           按字节计算的块大小(不能为0)

              EDX           标志

              位0         0,创建不能被保存的页

                            1,创建将被保存页

              位1-31       保留

返回寄存器:如果成功

759页

              进位标志清除

              EBX           内存块的线性地址

              ESI           内存块的句柄

              如果未成功

              进位标志置位

              AX            出错代码

                            8011h,系统不支持功能

                            8012h,线性内存不能用

                            8013h,物理内存不能用

                            8014h,备用存储器不能用

                             8016h,句柄不能用

                            8021h,无效值

                            8025h,线性地址不是页边界对齐的

注释: 16位宿主程序可能不支持该功能。但是,32位宿主的16位客户程序却

能使用这一功能。

功能0501h(也能分配线性内存)不能保证页边界对齐、不能创建非保存的页

或分配位于指定线性地址上的内存块。

系统

Int 31h       功能0505h                            DPMI版本0.9

              重新规定线性内存块的大小

改变先前由功能0504h分配的内存块大小。

调用寄存器: AX              0505h

              ESI           内存块句柄

              ECX           按字节计算新的块大小(不能为0)

              EDX           标志

              位0           0,创建非保存的页

                            1,创建保存页

              位1           0,不更新段描述符

                            1,更新段描述符

              位2-31       保留

                            如果EDX的位1置位

              ES:EBX      含有一组选择符的缓冲区的选择符:偏移

                            值,其中,每个选择符为1个字(16位)

              EDI           数组中的选择符个数

返回寄存器:如果成功

              进位标志清除

 

760页

              EBX             新的内存块的线性地址

              ESI             内存块的新句柄

              如果未成功

              进位标志置位

              AX              出错代码

                              8011h,系统不支持功能

                              8012h,线性内存不能用

                              8013h,物理内存不能用

                              8014h,备用存储器不能用

                              8016h,句柄不能用

                              8021h,无效大小

                              8023h,无效句柄

注释: 16位宿主程序可能不支持该功能。但是,32位宿主的16位客户却能使

用这一功能。在该功能返回时,旧的句柄已不再有效,并且不能再使用了。

当该功能失败时,块的大小和基地址保持不变。

如果块的大小增加了,其基地址可能会改变。

如果块大小减少了,那么系统将释放位于块末端的页;但其基地址仍然保持不

变。

如果改变了块的基地址,并且EDX的位1置位,那么当内存段进入内存时,系

统将修改在更新列表中的选择符的描述符。同时,如果基地址在新的内存块

内,那么扩展的段也在该块内;如果(基地址+界限-1)在新的内存块内,则缩

小的段也在该内存块内。如果必须移动内存块,则在移动过程中不能出现任何

硬件中断。

功能0503h也可用来重新规定线性内存块的大小,但它不需要页边界对齐的

块,不创建将被保存的页或更新描述符。

系统

Int 31h         功能0506h                              DPMI版本1.0

                获取页属性

返回由功能0504h分配的线性内存中一个或多个页的属性。

调用寄存器: AX              0506h

              ESI           内存句柄

               EBX          在页的内存块中或在多个页面的第一个页面

                            中的基地址偏移值

              ECX           页数

              ES:EDX     将接收页属性的缓冲区的选择符:偏移值

761页

返回寄存器:如果成功

              进位标志清除

              缓冲区被更新

              如果未成功,进位标志置位

              AX            出错代码

                            8001h,系统不支持的功能

                             8023h,无效句柄

                            8025h,偏移值不在指定块的范围内

注释: 16位宿主程序将不支持该功能。但32位宿主中的16位客户程序却能

使用这一功能。

      如果EBX不是页边界对齐的,那么系统会将它舍入为下一个更低的页边

界。

      页属性缓冲区是一组字,每页占一个字,其格式如下:

          位0-2      页面类型

                      0=非保存页

                      1=保存页

                      2=映象页

          位3

                      0=只读页

                      1=读/写页

          位4-6

                      0=页面访问/页面重写位不能用

                      1=页面未被访问,页面为非重写页

                      3=页面已被访问,页面为非重写页

                      5=页面未被访问,页面为重写页

                      7=页面已被访问,页面为重写页

          位7-15     保留

系统

Int 31h       功能0507h                              DPMI版本1.0

              设置页属性

为功能0504h设置的线性内存块中的一个或多个页设置属性。

调用寄存器: AX              0507h

              ESI             内存句柄

              EBX           一个或多个其属性将被改变的页面的内存块

                            偏移值

              ECX           页数

 

762页

              ES:EDX    含有页属性的缓冲区的选择符:偏移值

返回寄存器:如果成功

              进位标志清除

              缓冲区被更新

              如果未成功

              进位标志置位

              AX          出错代码

                          8001h,系统不支持功能

                          8002h,页面处于错误状态中

                          8013h,物理内存不能用

                          8014h,备用内存不能用

                          8021h,在一个或多个页属性字的位0-2中

                                出现了非法值

                          8023h,无效句柄

                          8025h,线性地址不在内存块中

注释: 16位宿主程序将不支持该功能。但32位宿主中的16位客户却能使用

它。

      可以从映象页或保存页中创建出非保存页。而保存页则可从非保存页或

映象页中创建出来。

      页属性字具有以下格式:

          位0-2      页面类型

                      0=改变页面类型为非保存页

                      1=改变页面类型为保存页

                      2=无效

                      3=改变属性但不改变页面类型

                      4-7=无效

          位3

                      0=把页变为只读页

                      1=把页变为可读/写页

          位4=6

                      0=不改变页访问/页重写位

                      1=把页面标记为非访问,非重写页

                      3=把页面标记为访问页,但非重写页

                      5=把页面标记为非访问页,但为重写页

                      7=把页面标记为访问,重写页

          位7-15     保留,必须为0

      只有当宿主支持页访问/重写时,系统才会改变页访问/重写位。

763页

系统

Int 31h       功能0508h                          DPMI版本1.0

              在内存块中映射设备

把指定给设备的物理地址变换成由功能0504h分配的内存块的线性地址。

调用寄存器: AX            0508h

              ESI         内存块句柄

              EBX         要被映射的一个或多个页的内存块

                          偏移值(必须是页边界对齐的)

              ECX         要映射的页数

              ES:EDX    设备的物理地址(必须是页边界对齐的)

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX            出错代码

                          8001h,系统不支持的功能

                          8003h,无效的设备地址

                          8023h,无效的句柄

                            8025h,线性地址不在内存块内,

                            或不是页边界对齐的

注释: 16位宿主将不支持该功能;但在32位宿主下运行的16位客户程序却

能使用该功能。

      该功能具有选择性;要求该功能的应用程序或DOS扩展程序都是DPMI

所不允许的程序。

      宿主将不保存或映射保存页或映象页。

      与功能0800h不一样,该功能支持在现有的内存内映象物理设备(这使得

32位的程序通过近指针访问该设备)并能映射低于1M的地址,如显示接口

卡上的刷新缓冲区。

系统

Int 31h       功能0509h                              DPMI版本1.0

              在内存块中映射常规内存

把低于1M的物理地址映射成由功能0504h分配的内存块的线性地址。

调用寄存器: AX                0509h

                ESI           内存句柄

                EBX           要被映射的页(一个或多个)的内存块偏移值

 

764页

                           (必须是页边界对齐的)。

                ECX             要映射的页数

                EDX             常规内存的线性地址(必须是页面对齐的)

    返回寄存器:如果成功

                进位标志清除

                如果未成功

                进位标志置位

                AX              出错代码

                                8001h,系统不支持功能

                                8003h,无效常规内存地址

                                8023h,无效句柄

                                8025h,线性地址不在内存块内或不

                                是页边界对齐的

    注释: 16位宿主将不支持该功能,但在32位宿主下运行的16位客户程序却

    能使用这一功能。

        该功能具有选择性;那些要求该功能的应用程序或DOS扩展程序都是

DPMI所不允许的。

        宿主将不保存或不映射保存页面或映象页面。

        客户程序中只映射它已拥有的常规内存,采用的途径有两种,一是调用功

    能0100h,二是通过转换服务来调用DOS的Int 21h,功能48h。

系统

Int 31h       功能050Ah                            DPMI版本1.0

              获取内存块大小和基地址

返回由功能0501h或0504h分配的内存大小

调用寄存器: AX              050Ah

              SI:DI      内存块句柄

返回寄存器:如果成功

              进位标志清除

              SI:DI      按字节计算的内存块大小

              BX:CX      内存块的基地址

              如果未成功

              进位标志置位

              AX             8023h,无效句柄

注释:在DPMI版本0.9下,该功能会失败。

765页

系统

Int 31h         功能050Bh                           DPMI版本1.0

                获取内存信息

返回可用的物理和虚拟内存的有关信息。

调用寄存器: AX              050Bh

              ES:(E)DI    128字节缓冲区的选择符:偏移值

返回寄存器:如果成功

              进位标志清除

              缓冲区被更新

              如果未成功

              进位标志置位

注释:在DPMI版本0.9下,该功能将会失败。

      缓冲区的格式如下:

偏移值      长度              内    容

00h         双字        宿主所控制的物理内存中总共被分配的字节数

04h         双字        宿主所控制的虚拟内存中总共被分配的字节数

08h         双字        宿主所控制的虚拟内存中总共可用的字节数

0Ch         双字        用于虚拟机器的虚拟内存中总共被分配的字节数

10h         双字        用于虚拟机器的虚拟内存中可用的总字节数

14h         双字        用于客户的虚拟内存中被分配的总字节数

18h         双字        用于客户的虚拟内存中可用的总字节数

1Ch         双字        用于客户的虚拟内存中被锁定的总字节数

20h         双字        用于客户的内存中可被锁定的最大字节数

24h         双字        可供客户使用最高的线性地址

28h         双字        按字节计算可用的最大自由内存块大小

2Ch         双字        按字节计算的最小分配单元的大小

30h         双字        按字节计算分配对齐单元的大小

34h         76字节      保留

系统

Int 31h       功能0600h                       DPMI版本0.9

              锁定线性区域

锁定指定的线性区域范围

调用寄存器: AX              0600h

              BX:CX      起始线性地址

              SI:DI      按字节计算的区域大小

766页

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX            出错代码

                            8013h,物理内存不能用

                            8017h,已超出了锁定计数

                             8025h,无效线性地址

注释:如果该功能未成功,则没有锁定任何区域。

      如果页面的任何一端发生区域重叠,则发生重叠的页面将被锁定。

      该功能可多次调用;但不能超过锁定计数。

系统

Int 31h       功能0601h                          DPMI版本0.9

              解锁线性区域

解锁先前由功能0600h锁定区域。

调用寄存器: AX              0601h

              BX:CX       区域的起始地址

              SI:DI      区域大小

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX            出错代码

                            8002h,未锁定页

                            8025h,无效地址

注释:如果该功能返回出错,则表明不存在被锁定的内存区域。事实上,在锁

定计数达到0之前,内存区域一直未被锁定,也即是说,调用该功能的次数必

须与调用功能0600h的次数相同。

系统

Int 31h       功能0602h                            DPMI版本0.9

              把实模式区域标记为可进行页交换的区域

标记低于1M的内存区域为可交换至磁盘的区域。

调用寄存器: AX              0602h

              BX:CX      起始地址

767页

                SI:DI       按字节计算的区域大小

    返回寄存器:如果成功

                进位标志清除

                如果未成功

                进位标志置位

                AX            出错代码

                              8002h,区域已被标记为可进行页交换的区域

                              8025h,地址超出了1M界限

    注释:在调用该功能时,如果有错误发生,该功能就不会标记任何一个内存区

    域。与锁定状态功能不一样,如果内存区域和页面的任何一端发生重叠,那么

    该功能不会把重叠的页面标记为可分页的页面。并且对该功能的多次调用也

    不会有任何结果。

        在终止时,客户程序必须调用功能0603来重新锁定被标记的内存区域。

    在客户程序终止时,DPMI 1.0版宿主将会自动地调用功能0603h,而DPMI

    0.9版则不会。如果未能成功地重新锁定该内存区域,那么当另一程序在同一

    空间里执行时,就会出现致命的错误。

        客户只能标记它自己拥有的空间(它通过调用功能0100h所获得的或直

    接调用DOS内存分配服务程序获得内存空间)。尤其是,它不能把DOS或

    DPMI宿主拥有的区域标记为可分页的区域;这样做会导致命的页面错误。

系统

Int 31h       功能0603h                              DPMI版本0.9

              重新锁定实模式区域

重新锁定先前由功能0602h标记为可分页的内存区域。

调用寄存器: AX              0603h

              BX:CX      要重新锁定的内存的起始地址

              SI:DI      按字节计算的区域大小

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX            出错代码

                            8002h,没有标记为可分页的区域

                            8013h,物理内存不能用

                            8025h,区域超过了1M界限

注释:如果有错误发生,该功能不会重新锁定任何区域。此外,该功能还不会

重新锁定和区域的任何一端相重叠的页面。

 

768页

系统

Int 31h     功能0604h                       DPMI版本0.9

            获取页面大小

返回以字节为单位的单个内存页大小。

调用寄存器: AX            0604h

返回寄存器:如果成功

            进位标志清除

            BX:CX        以字节为单位的页面大小

            如果未成功

            进位标志置位

            AX            出错代码

                          8001h,系统不支持的功能

注释:该功能返回的是基本的内存分配块大小。

系统

Int 31h      功能0702h                      DPMI版本0.9

          把页面标记为请求分页对象

标记某个或某些将被放置在页调出对象列表上部的页面。

调用寄存器: AX          0702h

            BX:CX    起始线性地址

            SI:DI     以字节为单位的区域大小

返回寄存器:如果成功

            进位标志清除

            如果未成功

            进位标志置位

            AX         8025h,未分配范围

注释:该功能不会强迫指定的页面退出内存,它只会提出建议以供宿主参考。

该功能不标记部分页。

    如果客户知道所标记的区域的内容有很长一段时间不能访问,并且知道

它所占用的内存能派上更好的用途,那么该功能便能对客户有很大的帮助。

系统

Int  31h      功能0703h                      DPMI 版本  0.9

              删除页面内容

删除指定线性地址范围内的内容,这样,在不必要的时候系统不会将它分页切

769页

换到磁盘。

调用寄存器: AX                0703h

                BX:CX       起始线性地址

                SI:DI       以字节为单位,要删除的区域大小

返回寄存器:如果成功

                进位标志清除

                如果未成功

                进位标志置位

                AX             8025h,未分配范围

注释:该功能不会删除部分页和被锁定的页。而且该功能并不定义所删除的

    页的内容。

系统

Int 31h     功能0800h                        DPMI 版本  0.9

            物理地址映象

把物理地址转换成线性地址。

调用寄存器:   AX          0800h

            BX:CX       物理地址

            SI:DI      以字节为单位的区域大小

返回寄存器:如果成功

            进位标志清除

            如果未成功

            进位标志置位

            AX            出错代码

                          8003h,地址处在DPMI宿主内存区域中

                          8021h,地址低于1M边界

注释:只有那些请求直接访问超过1M边界的内存映象设备的客户程序才能

调用该功能。

    由客户程序负责分配并初始化描述符以访问内存区域。

系统

Int 31h     功能0801h                        DPMI 版本0.9

            释放物理地址映象

将物理地址映象恢复到先前通过功能0800h获取的线性地址。

调用寄存器: AX        0801h

          BX:CX    要恢复的线性地址

770页

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX             8025h,无效地址

注释:当客户完成了使用通过功能0800h映射的设备之后,它必须调用该功

能。

系统

Int 31h       功能0900h                          DPMI版本0.9

              获取并禁止虚拟中断状态

禁止虚拟中断标志,并返回该标志的从前状态。

调用寄存器: AX            0900h

返回寄存器:进位标志清除

            AL            从前的状态

                          0,先前禁止虚拟中断

                          1,先前允许虚拟中断

注释:该功能调用不会改变AH;因此,客户程序在不知道先前状态是个什么

样子时,只需再次调用Int 31h即可恢复先前状态。

    用户也可使用CLI来禁止中断;只是DPMI宿主能轻易地捕获该指令。

因此,客户程序必须要求CLI执行得非常缓慢。

系统

Int 31h       功能0901h                        DPMI 版本 0.9

              获取并允许虚拟中断状态

允许虚拟中断标志并返回该标志的从前状态。

调用寄存器: AX              0901h

返回寄存器:进位标志清除

              AL            从前状态

                            0,先前禁止虚拟中断

                            1,先前允许虚拟中断

注释:该功能调用不会改变AH;因此,客户程序在不知道先前状态时,只需

再次调用Int 31h即可恢复先前状态。

      用户也可用STI来禁止中断;但是,DPMI宿主能轻易地捕获该指令。因

而,客户必须要求CLI将执行得十分缓慢。

771页

系统

Int 31h       功能0902h                            DPMI版本0.9

              获取虚拟中断状态

返回虚拟中断标志的当前状态

调用寄存器: AX              0902h

返回寄存器:进位标志清除

              AL            虚拟中断状态

                            0,禁止虚拟中断

                            1,允许虚拟中断

注释:必须用该功能而不能使用PUSHF指令,因为PUSHF返回的是物理

中断标志,而不是虚拟的每个客户的中断标志。

系统

Int 31h       功能0A00h                            DPMI版本0.9

              获取厂商指定的API入口点

返回一个例程的地址,该例程可调用来访问宿主指定的对DPMI的扩展。

调用寄存器: AX              0A00h

              DS:(E)SI  标识着DPMI宿主生产厂家且以零为结尾的

                            字符串的选择符:偏移值

返回寄存器:如果成功

              进位标志清除

              ES:(E)DI  扩展API入口点的选择符:偏移值

              还可能改变其它寄存器

              如果未成功

              进位标志置位

              AX             8001h,未找到扩展

注释:该功能返回的地址只能通过远调用来访问。其余的要求由生产厂商指

定。字符串对照要求分大小写。

      DPMI 1.0客户则必须用Int 2Fh,功能168Ah来代替该功能。

系统

Int 31h       功能0B00h                            DPMI版本0.9

              设置调试监视点

在指定地址处理设置调试监视点。

调用寄存器: AX                0B00h

772页

              BX:CX         起始地址

              DL              监视点的大小(1、2或4个字节)

              DH              监视点的类型

                              0,执行

                              1,写

                              2,读/写

返回寄存器:如果成功

              进位标志清除

              BX              监视点句柄

              如果未成功

              进位标志置位

              AX              出错代码

                              8016h,监视点太多

                              8021h,监视点的大小或类型无效

                              8025h,未映射线性地址或线性地址不是页面

                              对齐的

注释:在DPMI1.0中,该功能返回只能返回范围0-14内的句柄;而在DP-

MI 0.9下,这一范围不严格。

系统

Int 31h       功能0B01h                              DPMI版本0.9

              清除调试监视点

清除先前由功能0B00h设置的监视点,并释放监视点的句柄。

调用寄存器: AX            0B01h

              BX          监视点句柄

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX           8023h,无效句柄

注释:必须在终止前调用此功能。

系统

Int 31h       功能0B02h                             DPMI版本0.9

              获取调试监视点的状态

返回先前由功能0B00h设置的监视点的状态。

773页

    调用寄存器: AX              0B02h

                  BX            监视点句柄

    返回寄存器:如果成功

                  进位标志清除

                  AX            状态

                  位0           0,未遇到监视点

                                1,遇到了监视点

                  位1-15       保留

                  如果未成功

                  进位标志置位

                  AX             8023h,无效句柄

    注释:使用功能0B03h可清除监视点的状态,但不释放监视点。

系统

Int 31h       功能0B03h                             DPMI版本0.9

              复位调试监视点

恢复监视点的状态,以便随后对功能0B02h的调用能显示出未遇到监视点。

调用寄存器: AX              0B03h

              BX            监视点句柄

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX            8023h,无效句柄

注释:只有在遇到监视点之后才能调用该功能。

系统

Int 31h         功能0C00h                              DPMI版本1.0

                安装常驻服务供应者回调

当在同一虚拟机器中装载或终止另一个DPMI客户程序时,常驻服务供应者

可用该功能来从宿主那里请求通知。

调用寄存器: AX              0C00h

              ES:(E)DI   0字节缓冲区的选择符:偏移值

                            其结构如下:

774页

偏移值      长度            内      容

00h          8字节      用于16位数据段的描述符

08h          8字节      用于16位代码段的描述符

10h          2字节      16位回调过程的偏移值

12h          2字节      保留

14h          8字节      用于32位数据段的描述符

1Ch          8字节      用于32位代码段的描述符

24h          4字节      32位回调过程的偏移值

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX              出错代码

                            8015h,回调不能用

                              8021h,无效的访问权限或类型字节;偏移值

                              在段界限之外

                            8025h,描述符引用了不合法的线性地址范围

注释:只有那些打算提供常驻保护模式服务的DPMI客户才有必要调用该功

能;并且该客户必须随后使用功能0C01h终止并驻留。只打算提供常驻实模

式服务的DPMI客户不应使用这一功能。

      通过使用功能000Bh可轻易地初始化缓冲区以获取它的代码和数据描

述符的拷贝。如果只能提供16位或32位模式中的一种,那么就必须把用于不

支持的模式的描述符设置为零。

系统

Int 31h         功能0C01h                            DPMI版本1.0

                终止并驻留

当DPMI客户在放弃其保护模式和内存,以及可能分配给它的一些实模式内

存时,终止它的执行。

调用寄存器: AX              0C01h

              BL            返回代码

              DX            要保留的DOS内存的节数

返回寄存器:无

注释:只有那些提供常驻服务给其它DPMI保护模式客户的DPMI客户才有

必要使用该功能。而只打算提供常驻服务给实模式的客户则必须使用功能

0300h去直接调用DOS的Int 21h,功能31h。

775页

      DX的值为DOS内存的节数;是DPMI宿主自动地放弃分配给它的全部

保护模式内存。DX的值必须为0或一个小于6的值。如果DX为0,则系统将

调用DOS Int 21h,功能4Ch,而不是功能31h。

      如果客户预先没有调用功能0C00h,那么系统会直接终止它。

系统

Int 31h       功能0D00h                            DPMI版本1.0

              分配共享内存

分配一个可供DPMI客户共享的内存块。

调用寄存器: AX              0D00h

              ES:(E)DI     共享内存分配请求结构的选择符:偏移值,其

                            格式如下:

偏移值      长度            内      容

00h            4字节      内存块的长度(由客户设置)可以为0

04h            4字节      实际分配的长度(由宿主设置)

08h            4字节      句柄(由宿主设置)

0Ch            4字节      块的线性地址(由宿主设置)

10h            6字节      以空字符结尾的ASCII字符块名的32

                          位偏移值:选择符(由客户设置)

16h            2字节      保留

18h            4字节      保留;必须为0

    返回寄存器:如果成功

                进位标志清除

                位于偏移值04h、08h、和0Ch处的字段被更新

                如果未成功

                进位标志置位

                AX          出错代码

                            8012h,线性地址不能用

                            8013h,物理地址不能用

                            8014h,备用存储器不能用

                            8016h,句柄不能用

                            8021h,名字太长

    注释: 16位的客户必须把32位偏移值的高位字设置为0。最大的名字长度为

    128字节,其中包括结尾的零字节。

        提供给使用共享内存块的同一虚拟机器内所有客户的线性地址必须是相

    同的。并且,客户必须自己去分配并初始化描述符来建立起可编址的功能。

 

776页

        该功能对句柄值不作任何要求;因此,同一客户对同一内存块的成功分配

    都可以返回不相同的值。

        分配共享内存块的第一个客户将确定内存块的大小。其它客户则可按不

    同的大小来分配同一内存块,但是,所分配的大小必须与报告给第一个客户的

    大小相同。

       0大小是合法值;由此返回的句柄可通过串行化功能0D02h和0D03h来

    使用。但是,与之相关的线性地址却未被定义,并且引用它会导致出现页面错

    误。

        在第一次分配时,该功能会将共享内存块的头16个字节设置为0。客户

    可将这头16个字节用作“初始化区域”的指示符。

系统

Int 31h         功能0D01h                              DPMI版本1.0

                释放共享内存

释放由功能0D00h分配的共享内存。

调用寄存器: AX                0D01h

               SI:DI        块的句柄

返回寄存器:如果成功

                进位标志清除

                如果未成功

                进位标志置位

                AX            8023h,无效句柄

注释:成功地调用该功能将使块的句柄变得无效。

      由客户负责释放任何可用来映射共享内存块的描述符。

      在此过程中,宿主维持的有两个计数;一个虚拟机器使用计数,是在虚拟

机器范围内对内存块发出的成功的分配调用计数;一个全局使用计数,是虚拟

机器访问共享内存块的计数。当虚拟机器计数为0时,在此虚拟机器内的客户

将不再能够定址内存块。而当全局使用计数为0时,则表明宿主已破坏了内存

块。

系统

Int 31h         功能0D02h                              DPMI版本1.0

                对共享内存进行串行化

请求共享内存块的串行化

调用寄存器: AX                0D02h

                SI:DI        块的句柄

777页

                DX              标志

                位0             0,挂起客户,直到串行化可用

                                1,如果串行化不可用则立即返回错误

                位1             0,排斥串行化请求

                                1,共享串行化请求

                位2-15         保留,必须为0

    返回寄存器:如果成功

                进位标志清除

                  如果未成功

                  进位标志置位

                AX              出错代码

                                8004h,宿主检查到了死锁

                                8005h,请求已被功能0D03h取消

                                8017h,超出了锁定计数。

                                8018h,排斥由另一客户拥有的串行化

                                8019h,另一客户拥有的共享串行化

                                8023h,无效句柄

    注释:成功的串行化等于拥有了块的所有权和对它的访问权。该系统可供

    DPMI客户用于同步化块的检查和修改操作。排斥串行串相当于拥有写操作

    的拥有权;而共享串行化则相当于可进行只读访问。对排斥串行的成功地请求

    可封锁住其它请求,包括排斥请求和共享请求。而对共享串行化的成功请求则

  只会封锁住对排斥串行化的请求,

        通过设置DX的位0来查询块的客户必须在适当的时候调用Int 2F,功

    能1680h来得出CPU结果。

        因等待块而被锁定的客户可继续服务于中断。而当客户中断服务例程调

    用功能0D03h来释放串行化时,被挂起的串行化调用就能返回。在这种情况

    下,返回的结果是出错代码8005。

        该功能不要求宿主去检查是否会有死锁。

系统

Int 31h         功能0D03h                            DPMI版本1.0

                释放共享内存上的串行化

释放先前通过成功地调用功能0D02h所获取的共享内存串行化

调用寄存器: AX              0D03h

            si:DI        句柄

              DX            标志

              位0           0,释放排斥串行化

778页

                              1,释放共享串行化

                位1           0  不释放未决的串行化

                              1,释放未决的串行化

                位2-15       保留;必须为0

返回寄存器:如果成功

                进位标志清除

                如果未成功

                进位标志置位

                AX          出错代码

                              8002h,客户并未拥有指定类型的串行化

                              8023h,无效句柄

注释:当调用者已完成了使用共享内存时,它必须调用该功能。

系统

Int 31h       功能0E00h                            DPMI版本1.0

              获取协处理器状态

返回协处理器是否存在、如果存在其类型是什么以及宿主是否支持协处理器

仿真的有关信息。

调用寄存器: AX              0E00h

返回寄存器:如果成功

              进位标志清除

              AX            协处理器状态

              位0           0,禁止客户使用数学协处理器

                            1,允许客户使用数学协处理器

              位1           0,客户未在仿真协处理器指令

                              1,客户正在仿真协处理器指令

              位2           0,没有数学协处理器

                              1,存在数学协处理器

                位3           0,宿主未在仿真协处理器指令

                              1,宿主正在仿真协处理器指令

                位4-7      协处理器类型

                              00h,无协处理器

                              02h,80287

                                       03h,80387

                                        04h,具备数学协处理器的80486

                    位8-15             保留

                    如果未成功(DPMI版本0.9)

779页

                进位标志置位

注释:如果位2与位4-7发生抵触,则忽略位2。

系统

Int 31h         功能0E01h                             DPMI  版本1.0

                设置处理器仿真

    允许或禁止用于虚拟机器的数学协处理器以及向客户反映处理器的异常情

    况。

    调用寄存器: AX          0E01h

              BX            标志

              位0           0,禁用于客户的数学协处理器

                            1,允许用于客户的数学协处理器

              位1           0,客户将不提供协处理器仿真

                            1,客户将提供协处理器仿真

              位2-15       保留

    返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX             8026h,无效请求

    注释:在设置位1之前,客户必须登记一个用于处理协处理器不存在这一错

    误的异常处理程序。

 

第21章任务切换参考手册
    任务切换是一种随着DOS 5的问世而出现的功能。它由DOS 5.0的外壳程序提供,
可允许用户挂起一个程序并开始另一个程序,随后又在挂起程序处重新开始它先前挂起
的程序。它不是一种真正的多任务操作系统;因此,系统会将被挂起的程序从内存中删除
掉,将其映象保存给磁盘,并且装入新的程序在独自运行。
    任务切换环境中有两类程序:一种是任务切换程序,它管理任务通话;另一种是客户
程序,它是在任务切换程序的管理之下运行的用户程序。Microsoft已公开了任务切换所
必须的三种功能,即通报服务、服务功能和任务切换程序服务。通报服务由客户程序提供,
由任务切换程序用来通报客户程序关于任务切换和过程(session)事件。服务功能由任务
切换程序提供,客户程序可用它来控制切换,获取任务切换程序以及其它客户程序的有关
信息。任务切换程序服务是由任务切换提供给其它任务切换程序使用的功能。
                      21.1数据结构
    任务切换中用到了几种数据结构。而任务切换功能却总是使用那些指向这些数据结
构中一个或多个结构的指针。本节主要介绍其中采用C语言和汇编语言的数据结构。
SWAPIINFO
    SWAPIINFO结构主要介绍客户程序提供给一种特殊异步API类型的支持层。这种
结构是供在任务切换程序下操作的网络管理程序使用的。
              SWAPIINFO struc
                      aisLength           dw      10
                      aisAPI              dw      ?
                      aisMajor            dw      ?
                      aisMinor            dw      ?
                      aisSupport          dw      ?
              SWAPIINFO ends
              struct SWAPIINFO
                    unsigned int            aisLength;
                      unsigned int         aisAPI;
                    unsigned int           aisMajor;
 
781页
              unsigned int     aisMinor;
              unsigned int   aisSupport;
aisLength是以字节为单位的结构长度,必须为10。
aisAPI标识的接口是客户程序支持的接口。有效值及各自的含义如下表所示:
    位                  含    义
0001h               NETB10S接口
0002h                802.2接口
0003h               TCP/IP接口
0004h                LAN Manager命令管道接口
0005h               NetWareIPX接口
    其余所有的值都用作保留值。
    aisMajor标识应用程序的最高主版本号,这里的应用程序是指客户程序为其提供ais- 
Support字段所介绍的支持程序。
    aisMinor标识应用程序(客户程序为其提供aisSupport字段所介绍的支持)的次版本
号。
    aisSupport标识客户程序为aisAPI、aisMajor和aisMinor字段介绍的接口所提供的支
持级别。有效值及各自含义如下表所示:
位                  含      义
0001h         最小的支持。当应用程序已调用了某个API支持的功能之后,甚至当请求已
              被实现之后,客户程序会防止过程切换。
002h           API层支持。客户程序跟踪异步请求,当请求尚未完成时阻止任务切换,并且
              当完成了所有的请求之后允许任务切换。
0003h         切换程序兼容。API提供者允许切换程序在异步请求尚未完成时进行切换。
              这一过程可能会受到资源的限制;并且一些请求可能会因此失败
0004h         无间断的兼容能力。API供应者一直允许过程切换发生。
SWCALLBACKINFO
    SWCALLBACKINFO结构含有客户程序的有关信息:
            SWCALLBACKINFO struc
                  scbiNEXt              dd      ?
                  scbiEntryPoint        dd ?
                  scbiReserved          dd ?
                  scbiAPI
            SWCALLBACKINFO ends
            struct SWCALLBACKINFO
782页
                      struct SWCALLBACKINFO far              *  scbiNext;
                      void far                              *  scbiEntryPoint;
                      long                                 scbiReserved;
                      struct SWAPIINFO far                   *  scbiAPI;
                                        }; 
      scbiNext是一个32位指针(段:偏移值),该指针指向通报链中的下一个SWCALL-
    BACKINFO结构。
      scbiEntrypoint是一个指向客户的通报功能处理程序的32位指针(段:偏移值)。任
    务切换程序正是使用这一地址来调用客户程序的通报功能。
      scbiReserved是一个保留区域;不要使用它。
      scbiAPI是SWAPIINFO结构的零终止列表中一个32位指针(段:偏移值),它指定
    客户程序应为各种异步API提供的支持类型。
    SWINSTANCEITEM
      SWINSTANCEITEM结构保存着实例数据块的有关信息。至于这样一种数据块到底
    是何种形式,这个问题没有固定的答案,因为其形式自由多变,以便能正好保存任何需要
    保存的内容:
                  SWINSTANCEITEM struc
                          iisPtr           dd ?
                          iisSize          dw ?
                  SWINSTANCEITEM ends
                  struct SWINSTANCEITEM
                          void far              *iisPtr;
                          unsigned int         iisSize;
                                          };
        iisPtr是实例数据块的32位指针(段:偏移值)。
        iisSize是以字节为单位的实例数据块大小。
      SWSTARTUPINFO
       SWSTARTUPINFO结构保存与客户程序的实例数据相关的信息:
                SWSTARTUPINFO struc
                sisVersion              dw      ?
                sisNextDev              dd      ?
                  sisVirtDevFile       dd      ?
                  sisReferenceData         dd    ?
                  sisInstanceData         dd    ?
                  SWSTARTUPINFO ends
 
783页
              struct SWSTARTUPINFO
              int                                    sisVersion; 
              struct SWSTARTUPINFO far                  * sisNextDev; 
              long                                     sisVirtDevFile;
              long                                     sisReferenceData;
              struct SWINSTANCEITEM far                 * sisInstanceData; 
      sisVersion未使用。
      sisNextDev是一个指向通报链中下一个SWSTARTUPINFO结构的32位指针(段:
偏移值)。
      sisVirtDevFile未使用。
      sisReferenceData未使用。
      sisInstanceData是一个指向SWSTARTUPINFO结构的零终止列表的32位(段:偏
移值)。
SWVERSION
      SWVERSION结构保存着任务切换程序的有关信息:
              SWVERSION struc
                      svsAPIMajor               dw      ?
                      svsAPIMinor              dw      ?
                      svsProductMajor           dw      ?
                      svsProductMinor           dw      ?
                      svsSwitcherID             dw      ?
                      svsFlags                   dw     ?
                      svsName                   dd      ?
                      svsPrevSwitcher           dd      ?
              SWVERSION ends
              struct SWVERSION
                      unsigned int         svsAPIMajor;
                      unsigned int         svsAPIMinor;
                      unsigned int         svsProductMajor;
                      unsigned int         svsProductMinor;
                      unsigned int         svsSwitcherID;
                      unsigned int         svsFlags;
                      char far            * svsName; 
                      void far              svsPrevSwitcher;
 
784页
    svsAPIMajor是任务切换程序支持的任务切换协议的最高主版本。
    svsAPIMinor是任务切换程序支持的任务切换协议的最高次版本。
    svsProductMajor 是任务切换程序的主版本。
    svsProductMinor是任务切换程序的次版本。
    svsSwitcherID是切换程序标识符。每个切换程序都单独拥有一个4位标识符;标识
符是所在字段中的4个低位。
    svsFlags是任务切换程序的操作标志。通常情况下,只有位0被定义,其它各位作为
保留且必须为0。如果位0置位,则表示当前禁止切换程序;若位0为0,则表示允许切换
程序。
    svsName是一个指向含有任务切换程序名的0终止ASCII字符串的32位指针(段:
偏移值)。
    svsPrevSwitcher是一个指向先前装载的任务切换程序的32位指针(段:偏移值)。可
用这一地址来调用先前装入的任务切换程序的服务功能处理程序。
                    21.2通报功能
    本节介绍通报功能的方式与前面介绍中断功能方式是相同的。
    系统先把客户程序的通报功能处理程序地址提供给任务切换程序和其它通过中断
2F、功能4B,子功能01(建立通报链)来调用并控制任务切换程序的程序。这样,任务切换
程序或控制并调用它的程序就可以通过让AX保存功能号以及使用其它一些有关寄存器
来调用通报处理程序。
通报功能0000h                                           版本5
                          初始化任务切换程序
    通报客户程序,新的任务切换程序将被初始化。
    调用寄存器: AX            0000h
                ES:DI      服务功能处理程序
    返回寄存器: AX           状态
                              0000,可以安全地装载任务切换程序
                              非零值,不能安全地装载任务切换程序
    注释:当对任务切换程序进行初始化时,该任务切换程序或其控制程序或两
    者都必须调用该功能。任务切换程序的服务功能处理程序(如果有的话)必须
    支持服务功能0000h(获取版本)。但是,服务功能处理程序可以是一个NULL
    (空)指针,尤其是当任务切换程序的控制程序在调用该通报功能时,情况更是
    如此。
785页
      如果有客户程序作出否定的应答(在返回时把AX设置为非0),任务切
换程序就必须禁止它自己。此时,任务切换程序可以对其它客户程序发出通报
处理程序0007(切换程序退出)调用。但是,如果事先没有调用初始化切换程
序功能就出现了切换程序退出调用,那么客户程序必须忽视这个调用。
      在调用该通报功能之前系统允许中断。并且在服务于该通报功能时,客
户程序还可以调用任意的MS-DOS系统功能。此外,系统还允许客户程序修
改AX寄存器的值,但必须保留其它寄存器。
通报功能0001h                                               版本5
                              询问挂起
通报客户程序,任务切换程序正准备实现过程切换。
调用寄存器: AX              0001h
              BX            当前过程(session)标识符
              ES:DI      服务功能处理程序
返回寄存器: AH
              AX            状态
                            0000,允许切换
                            0001,不允许切换
              其它所有值都作为保留值
注释:在全局内存中的客户程序可通过过程标识符得知当切换发生时系统将
挂起哪个过程。
通过调用服务功能0001h(检查内存区域)客户程序就可得知内存中的指定代
码或数据会不会受到切换的影响,以及系统是否有必要允许该切换。
      在封锁过程之前,由于不知道异步API的状态,因此,客户必须调用服务
功能0006(询问API支持)以确证其它客户程序不在处理该API。
      如果有客户程序发出了一个非0回答,任务切换程序就可以对所有客户
程序发出通报处理程序0002(过程正在使用)调用。如果事先没有调用询问挂
起或挂起过程,客户程序就必须忽略过程正使用的调用。
      在调用该通报功能之前,系统允许中断。并且客户可在服务于该通报调用
的同时,调用任何一种MS-DOS系统功能,此外,系统还允许客户程序修改
AX寄存器,但必须保留其它寄存器。
通报功能0002h                                               版本5
                              挂起过程
786页
通报客户程序,过程切换将要发生
调用寄存器: AX            0002h
            BX            过程ID
            ES:DI      服务功能处理程序
返回寄存器:状态
                          0000,允许切换
                          0001,不允许切换
            其它所有值都作为保留值
注释:如果所有客户程序都返回0000h给通报功能0001(询问挂起),任务切
换程序就会禁止中断并调用挂起过程。这是客户程序防止过程切换的最后一
次机会。客户程序绝不能调用软件中断或发出任何可能允许中断的调用。
    如果所有客户程序都返回0000h,那么任务切换程序会用一个在允许中
断前保存的拷贝来替换当前中断表;这样便可确保在调用挂起过程和调用活
动过程之间的这段时间内,系统不会调用中断处理程序。
      在全局内存中的客户程序虽然能接收到中断,但不能使用非全局内存。
      在封锁过程切换之前,由于不知道异步API的状态,客户必须调用服务
功能0006(询问API支持)以确证其它客户程序不是在处理该API。
    如果有任何一个客户程序发出了一个非0回答,任务切换程序就可以对
所有客户程序发出通报处理程序0002(活动过程)调用。如果事先没有调用询
问挂起或挂起过程,那么客户程序必须忽略活动过程调用。
      在调用该通报功能之前,系统禁止中断。并且客户程序可在服务于该通报
调用的同时,调用任何一种MS-DOS系统功能。此外,系统还允许客户程序修
改AX寄存器,但必须保留其它寄存器。
通报功能0003h                                   版本5
                                激活过程
通报客户程序,此过程将变为活动的过程。
调用寄存器: AX              0003h
              BX            过程ID
              CX            过程状态ID
                            位0
                            1,将首次激活过程
                            0,恢复以前挂起的过程
              其余的位都作为保留位,且必须为0
              ES:DI      服务功能句柄
返回寄存器: AX              0000h
787页
注释:如果系统将恢复被挂起的过程,则表明它已重新装载了局部内存,包括
向量表。
      如果是第一次激活过程,那么在此之前必须先调用创建过程功能。
      在调用该通报功能之前,系统禁止中断。客户程序可在服务于该通报调用
的同时,调用任何一种MS-DOS系统功能。此外,客户程序必须清除AX寄存
器保留其它寄存器。
通报功能0004h                                               版本5
                              通报过程是活动的
通报客户程序,某个过程已变成活动的。
调用寄存器: AX                0004h
                BX            过程ID
                CX            状态ID
                              1,第一次投入使用的过程
                              0,先前挂起的并且刚恢复的过程
                其余各位都作为保留位,并且必须都为0
返回寄存器: AX                0000h
注释:如果任何一个客户程序在调用询问挂起或挂起过程时失败,任务切换
程序就能对所有的客户程序发出过程活动调用。而不管它们是否接收到了询
问挂起或挂起过程调用。但客户程序必须忽略该调用。
      在这里,任务切换程序允许中断,并且客户程序可以发出任何一种MS-
DOS系统功能调用。客户还必须清除CX寄存器并保留其余的寄存器。
通报功能0005h                                             版本5
                            创建过程
通报客户程序,任务切换程序将创建一个新的过程。
调用寄存器: AX                0005h
              BX              新话路的过程ID号
              ES:DI        服务功能句柄
返回寄存器: AX             状态
                              0000h,可安全地创建新过程
                              0001h,不能安全地创建新过程
              其余各位都作为保留值
788页
注释:可调用该功能来允许客户程序去封锁新过程的创建。
      如果有任何一个客户程序返回0001h,任务切换程序就可以对所有客户
程序发出一个撤消过程调用。在预先没有调用创建过程功能的前提下,客户必
须忽略它接受到的撤消过程调用。
      在这里,任务切换程序允许中断,并且客户程序可以发出任何一处MS-
DOS系统功能调用。客户还必须清除CX寄存器并保留其余的寄存器。
通报功能0006h                                           版本5
                            撤消过程
通报客户程序,任务切换程序将撤消某个过程。
调用寄存器: AX                0006h
              BX              将要撤消的过程ID号
              ES:DI        服务功能句柄
返回寄存器: AX                0000h
注释:当处于当前过程中的程序终止时,任务切换程序典型地发出这一调用。
但是,这种调用可按照过程管理程序的指示来发出,并且,该调用适用于程序
正在运行时的当前过程以及被挂起的过程。
      如果其它客户程序在调用创建过程时失败了,那么任务切换程序不必事
先调用用于该过程的创建过程功能即可发出撤消过程调用。在这种情况下,客
户程序必须按兵不动。
      在这一过程中,任务切换程序允许中断,并且客户程序可调用任何一种
MS-DOS系统功能。此外,客户程序必须清除AX寄存器并保留其它寄存器。
通报功能0007h                                           版本5
                              切换程序退出
通报客户程序,任务切换程序将不再活动。
调用寄存器: AX              0007h
              BX            标志
                            位0
                            1,只有1个任务切换程序
                            0,至少有1个以上的任何切换程序在运行
              其余各位都作为保留位,并且必须都为0
              ES:DI       服务功能句柄
返回寄存器: AX              0000h
789页
          注释:为了能够与任务切换程序共存,全局客户程序必须停止它们正在运行
          的其它进程。
              该功能可由控制着任务切换程序的程序调用而不能由任务切换程序调
          用。因此,服务功能指针可以与传送给其它通报句柄功能的指针不同,并且可
          以是一个NULL(空)指针。
              在此过程,系统允许中断,并且客户程序可以调用任何一种MS-DOS系
          统功能。此外,客户程序必须清除AX寄存器并保留其它寄存器。
                    21.3服务功能
      本节介绍服务功能所采用的方式与本书前面介绍中断功能方式是一样的。
      当任务切换程序发出通报调用或任务切换程序服务调用时,它允许客户程序访问服
务功能处理程序。由于这些调用可由不同的任务切换程序或控制任务切换程序的程序来
调用,因此,客户程序绝不能要求服务功能处理程序句柄可重新使用。这样,只要客户程序
受到干涉,那么只有当它是在处理任务切换程序发出的调用时,指针才是有效的。客户程
序可通过让AX包含功能号,并使用其它有关寄存器来调用服务功能处理程序。
服务功能0000h                                               版本5
                              获取版本号
返回当前任务切换程序的SWVERSION结构所在的地址。
调用寄存器: AX              0000h
返回寄存器:进位标志清除表示成功
              AX       0000h
              ES:BX      指向SWVERSION结构的指针
              进位标志置位表示任务切换程序不支持该功能
注释:任务切换程序允许中断并可调用任何一种MS-DOS系统功能。同时,
它必须保留AX、ES和BX外的所有寄存器。
服务功能0001h                                               版本5
                              检查内存区域
    确定给定的内存块对当前过程来说是全局内存块还是局部内存块;并且在系
    统进行过程切换时把局部内存块交换出内存区域。
    调用寄存器: AX              0001h
                ES:DI         缓冲区的地址
 
790页
    返回寄存器:进位标志清除表示成功
                AX            内存状态
                              0000h,缓冲区在全局内存中
                              0001h,缓冲区在全局内存和局部内存
                              中都有
                              0002h,缓冲区在局部内存中
                进位标志置位表示系统不支持该功能
    注释:客户程序在接收到询问挂起或活动过程调用时,必须调用该功能以确
    定任务切换程序是把客户程序的内存看作全局内存还是局部内存。客户程序,
    如为其它程序提供服务的网络管理程序必须识别其它的程序是全局还是局部
    程序。
        在服务于该调用的同时,任务切换程序绝不能允许中断,或调用任何一种
    MS-DOS系统功能,而当任务切换程序在修改AX寄存器时,它还必须保留其
它寄存器。
    服务功能0002h                                             版本5
                                挂起切换程序
通报任务切换程序,它必须暂停操作。
调用寄存器: AX                0002h
              ES:DI        指向新任务切换程序的服务功能处理
                              程序的指针
返回寄存器:进位标志清除表示成功
              AX              状态
                              0000h,当前任务切换程序已暂停操作
                              0001h,当前任务切换程序尚未挂起操作,新
                                    的任务切换程序不能开始
                              0002h,当前任务切换程序尚未挂起操作,但
                                    新的任务切换程序可随时开始操作
              其它值都作为保留值
              如果系统不支持该功能,则进位标志置位
注释:只能由其它任务切换程序来调用该功能。客户程序必须对询问挂起调
用作出否定的回答,以便在切换过程的过程中停止任务切换程序。
      当任务切换程序接收到该调用时,它必须继续为功能服务,但它却不能响
应键盘中断请求或切换过程;直到它接收到再启用切换程序调用。
      可以让挂起切换程序调用后进先出,并且当系统没有收到相等次数的再
继续切换程序调用之前,必须挂起常规操作。不过,对此有一种例外情况,即当
791页
子程序在运行时,另一种任务切换程序挂起了其过程管理程序的任务切换程
序,并且在把控制权返回给过程管理程序之前未能成功地重新开始该过程的
程序。在这种情况下,过程管理程序能够安全地再次激活其任务切换程序。
    在服务于该调用时,任务切换程序允许中断,并可以调用任何一种MS-
DOS系统功能。
    新的任务切换程序可通过调用检查切换程序(中断2Fh,功能4B02h)功
能来获取以前的任务切换程序的服务功能处理程序指针。
服务功能0003h                                           版本5
                            恢复切换程序
通报先前被挂起的任务切换程序:它可以重新开始操作。
调用寄存器: AX              0003h
              ES:DI      调用者的服务功能处理程序
返回寄存器:进位标志清除表示成功
                    AX              0000h
                    进位标志置位表示任务切换程序不支持该功能
注释:曾通过调用挂起切换程序功能而挂起过程其它任务切换程序的任务切
换程序,必须调用该功能再重新激活它所挂起的任务切换程序。该任务切换程
序必须使用与它曾用来发出挂起切换程序调用使用的地址相同的服务功能句
柄地址。
      在服务于该功能时,任务切换程序可以允许中断并可调用任何一种MS-
DOS系统功能。
服务功能0004h                                             版本5
                            挂接通报链
指示任务切换程序把SWCALLBACKINFO结构加到它的通报链上。
调用寄存器: AX              0004h
              ES:DI       指向SWCALLBACKINFO结构的指针
返回寄存器:进位标志清除表示成功
                  AX              0000h
                  进位标志置位表示系统不支持该功能
注释:客户程序可以使用检查切换程序(中断2Fh,功能4B02h)来检查任务
切换程序,并获取服务功能处理程序的地址。如果任务切换程序存在,客户程
 
792页
序就必须调用该功能。并且,客户程序只能在发出了此调用之前填充
SWCALLBACKINFO结构。
    有些任务切换程序选择在每个过程切换前调用建立通报链功能(中断
2Fh,功能4B01h)。在这种情况下,任务切换程序可简单地从该调用中返回,而
不进行任务操作。
    如果任务切换程序不发出建立通报链调用,那么它就必须通过客户程序
发出该调用以修改其通报链。
    在终止前,客户程序必须调用脱离通报链功能(服务功能0005h)来将它
自己从通报链上解脱下来。
    在服务于该调用的同时,任务切换程序还可允许中断并可调用任何一种
MS-DOS系统功能。
服务功能0005h                                             版本5
                            脱离通报链
指示任务切换程序从其通报链中移走SWCALLBACKINFO结构。
调用寄存器: AX              0005h
              ES:DI      指向SWCALLBACKINFO结构的指针
返回寄存器:进位标志清除表示成功
                    AX              0000h
                    进位标志置位表示系统不支持该功能
注释:客户程序必须在终止前发出这一调用,而不管其通报处理程序是由挂
接通报链调用还是建立通报链调用,然后加到通报链上的。
      在每次过程切换之前调用建立通报链功能来重新建立其通报链的任务切
换程序可以按兵不动地从该调用中返回。
      在服务于该调用的同时,任务切换程序还可允许中断,以及可以调用任何
一种MS-DOS系统功能。
服务功能0006h                                           版本5
                            询问API支持
    返回客户程序(为指定的API提供最高级别的服务)的SWAPIINFO结构地
    址。
    调用寄存器: AX            0006h
                BX            API ID号
                              0001h,NETBIOS接口
                              0002h,802.2接口
 
793页
                                0003h,TCP/IP接口
                                0004h,LAN Manager命名管道接口
                                0005h,NetWareIPX接口
                其它值都作为保留值
返回寄存器:进位标志清除表示成功
                AX              0000h
                ES:BX        指向SWAPIINFO结构的指针
                进位标志置位表示未成功
注释:在作出进行过程切换的决定之前,提供API支持的客户程序必须调用
该功能,以确定另一种客户程序是否会为同一API提供更高级别的服务。在
此过程中,如果系统返回了一个指向客户程序自己的SWAPIINFO结构的指
针,那么该客户程序必须决定是否要挂起过程切换。如果返回的指针指向其它
程序的SWAPIINFO结构,该客户程序就必须确定其它程序提供给同一API
的服务是否更高级。
    在此过程中,如果系统禁止了中断,那么任务切换程序就决不能再重新允许
中断或调用任何MS-DOS系统功能。
 
第22章 DoubleSpace参考手册
      DoubleSpace是随着DOS6的问世而出现的新功能之一。使用这种技术时,系统将采
用压缩格式将信息保存在磁盘上。并且,系统是在把信息写给磁盘之前将其压缩的,并在
读出信息之后对其解压缩。DoubleSpace使用了一种程序员的API,这种API允许访问保
存在DBLSPACE.BIN中的功能。当然,也只有在编写磁盘实用程序时,才需要用上这些
功能;对大多数程序员来说,DoubleSpace的诞生和实现是不言而喻的事情。
                      22.1 CVF结构
    DoubleSpace是利用一种称作压缩卷文件或CVF的结构来监视保存在压缩驱动器上
的信息。这种结构实现了一种扩展的FAT,并允许用户对驱动器空间实现更良好的管理。
同时,是CVF允许DoubleSpace在一扇区接着一个扇区的基础上分配文件空间,这与传
统的方式完全相反,按照传统方式,系统一次只能分配一个簇的空间。CVF的组成成分及
其顺序如下:
      ·一个BPB,基于DOS 4.0的BIOS参数块。它占有一个扇区长度。
      ·一个基于位的FAT,在这一系列的位中,每一个位代表着扇区堆(CVF的另一部
        分)一个扇区的分配状态。如果该位置位,则表明系统已分配了相应的扇区。CVF
        的这部分大小是不固定的。
      ·一个保留扇区
      ·一个扩展的FAT。这一系列的4个字节项是用来把簇映射给扇区堆(CVF的另一
        部分)的扇区的。
      ·一个由31个扇区组成的保留块。
      ·DoubleSpace驱动器的引导扇区,是在DOS5引导扇区的基础上变化而成的。
      ·一个未知长度的保留块。
      .一个普通的FAT。这是一个标准的DOS FAT;其长度可以变化。
      ·用于压缩驱动器的根目录。
      ·两个扇区的保留块
      ·扇区堆。一种共有60个扇区的结构,被用来保存在压缩驱动器上使用的扇区和簇
        数的有关数据。
 
795页
                      22.2 API功能
      本节在介绍DoubleSpace API时所采用的方式与本书介绍中断功能所用的方法是一
样的。所有的DoubleSpace功能都通过多路复用中断2Fh来处理的。它们都使用中断
2Fh,功能4Ah,子功能11h。而实际要用的API功能被装载在BX寄存器中。其它寄存器
可根据特定功能的需要来选用。
DoubleSpace       功能0000h                               版本6
                  获取版本号
    返回DoubleSpace版本号和其它各种有关信息。
    调用寄存器: AH            4A11h
                BX          0000h
    返回寄存器: AX            0000h
                BX            4440h
                CL            所用的第一个驱动器字母(0=A、1=B
                              等等)
                CH            所使用的驱动器字母数
                DX            DBLSPACE.BIN版本号
    注释:作为程序员来说,对该功能最感兴趣的项是通过CX返回的值。 CL返
    回的是DoubleSpace使用的第一个驱动器字母,而CH则表示系统使用了多少
    个驱动器。
    DoubleSpace     功能0001h                         版本6
                    获取驱动器映象
返回DoubleSpace版本号和其它各种有关信息。
调用寄存器: AX                4A11h
                BX         0001h
                DL            要检查的驱动器号(0=A,1=B
                              等等)
返回寄存器: AX                0000h(如果成功)
                BL            驱动器信息
                BH            驱动器顺序号
    注释:该功能返回与指定驱动器字母有关的DoubleSpace映象信息。在返回
 
796页
时应检查BL的高位。如果该高位置位,表明此驱动器是一个DOubleSpace驱
动器;如果该高位没有置位,表明驱动器没有使用DoubleSpace。如果驱动器是
一个DoubleSpace驱动器,则BL中的7个低位会指出宿主(物理)驱动器是定
位数据的地方。 BH保存的是CVF(压缩卷文件)使用的驱动器顺序号。
在返回时,如果该功能未成功,则AX为非零值。
DoubleSpace       功能0002h                             版本6
                  交换驱动器
把压缩驱动器与宿主驱动器的驱动器字母进行交换。
调用寄存器: AX              4A11h
              BX        0002h
              DL            要交换的DoubleSpace驱动器(0=A、1=B
                            等等)
返回寄存器: AX             状态(0表示成功,其它值表示出错代码)
注释:该功能可用来交换DOS用于引用驱动器的驱动器字母,能十分有效地
交换逻辑驱动器。其中必须有一个驱动器是DoubleSpace驱动器,其它驱动器
则是宿主(物理)驱动器,是DoubleSpace数据常驻的地方。在调用该功能时,
如果DL不是一个DoubleSpace驱动器,那么系统会返回某种错误。
Doublespace       功能0005h                             版本6
                  安装(Mount)驱动器
为指定驱动器创建一个CVF(压缩卷文件)。
调用寄存器: AX                4A11h
              BX           0005h
              DL              要使用的驱动器号(0=A、1=B
                              等等)
              ES:SI        激活记录(Activation-recorder)指针
返回寄存器: ES:SI          激活记录(Activation-recorder)指针
注释:正确地使用该功能所需要的代码是十分复杂的,并且Microsoft建议用
户采用一种较容易的方法即EXEC(执行)一份COMMAND.COM拷贝,并使
用DBLSPACE.EXE/MOUNT命令来创建CVF。
在调用该功能时,必须把DL设置为希望指定给驱动器的驱动器号,并且必须
让ES:SI指向激活记录结构。在返回时,可检查该结构中位于偏移值3处的
797页
字节,看看是否出现了错误(系统没有理由不通过AX返回出错代码)如果该
偏移值处的值为0表明未出错;否则,表明系统中已经出现错误。
DoubleSpace       功能0006h                               版本6
                    卸载(Unmount)驱动器
用于使DoubleSpace驱动器不活动。
调用寄存器: AX                4A11h
                BX         0006h
                DL            驱动器号(0=A,1=B等等)
返回寄存器: AX               状态(0表示成功,否则为出错代码)
注释:该功能的作用正好与功能0005h相反。它被用来解除对压缩驱动器的
支持。在该功能成功地返回之后,压缩驱动器就会变得不再可用。
DoubleSpace         功能0007h                               版本6
                    获取驱动器空间
返回指定驱动器上的总扇区数和自由扇区数。
调用寄存器: AX                4A11h
              BX              0007h
              DL              要检查的驱动器(0=A,1=B等等)
返回寄存器: AX                0000h(如果成功)
              DS:SI         记录指针
注释:通过把DL设置为某个压缩驱动器的驱动器号即可调用该功能。在返
回时,DS:SI指向一个8字节的记录,此记录表明了用于该压缩驱动器的空
间使用信息。其结构如下:
偏移值              长度              含      义
0000                 DWORD          驱动器上的总扇区数
0004                 DWORD          驱动器上的自由扇区数
DoubleSpace         功能0008h                               版本6
                    获取文件片段空间
返回用于指定驱动器的文件片段堆的容量。
798页
调用寄存器: AX                4A11h
              BX           0008h
              DL              驱动器号(0=A,1=B等等)
返回寄存器: AX                0000h(如果成功)
              BX              文件片段堆中的最大项数
              CX              自由项数
注释:在调用该功能时,DL必须为某个压缩驱动器的驱动器号。文件片段堆
可用来管理对某个压缩驱动器上各个文件的空间分配。通过BX返回的信息
表明了文件片段堆的最大容量,并且CX的值表明了可用的自由项是多少。
BX与CX的差值即为该功能已使用的项数。
    DoubleSpace       功能0009h                               版本6
                      获取附加信息
返回DBLSPACE.BIN分配的磁盘结构数。
调用寄存器: AX                  4A11h
                BX          0009h
                DL            驱动器号(0=A、1=B等等)
返回寄存器: AX                0000h(如果成功)
                CL            结构数目
注释:在调用该功能时,DL必须为某个压缩驱动器的驱动器号。通过CL返
回的值是DBLSPACE.BIN可分配的磁盘单元数。它与通过MaxRemovable-
Drives设置在DBLSPACE.BIN中的数字是相同的。
 (未完待续……)
原文地址:https://www.cnblogs.com/Chaobs/p/3838559.html