Windows DDK要点指南

<script language="JavaScript1.2" type="text/javascript"> </script>
<script language="JavaScript1.2" type="text/javascript"> if (document.layers) document.write(messages[0]) </script> <script language="JavaScript1.2" type="text/javascript"> if (document.layers) document.write(messages[1]) </script>
<script language="JavaScript1.2" type="text/javascript"> if (document.all){ document.writeln(' ') document.writeln('
') document.writeln('
') document.write(messages[0]) document.writeln('
') document.writeln('
') document.write(messages[1]) document.writeln('
') document.writeln('
') document.writeln('
') } </script>
介绍计算机硬软件发展与技术专题
这是一个反映个人专业和网上交流的个人网站
 
 
 

Windows DDK要点指南

微软 Windows 9x

设备驱动开发支持组

(OEM/IHV)

We Develop Developers

杨全胜翻译

 

常见问题(FAQ):

DDKGUIDE.DOC

产生时间:

199935
  

最后修改:

199954
 WINDOWS98 DDK要点指南.DOC

翻译时间:

1999113

Copyright © 1999 Microsoft Corporation.

 

目录表

介绍 *

有用的开始文档 *

使用什么样的DDK? *

可用的样本代码 *

DDK的开发做系统准备 *

需要用什么版本的VC++? *

安装和使用Windows 95 Windows 98 DDK的要点 *

概述l *

编译和连接 *

调试 *

Windows 95 的调试 *

Windows 98 的调试 *

SoftIce 的调试 *

调试二进制代码 *

Windows 95 系统调试二进制代码和符号文件 *

在哪找到它们 *

调试二进制和符号文件相关表 *

Windows 98 系统调试二进制代码和符号文件 *

技术细节主题 *

本地存储技术 I/O子系统 (IOS) *

IOS 基础 *

有用的参考材料 *

在哪找到样本代码 *

设置和编译样本代码 *

调试提示 *

Windows IOS版本历史 *

存储技术词汇表 *

 

介绍

本指南是为那些对Windows 95Windows 98设备驱动和通用VxD(虚拟设备驱动程序)的开发还是新手的软件开发者提供友好地帮助。

这篇文档的主要意图是帮助你找到一个快速的和非常有效的自学途径,来学习你感兴趣的特别技术。

一个姊妹文档, Windows 95/98 DDK资源数据库要点, 是一个指向被微软和第三方支持的DDK资源的大的数据库。

有用的开始文档

为了有一个正确的开始,这里给出一张常规资源的表,这些常规资源对任何的Windows 95/98DDK的开发者都是有用的。这个信息是从Windows 95/98 DDK资源数据库要点中用INTRO关键字查找后摘取出来的。

资源类型主题如何得到 解释
Book

Systems Programming for Windows 95Walter Oney (Microsoft Press). 1-55615-949-8(这是关于Windows95/98DDK开发的最根本的是。从地址http://www.oneysoft.com可以看看网上的勘误表和DDK注释
BookWriting Windows Device DriversDaniel Norton (Addison Wesley)

0-201-57795-X

通用VxD和驱动程序DLL信息)
BookWriting Windows Virtual Device DriversDavid Thielen and Bryan Woodruff (Addison Wesley) 0-201-62706-X (may be replaced by:) 0-201-48921-X通用VxD和驱动程序DLL信息
BookWriting Windows VxDs and Device DriversKaren Hazzah (R&D Publications)

0-13-100181-7

通用VxD和驱动程序DLL信息
BookWriting Windows VxDs and Device Drivers, Second EditionKaren Hazzah (R & D Books)

0-87930-438-3

通用VxD和驱动程序DLL信息,第二版本
InternetHardware Development for IHVs and OEMshttp://www.microsoft.
com/hwdev/
硬件开发站点,包括规范、资源和新闻
InternetMicrosoft Device Driver Development Support Resourceshttp://support.microsoft.
com/support/ddk
微软DDK工具、样例、第三方连接
InternetVireo Softwarehttp://www.vireo.com/VTOOLSD主页
MSDN The Little Device Driver WriterMSDN Library: http://msdn.
microsoft.com/

(Note 1)

介绍写Windows95WindowsNT硬件设备驱动程序,包括I/O模式驱动程序设计和调试策略
MSDN The VxD Writer Resource Book, or VxD Writing as a Martial ArtMSDN Library: http://msdn.
microsoft.com/

(Note 1)

一个虚拟设备驱动程序编程和一个全面的知识列表的概揽
MSDN What's New in Windows 95 for VxD Writers?MSDN Library: http://msdn.microsoft.com/ (Note 1)解释当移植它们的VxDsWindows95VxD编写器做的必要的的改变
MSDNMicrosoft Windows 95 Device Driver Kit(Supplied to MSDN Professional subscribers). Check Microsoft Web site http://msdn.microsoft.
com/developer
Windows95Windows98设备驱动程序的开始,对基于WDMWindows98设备驱动程序是没有用的。
MSDNMicrosoft Windows 98 Device Driver Kit(Supplied to MSDN Professional subscribers). Check Microsoft Web site http://msdn.microsoft.
com/developer
设备驱动程序的开始。包括支持WDM技术。可以在先面的地址上自由下载:http://www.microsoft.com/ddk.
MSDNMicrosoft Windows NT Driver Development Kit(Supplied to MSDN Professional subscribers). Check Microsoft web site http://msdn.microsoft.
com/developer
包含和Windows95/98发展也和Windows2000的发展相关的SCSI小型端口和WDM信息  ,可以在下面的地址免费下载:http://www.microsoft.com/ddk

 

19987月和后续版本的Windows95DDK CD-ROM中你可以很容易的找到可打印的文档,它们在/NEW95DOC路径下。注意这个路径在你安装DDK的时候是不会自动拷贝到你的硬盘当中,你必须采用人工方法来拷贝。

我自己更习惯于将经常引用的信息文档打印出来;你能注释打印的文本和添假快速指南的便签注释。我建议你将下面的“通用VxD开发”打印出来并将它们放到你的参考书架上:

/new95doc 文件夹中的文件名注释
UTILS.DOC如何使用WDEB386调试器,对于用SOFTICE开发也是有用的,因为它解释如何用调试二进制码和调试器命令。
VXDS.DOCVxD 文件n.
INTRO.DOC介绍 Windows 95 DDK.
KERNEL.DOC虚拟存储管理文件。一个大的文档,  我建议你用两面打印将它打印出来(当然,你的打印机要支持)。

 

使用什么样的DDK?

通常首选的是Windows 98 DDK因为它提供:

  • 很多的样本和很多有用的例子
  • 新的例子支持WDM技术
  • 用在Windows NT 4.0DDK中的 BUILD命令能够很容易建立样本例子
  • 更新文件

如果你用WDM技术开发驱动程序,或者驱动程序需要只在Windows98中具有的属性,那么你需要用Windows98 DDK

可用的样本代码

样本在Windows95Windows98中是可用的,样本文档能够在Windows98 DDK中找到或者在Windows95 DDK的/New95doc/intro.doc 中。

同样, 你能够用SAMPLE作为关键字在Windows 95/98 DDK资源数据库要点中搜索样本信息,包括第三方的可用样本。

DDK的开发准备系统

需要用什么版本的VC++?

根据你所开发的设备驱动程序的类型,你可以按照下表选用合适的C++编译器的版本:

Visual C++版本描述典型应用
1.52开发16位的应用。

最后的版本支持开发16位的应用。

系统属性页操作(不是32DLL是控制面板属性页)16位打印驱动程序DLLs
2.0 或更高的版本只能用来编译32位应用程序。2.0版本不被推荐用来编写设备驱动程序。
4.0被推荐用来用Widows95 DDKWindows 98 DDK来创建设备驱动程序的最低的版本。常规驱动程序和VxD的开发。
4.1作为一种设计的失误,不能用它建立VxDs(没有用)
4.2改正了4.1版本中不适合创建VxDs的问题。注意:为了成功创建在Windows95系统编程这本书中的样本驱动程序,可以参看下面地址中的使用说明:  http://www.oneysoft.com常规驱动程序和VxD的开发。
5.0被推荐的用来编译Windows98DDK中样本代码的最高版本的编译器。常规驱动程序和VxD的开发。
6.0没有使用。这个版本在有些情况下有命名冲突问题,使得它不适合创建VxDs没有用来和Windows 95 DDK Windows 98 DDK一起使用。

如果你有连接的问题,找出你所使用的LINK.EXE。可能的原因是你没有用Windows95DDK提供的LINK.EXE。用DOS下的SET命令检查你的环境路径设置,确定使用正确的LINK.EXE

 

安装和使用Windows 95 DDKWindows 98 DDK的要点

概述

不要依靠使用Windows 95 DDK中的 DDKDEBUG.BAT 批处理文件来将调试二进制代码拷贝到它们的目标路径中,除非你重新编辑过这个文件了。因为这个在DDK中提供的批处理不能将所有的调试二进制代码都拷贝到正确的目标文件夹中。更进一步的信息请参看本文的调试部分的内容。

Windows 95 DDK 还没有安装?

如果你的Windows95 DDK版本因为无法找到Win32 SDK而无法安装的话,你可能使用了一个老的版本,老板本将无法识别已经代替了Win32 SDK的新的SDK平台。如果是这样,并且你没有新的Windows95 DDK,采用下面的步骤:

  1. 安装Visual C++工具包。 (至少是2.00) 不要用Visual C++ 4.1.
  2. 如果使用Walter Oney的样本例子 (Windows 95系统编程中), 并且用Visual C++ 4.2编译, 查看Walter Oney's 站点http://www.oneysoft.com 中的附加说明。
  3. 由于你没有老的Win32 SDK, 安装SDK平台。编辑注册表以便Windows 95 DDK 安装程序确信 Win32 SDK 已经安装 (如果用老版本的Windows 95 DDK)。在注册表中 ,用REGEDIT来配置下面的注册树。

    HKEY_USERS/.Default/Software/Microsoft/Win32SDK/Directories

    创建一个新的注册关键字: 名字: Install Dir : C:/MSTOOLS.
  4. 安装Windows 95 DDK。如果不能安装,可能问题出在第三步的注册表编辑上,检查一下。
  5. DDK CD-ROM拷贝 Masm 6.11C c:/ddk/bin (e.g. copy d:/masm611c/ml.* c:/ddk/bin)。不要用masm611目录中的new-vars.bat文件因为它会破坏已经存在的环境设置。
  6. 如果你得到一个关于16位段问题和/COFF选项的错误消息,通常意味着你没有6.11C版本的MASM
  7. 如果你没有用在DDKREADME文件中指出的控制,用下面的命令来配置创建环境:

    pathtoddk
    /ddkenv [16|32] [area]
    pathtovc4bin/vcvars32 x86

 

编译和连接

环境空间不够

在编译DDK 样本的时候,一个常见的问题是运行时超出DOS环境空间。这个问题也回出现在 UTILS.DOC文档中。一个解决办法时在CONFIG.SYS文件中添加下面一行,然后从新启动系统:

Config.sys: shell=c:/command.com /p /e:4096

连接(linking)时的错误

当你编译一个VxD的时候,你很可能回得到下面类型的警告信息:

LINK : warning LNK4078: multiple "LCODE_vxdpn" sections found with different attributes

LINK : warning LNK4039: section "16ICODE_vxdpd" specified with /SECTION option does not exist

这些警告可以被忽略。如果你希望这些警告消失(更重要的警告和消息还是会显示的),你可以将下面的命令行选项加到你的连接描述中:

- ignore:4078 – ignore:4039

如果你得到一个异常的连接错误,看看你是否运行了一个错误的连接程序。确保你的环境中的路径的设置是指向Windows 95 Windows 98 DDK的连接器。

 

调试

Windows 95 的调试

关于WDEB386 调试器更详细的信息,请参看在Windows95DDK CD-ROM中的最新的文档(19987月),该文档在/New95doc/utils.doc中。

下面的程序和文件与Windows95 DDK的调试有关:

文件名解释
/DDK/DEBUG/WDEB386.EXE内核模式调试器
/DDK/DEBUG/RUNWDEB.BAT一个启动调试器的批处理文件。你必须编辑这个文件来指明你的远程终端在什么串行端口上等。
/DDK/DEBUG/RUNWDEB.WRF(由你产生的) 这个文件包含一个符号文件所在位置的表。参考RUNWDEB.BAT。在这个文本文件中的典型记号是:

/s:c:/ddk/diskvsd.sym

/s:c:/ddk/configmg.sym

/s:c:/ddk/ios.sym

/s:c:/ddk/esdi_506.sym

其中c:/ddk/ 是符号文件所在的路径。

(Your favorite terminal program)远程机器(用一个空调试解调器电缆)连接到你的测试机需要一个终端程序,比如:

? HyperTerminal (超级终端,Windows提供的)

? 无论是 RTERM程序 还是 RTERM98 程序(Windows 98 DDK中,Windows 95 DDK中没有)

 

Windows 98 的调试

一个新的内核模式调试器WDEB98Windows 98 DDK中已经可以使用了。 WDEB98 需要在远程一边使用一个专门的终端程序RTERM98, 它同样在DDK中支持。 WDEB98WDEB386的一个基本地提高版本,所以你可以用WDEB386 文件作为开始。你也可以用WDEB98调试器中的 ? .? 命令来获得WDEB98/RTERM98特性的列表。

下面的程序和文件和Windows98 DDK中的WDEB98调试有关:

文件名解释
/98DDK/BIN/WDEB98.EXE内核模式调试器
/98DDK/BIN/RUNWDB98.BAT一个启动调试器的批处理文件。你必须编辑这个文件来指明你的远程终端在什么串行端口上等。
/98DDK/BIN/RUNWDEB.WRF(由你产生的) 这个文件包含一个符号文件所在位置的表。参考RUNWDB98.BAT。在这个文本文件中的典型记号是:

/s:c:/ddk/diskvsd.sym

/s:c:/ddk/configmg.sym

/s:c:/ddk/ios.sym

/s:c:/ddk/esdi_506.sym

其中c:/ddk/ 是符号文件所在的路径。

/DDK/BIN/RTERM98.EXE当用WDEB98, 远程机器(用一个空调试解调器电缆)连接到你的测试机需要终端程序RTERM98

WDEB98部分附加的特性:

  • 支持RTERM98-side 符号,能够在空闲的时候装载和改变。
  • 限制原码级调试支持的级别。
  • 调试器现在能够感知Win32(不在为每个应用显示探测符号)
  • 更高的波特率支持(高于115.2Kbps)
  • 改变注册能在通过代码改变的时候改变颜色(Changed registers change color while stepping through code
  • 指令集更新到了奔腾级(PPro/MMX 将来会支持)
  • 多显示驱动能够立即被调试(对多显示系统)
  •  

已知的失误:

1. WDeb98 不能工作在 Windows 3.x

2. 有时候符号能装载两次(一次在RTERM98 一边, 一次在WDEB98 一边)

3. 当你需要看下面的数据流而做页上翻的时候RTERM98 的用户区域会快速的闪烁。

问题/回答:

Q. 我可以在WDeb98中使用旧版本的RTERM吗?

A. 不行。 RTERM98 WDEB98 现在是集成的产品你不能从RTERM98中将 WDEB98分离出来(尽管RTERM98仍然需要老板本的WDEB386)。

 

Q. 我如何安装WDEB98?

A. 人工安装WDEB98, 只要拷贝runwdeb.bat 行并将wdeb386.exe改成WDEB98.exe。如果要作为VxD安装,可以按上面的办法拷贝和修改,或者在system.ini 文件的[386enh]部分加上device=WDEB98.exe

Q. 我能够在运行原始的RTERM8Mb 386/20上运行RTERM98吗?

A. 行,虽然会慢点。大部分的调试代码被从WDEN98转变到了RTERM98。这表示了慢速的RTERM98机器意味着调试软件也慢。建议所有的RTERM98机器至少是486/66带有8MB内存。如果你希望将符号加载到RTERM98机器中,建议有16MB的内存。.

 

Q. 如何配置RTERM98 才能自动的在RTERM98那边自动加载符号?

A. 如下:

  1. Settings->Options->Symbol Search Paths.
  2. 输入你希望RTERM98在试图加载符号时搜索的路径。
  3. RTERM98 将在WDEB98启动的时候自动增加创建的号码(点击Environment tab 查看)。

如果想测试一下,中断一下运行并键入 .VMM L. 你将看到每个驱动程序的符号被自动装载进来。当你利用了列表后,键入LM就能列出所有的符号。

Q. 现在是如何分析符号的?

A. WDEB98 将先试着用老的方法分析装载到WDEB98一边的符号,然后需要RTERM98来分析符号。

注意: 由于WDEB98 用和WDEB386同样的方法来分析局部(WDEB98-side)符号,而且由于局部符号总是作为首先的目标,你必须避免装载Win32-应用或显示符号在WDEB98一边。为什么?如果你在局部装载Explorer.sym,所有应用将显示的和explorer.sym一样,就象Wdeb386。相似的,如果你装载局部显示符号,多显示卡将使用同一个显示符号,就象Wdeb386

Q. 我需要在一个还没有装载的符号中设置一个断点,我该怎么做?

A. 键入WA <component> 来装载符号。注意RTERM98只是确认.SYM的后缀并试图加载这些文件,从而加载了内核符号,你实际上希望用WA KRNL386替代WA KERNEL。一旦符号被加载,你可以象通常那样放置一个断点。

Q. 我如何在工作中得到粗略的源码级的调试?

A. 进入代码搜寻路径并键入你的部件源代码所在的路径。中断之后你就会看到你的源代码显示在弹出式窗口的右边。如果你没有看到,键入LN并确定你的部件的符号文件有行编号信息。

为了用源码级调试,你需要建立你自己的调试二进制代码以便它们包含行编号信息。比如,为了得到WDM驱动程序中的行编号,在/98DDK/inc/makefile.def文件中做如下的修改:

 

!IF "$(NTDEBUGTYPE)" == "windbg"

LINKER_DBG_TYPE = -debugtype:cv

!ELSEIF "$(NTDEBUGTYPE)" == "ntsd" || "$(NTDEBUGTYPE)" == "coff" || "$(NTDEBUGTYPE)" == ""

LINKER_DBG_TYPE = -debugtype:coff

!ELSEIF "$(NTDEBUGTYPE)" == "both"

LINKER_DBG_TYPE = -debugtype:map,coff (line 1138) ***********

 

!IF "$(NTDEBUG)" == "ntsd" || "$(NTDEBUG)" == "ntsdnodbg"

LINKER_DBG_SECTION=-debug:FULL (line 1276) ************

!ELSE

然后,确信在RTERM98Settings->Options->Code Search Paths指向源码的位置,以便在调试二进制代码的步骤中装载源码。

Q. 我如何关闭源码窗口?

A. 回到代码搜索路径(code search paths)属性页,去掉代码搜索路径,并在调试软件的提示中键入’R’。这个窗口就会隐藏。

Q. 我的机器在运行的时候经常会丢失一些特性或在屏幕上出现很多垃圾,我将怎么办?

A. 是的,如果你通过runwdeb.bat装载WDEB98,之后加/P(如果你用开关盒)或者/PX(如果你没有用开关盒)。所有的文本将发送进包中,并且那些包将被回送只到它们无损坏地通过串行端口电缆。注意你的有效波特率将会损失75%。然而你应该能够用提高波特率来补偿这个问题。

Q. 你们有关于用WDEB98做调试的更好的文章吗?

A. 注意WDEB98就象WDEB386那样工作,只是做了一些增强工作。

 

SoftIce 的调试

第三个选择是采用SoftIce 内核模式调试软件。在下面的站点上你能看到更多的信息:

http://www.vireo.com http://www.numega.com.

注意SoftIce也能够充分利用微软二进制调试器提供的特性(显示诊断声明和发布VxD点命令)。同样,你可以安装DEBUGCMD.VXD使SoftIce 能够用.P调试器点命令来探测线程信息。

 

调试二进制代码

(关于这个主题的更多的信息参看在19987月的Windows 95 DDK盘上的/NEW95DOC文件夹下的UTILS.DOC文档)

一旦你得到了调试器的基本工作,你可以开始增加调试二进制代码文件和符号文件。这个部分讨论这些文件是什么以及怎么用和为什么用它们。

调试二进制代码是Windows 95 Windows 98在相应的makefile文件中包含有DEBUG=1的声明情况下编译的典型的内核VxD

你没必要为运行和使用调试器而使用调试二进制代码。然而调试二进制代码在对你的VxD进行故障诊断中非常有用。

  • 调试二进制代码包含附加的代码来对调试器终端发布消息。这些消息包括有价值的情况信息、报警信息和错误信息。
  • 调试二进制代码专门包括了不在发售的驱动程序中的特别的调试器点命令操作代码(参见在WDEB386文件中的系统点命令(System Dot Commands)。点命令是用来显示那些只有支持点命令的驱动程序才有的内部数据结构的内容的。
  • 调试二进制代码执行附加的数据和指针的验证(比如用ASSERT功能)。比如,如果一个指针被发现是空的那么它不会在这一点上引起调试器自动地停止,因为调试二进制代码可以包含INT1INT3中断(参看在WDEB386文件 UTILS.DOC中的调试器中的中断)。
  • 如果符号文件是调试二进制代码VxD提供的,用它们,可以很方便地在代码中进行导航。

如果你的设备有运行在Windows 98下的能力,首选的调试平台是Windows 98,因为Windows 98 DDK 包括一个包含Windows 98调试二进制代码和符号的扩展集的文件夹。Windows 95调试二进制代码的可用性很小。

一个在使用调试器时经常发生的问题是调试二进制代码文件的不正确安装,由于使用了错误的操作系统版本,或者调试二进制代码拷贝到了一个错误的目录。

如果可能,执行操作系统和想要的应用软件的干净安装。然后安装WDEB98WDEB386(这个时候没有安装调试文件)。为了安装调试器,将系统在实模式下启动,添加命令来将调试器装入到/AUTOEXEC.BAT中,在DOS”pause” 命令之后,这样如果你用键盘的<ctrl+c>,就能放弃调试。

仅安装调试二进制和符号文件和你的项目有直接关系。调试二进制之间的唯一相关性是VWIN32.VXD, KERNEL32.DLL, KRNL386.EXE相联系(你必须将他们全部装上)。

 

Windows 95 系统调试二进制代码和符号文件

 

在哪找到它们

你必须决定在你的目标PC上究竟使用什么版本的Windows 95 我的电脑上击右键,然后点击属性,查看系统属性就能看到系统的版本信息了。在版本域后面附加的字母确定了已经安装的版本。

希望的目标版本:用在下面目录中的二进制代码:
Windows 95 Golden (version A):In the Windows 95 DDK CD-ROM
Windows 95 Version OSR2 (version B)http://support.microsoft.com/support/ddk
Windows 95 Version OSR2.1 (version B) USB Supplement (build 1214).

如果你的系统在%WINDIR%/SYSTEM/VMM32目录下包含NTKERN.VXD 文件,说明已经安装了USB附件。

http://support.microsoft.com/support/ddk

 

调试二进制和符号文件相关表

驱动程序文件名W9

5

OSR2OSR2.1需要在%WINDIR%Windows 目录)下的目标子目录 解释
bios.vxdXX /system/vmm32BIOS 计数器.
configmg.vxdX*X /system/vmm32配置管理器即插即用核心。支持调试器点命令 .CONFIGMG
ios.vxdX*X /system/vmm32输入输出子系统管理器。支持调试器点命令.I ?用于帮助。
vdd.vxdX*X /system/vmm32虚拟显示驱动器。
vdmad.vxdX*X /system/vmm32虚拟DMA驱动器。虚拟直接驱动器存取控制器芯片。
vflatd.vxdX*X /system/vmm32虚拟平面帧缓冲设备(显示)。
vkd.vxdX*X /system/vmm32虚拟键盘设备。
vmcpd.vxd X /system/vmm32虚拟数学协处理器设备。
vmm.vxdX*XX/system/vmm32虚拟存储管理器。包含所有的被VxDs使用的”MMCall” 内核服务。 
vpicd.vxdX*XX/system/vmm32虚拟可编程界面控制器驱动程序。虚拟PIC芯片。
vxdldr.vxdX*XX/system/vmm32VxD 加载服务,包括可移植执行格式文件。
ntkern.vxd  X/system/vmm32WDM 驱动程序支持,包括USB。调试器可用的点命令.NTKERN.
cdtsd.vxdXX /system/iosubsys安排CD-ROM存储设备的驱动器字母。
cdvsd.vxdXX /system/iosubsysCD-ROM “SCSI-izer”。补偿有SCSIIOP需求的供给端口驱动程序的需要的块。
disktsd.vxdXX /system/iosubsys为磁盘存储设备安排驱动器字母。
diskvsd.vxdXX /system/iosubsys磁盘 “SCSI-izer”。补偿有SCSIIOP需求的供给端口驱动程序的需要的块。
scsiport.pdrX*  /system/iosubsys对一个或更多的SCSI小型端口设备驱动程序提供接口,实现Windows NT SCSI 小型端口标准。
eisa.vxdXX /systemEISA 总线计数器。
isapnp.vxdXX /systemISA 总线计数器。
lptenum.vxdXX /system并行端口计数器。
ndis.vxdXX /system网络驱动器接口规范驱动程序。
pccard.vxdXX /systemPC (PCMCIA) 即插即用驱动程序。
pci.vxdXX /systemPCI 总线计数器。
debugcmd.tmpX  /system它是为线程观测调试器点命令(参看.P”)而安装的。为了使用它,将它的名字改成 DEBUGCMD.VXD, 将它放在文件夹/%WINDIR%/SYSTEM , 通过在SYSTEM.INI文件的[386Enh]片段中放置 DEVICE=DEBUGCMD.VXD 来装载它。
usbd.sys  X/system通用串行总线设备种类驱动程序部件(WDM)
openhci.sys  X/system打开主控制器接口驱动程序部分 (WDM)
uhcd.sys  X/system通用主控制器驱动程序(WDM)
usbhub.sys  X/system通用串行总线插座驱动程序 (WDM)

* 一个相应的符号文件(.SYM)也被提供给这个文件。

 

Windows 98系统调试二进制代码和符号文件

Windows 98 DDK Windows 98系统成分和驱动程序内核的很多调式版本。这些二进制代码是用作于在Windows 98 DDK中测试和调试驱动程序开发,它的位置在/DBG_SYM/RETAIL

下面是一个目前的在Windows 98 DDK中的二进制代码列表以及每个二进制代码需要被拷贝到的以便Windows 98可以从那装载这些代码的目录列表。调试符号文件也被包括,它们同样的主文件名,但是后缀是.SYM。请查阅关于如何用每个调试二进制代码的特殊调试属性信息的WDEB98系统调试器的文档。

注意:有依赖于WIN32.VXD, KERNEL32.DLL, KRNL386.EXE的版本。 你必须运行这些二进制代码的所有零售版本或者运行所有调试版本。混合使用这些二进制代码的零售版本和调试版本会导致Windows 98在启动的时候挂起或出现错误。

另外,你只需要安装那些和你的工作有关的技术的调试二进制文档就可以了。

如果当你正在用一个调试二进制代码进行调试的时候出现代码神秘消失的问题,你需要删除调试二进制代码而使用原始的(发布版本)代码。为了帮助调试零售版代码,你应使用它们在/DBG_SYM/RETAIL/路径下的相应的符号文件(*.SYM)。

你可以用微软Word的表格->排序选项,根据一个或多个列的内容为下面的表排序。比如,按需求的目标子文件夹排序将通过驱动程序在磁盘上的位置进行排序。

Windows 98 金版(第一销售版本)的调试二进制代码和和符号文件可以在Windows 98 DDK CD-ROM中找到,也可以在微软Web站点http://www.microsoft.com/ddk中找到。

驱动程序文件名类别需求的在%WINDIR%中的子文件夹解释
CMBATT.SYSAPM(高级电源管理)/system 
IRCOMM.VXDComm(通信)/system 
IRENUM.VXDComm/system 
IRLAMP.VXDComm/system 
IRLAPFRM.VXDComm/system 
LPTENUM.VXDComm/system并行端口计数器(enumerator
SERENUM.VXDComm/system串行端口计数器设备.
TAPI.DLLComm/system电话应用程序接口。
UNIMODEM.VXDComm/system 
VCD.VXDComm/system/vmm32 
VCOMM.VXDComm/system/vmm32 
VPD.VXDComm/system/vmm32 
VDD.VXDDisplay(显示)/system/vmm32虚拟现实驱动程序。
VFLATD.VXDDisplay/system/vmm32虚拟平面框架缓冲设备(显示)
DIBENG.DLLDisplay, Printing/system 
HID.DLLHID/system 
HIDCLASS.SYSHID/system32/drivers 
HIDPARSE.SYSHID/system32/drivers 
HIDUSB.SYSHID/system32/drivers 
JOYHID.VXDHID/system 
KBDHID.VXDHID/system 
MMHID.DLLHID/system 
MOUHID.VXDHID/system 
VJOYD.VXDHID/system 
VKD.VXDHID/system/vmm32虚拟键盘设备
VMOUSE.VXDHID/system/vmm32虚拟鼠标设备
MIDIMAP.DRVMultimedia/system 
MMCI.DLLMultimedia/system 
MMDEVLDR.VXDMultimedia/system 
MMSOUND.DRVMultimedia/system 
MMSYSTEM.DLLMultimedia/system 
MSACM.DLLMultimedia/system 
MSACM32.DLLMultimedia/system 
SYSAUDIO.SYSMultimedia/system32/drivers系统音频设备
USBAUDIO.SYSMultimedia/system32/drivers 
WDMAUD.DRVMultimedia/system(符号文件叫wdmdrv.sym).
WDMAUD.SYSMultimedia/system32/drivers 
WINMM.DLLMultimedia/system 
NDIS.VXDNetworking/system网络驱动程序接口规范驱动程序
NDISWAN.VXDNetworking/system 
NETDI.DLLNetworking/system 
PPPMAC.VXDNetworking/system 
VDHCP.386Networking/system 
VIP.386Networking/system 
VNBT.386Networking/system 
VTCP.386Networking/system 
VTDI.386Networking/system 
VUDP.386Networking/system虚拟用户数据包协议(UDP)设备服务
WAN.TSPNetworking/system 
ACPI.SYSOnNow/ACPI/system高级配置和电源接口驱动程序。
BATTC. SYSOnNow/ACPI/system电池驱动程序
COMPBATT.SYSOnNow/ACPI/system符合电池设备
EC.SYSOnNow/ACPI/system 
CBSS.VXDPCMCIA/CardBus/system 
PCCARD.VXDPCMCIA/CardBus/systemPC (PCMCIA)即插即用驱动
PKPD.DLLPen/system 
PKPD32.DLLPen/system 
BIOS.VXDPLUGPLAY/systemBIOS 计数器.
CONFIGMG.VXDPLUGPLAY/system/vmm32配置管理器即插即用核心。支持调试器点命令 .CONFIGMG.
EISA.VXDPLUGPLAY/systemEISA 总线计数器.
ISAPNP.VXDPLUGPLAY/systemISA 总线计数器.
PCI.VXDPLUGPLAY/systemPCI 总线计数器.
SPOOLSS.DLLPrinting/system 
UNIDRV.DLLPrinting/system 
SOCKETSV.VXDSocket Services/system普通套接字设备包
CDFS.VXDStorage/system/iosubsysCD-ROM 文件系统驱动程序.
CDTSD.VXDStorage/system/iosubsysCDROM类型的存储设备安排驱动字母。
CDVSD.VXDStorage/system/iosubsysCD-ROM”SCSI-izer”. 修正带SCSI需求块是IOP来满足端口驱动器的需要。
DISKTSD.VXDStorage/system/iosubsys为磁盘类型的存储设备安排驱动字母
DISKVSD.VXDStorage/system/iosubsys磁盘设备”SCSI-izer”. 修正带SCSI需求块是IOP来满足端口驱动器的需要。
IFSMGR.VXDStorage/system/vmm32可安装的文件系统管理器
IOS.VXDStorage/system/vmm32输入输出子系统管理器,支持调试器点命令;用 .I? 获得帮助
RMM.PDRStorage/system/iosubsys在没有设备32位保护模式驱动(或保护模式关闭)的情况下,用实模式驱动的直接I/O
SCSIPORT.PDRStorage/system/iosubsys提供一个或多个SCSI小型端口设备驱动,实现Windows NTSCSI小型端口标准。
UDF.VXDStorage/system/iosubsys通用数据格式文件系统驱动器。提供DVD设备
VFAT.VXDStorage/system/vmm32磁盘设备文件系统驱动器(所有的设备使用磁盘驱动的FAT结构)
VOLTRACK.VXDStorage/system/iosubsys卷跟踪用来提供可移动媒体设备,包括SCSI
GDI.EXESystem DLL/system16-bit DLL.
GDI32.DLLSystem DLL/system 
KERNEL32.DLLSystem DLL/systemWindows 98的核心部分
KRNL386.EXESystem DLL/systemWindows 98的核心部分
MAPI32.DLLSystem DLL/system 
SETUPX.DLLSystem DLL/system设备类安装程序(配置服务)。为显示适配器和鼠标服务的缺省安装程序。
USER.EXESystem DLL/systemWindows 98的核心部分 (16-bit DLL).
USER32.DLLSystem DLL/systemWindows 98的核心部分.
DEBUGCMD.VXDSystem VXD/system是线程探测点命令 .P。为了用它,将它放到 /%WINDIR%/SYSTEM 文件夹, 并且通过将 DEVICE=DEBUGCMD.VXD 放进SYSTEM.INI 文件的[386Enh] 片段来装载。
VDMAD.VXDSystem VXD/system/vmm32虚拟DMA驱动器。虚拟直接存储器存取控制芯片.
VMM.VXDSystem VXD/system/vmm32虚拟存储管理. 包含所有的用于VxDs”EMM Call “服务。
VPICD.VXDSystem VXD/system/vmm32虚拟可编程接口控制驱动器。虚拟PIC芯片。
VWIN32.VXDSystem VXD/system/vmm32Win32 应用程序可以通过CreateFile()来打开这个VxD以便存取MSDOS和其它的服务。
VXDLDR.VXDSystem VXD/system/vmm32VxD装载服务,包含可移植执行格式文件
MSVFW32.DLLVideo capture/system 
MSVIDEO.DLLVideo capture/system 
VFWWDM.DRVVideo capture/systemWindows 设备视频。
VFWWDM32.SYSVideo capture/system32/driversWindows 设备视频。
NTKERN.VXDWDM/system/vmm32WDM驱动程序支持,包括USB。调试器点命令使能: .NTKERN.
WMIDRV.SYSWDM/system32/drivers 
1394BUS.SYSWDM 1394/system32/drivers1394 总线计数器.
AHA899X.SYSWDM 1394/system32/drivers 
OHCI1394.SYSWDM 1394/system32/drivers 
TILYNX.SYSWDM 1394/system32/drivers1394 TI PCILynx 端口驱动器.
USBSCAN.SYSWDM Still Image/system32/drivers 
KS.SYSWDM STREAMING/system32/drivers 
KSCLOCKF.AXWDM STREAMING/system 
KSDATA.AXWDM STREAMING/system 
KSINTERF.AXWDM STREAMING/system 
KSPROXY.AXWDM STREAMING/system 
KSUSER.DLLWDM STREAMING/system 
KSYPINTF.AXWDM STREAMING/system 
MSKSSRV.SYSWDM STREAMING/system32/drivers 
STREAM.SYSWDM STREAMING/system32/drivers 
OPENHCI.SYSWDM USB/system32/drivers打开主控制器接口驱动器成分(WDM).
UHCD.SYSWDM USB/system32/drivers通用主控制器驱动(WDM).
USBD.SYSWDM USB/system32/drivers通用串行总线设备类驱动成分(WDM).
USBDIAG.SYSWDM USB/system32/drivers 
USBHUB.SYSWDM USB/system32/drivers通用串行总线HUB驱动 (WDM).
    

 

这个主题的更多的信息参看Windows 98 DDK中的HTML帮助文件,如果要打印出来,可以参看Windows 95 DDK中在/NEW95DOC文件夹中的UTILS.DOC

 

 

技术细节主题

下面部分以特殊的技术领域作为目标。关于感兴趣的技术领域的进一步的细节信息可以通过关键字在姊妹文档Windows 95/98 DDK资源数据库要点中搜索到。

 

本地存储技术 – I/O子系统(IOS)

这节考虑下面的硬件技术:

  • IDE 固定盘和可移动盘存储设备(磁盘驱动器, CDROM, DVD .)
  • SCSI 固定盘和可移动盘存储设备(磁盘驱动器, CDROM, DVD .)
  • 传统1.44MB 软盘技术
  • 用其他的诸如并行端口等硬件接口的存储设备
  • SCSI Pass through (连接在SCSI总线上的磁带驱动器、打印机和其他设备)

本节不讨论远程存储设备 (通过网络,用VREDIR.VXD, VSERVER.VXD,等存取的设备).

IOS 基础

下面的图表全面描述了分层VxDs结构和用以实现本地存储设备的设备驱动。

 

 

 

 

 

 

 

 

 

 

 

 

 

端口驱动器在IOS层的底部。很多存储技术设备驱动程序开发者用SCSI小型端口模式来和他们的硬件接口(图上的3031)。一个关于SCSI小型端口驱动程序常见问题解答可以在知识库文档中找到:“Q192605, TILE: MiniPort.exe - Writing SCSI Miniport Drivers for Win95/98.”

关于存储DDK文档可以通过“Storage technology”Windows 98 DDK 中找到。为了方便硬拷贝,这个文档在19987月版本的Windows 95 DDK CD-ROM中有一个Word版本,它在/New95doc/Storage.doc.

 

有用的参考材料

下面的书对存储技术非常有用。

标题作者Comments
Systems Programming for Windows 95Windows 95系统编程)Walter Oney (Microsoft Press). 1-55615-949-8参看 Walter OneyWeb站点,可得到书的勘误表和DDK注释: http://www.oneysoft.com
Inside the Windows 95 File System(深入Windows 95文件系统)Stan Mitchell (O'Reilly & Associates)

1-56592-200-X

参看 http://www.sourcequest.com/win95ifs. 这个Web站点包括一个很大的观察所有类型内核(包括可安装文件系统钩子)称为MultiMon的工具。还包括IFS(可安装文件系统)样本代码。
The SCSI Bus and IDE InterfaceSCSI总线和IDE接口)Friedhelm Schmidt (Addison-Wesley)

0-201-42284-0

SCSI IDE 硬件.
PC InternPC医生)Michael Tischer, Bruno Jennrich (Abacus)

1-55755-304-1

系统编程百科全书(重点是硬件).
The Book of SCSI(关于SCSIPeter M. Ridge (No Starch Press)

1-886411-02-6

SCSI 硬件、软件、 ASPI.
The Indispensable PC Hardware Book(不可缺少的PC硬件书)Hans-Peter Messmer (Addison-Wesley)

0-201-62424-9

包括硬件注册I/O的详细的硬件信息。

 

下面的知识库文章从微软的软件库中得到。这些文档包含不同的存储技术的常见问题答案。

标题解释
Q192602, TILE: IOSFAQ.exe - IOS Port Driver Frequently Asked Questions”IOSFAQ.exe 是一个包含IOS_Port_DriverFAQ.doc的文件. 当你在Windows 95/98 I/O 子系统下开发IOS端口驱动程序时会出现一些共性的问题,而这个文件就是针对这些问题的。
Q192603, TILE: DskDrive.exe – Removing/Adding Disk Drives Under Win95/98”DskDrive.exe 是一个包含 Disk_Drives.doc的文件。Windows 95 I/O 子系统 (IOS) 包含磁盘驱动字母和全部物理设备的删除和添加管理的内部机制。
Q192604, TILE: HotSwap.exe - Hot Swapping IDE or ATAPI CDROM Devices”HotSwap.exe是一个包含Hot_Swapping.doc的文件。这个文件讨论可用的选项来帮助希望配置能在Windows95启动后进行添加和删除的(热插拔)IDE硬盘驱动器或ATAPI CD-ROM驱动器的设备驱动程序开发者。
Q192605, TILE: MiniPort.exe - Writing SCSI Miniport Drivers for Win95/98”MiniPort.exe 是一个包含SCSI_Miniport_Drivers.doc的文件。这个文件作为在Windows 95 DDK中的SCSI小型端口文件 (STORAGE.DOC)的补充。
Q192606, TILE: MBtFAQ.exe - Windows 95 or Windows 98 Master Boot Record”MBtFAQ.exe是一个包含Mstr_Boot_Rec_FAQ.doc的文件。这个文件讨论如何开发能存取Widows95Windows98磁盘驱动器主引导记录、磁盘分区表和磁头/柱面/扇区级读写的设备驱动程序。磁盘加密产品和磁盘分区产品的开发者会发现这个信息非常有用。

 

在哪找到样本代码

下面的存储样本在Windows 95 DDK /Windows 98 DDK 中是可用的。

样本类型样本名称解释
SCSI Miniport DriverPC2X这是一个Iomega PC2x 8-bit SCSI识配卡的小型端口驱动程序。作为该样本的替代,我们推荐 ATAPI 小型端口样本。
SCSI Miniport DriverATAPI(Windows NT 4.0 DDK, 而不是在Windows 95Windows 98 DDK) 一个编译过后,能做到在Windows 95/98 Windows NT/2000之间二进制兼容的SCSI小型端口驱动程序。(但是如果Windows系统调用编译进的VMMCall,就不存在二进制兼容).
IOS Port DriverPORT这是一个IOS端口设备驱动程序样例,只作为开发新端口驱动程序的模板。它是用汇编语言编写出来的。端口驱动程序驻留在IOS分层结构的底层,并和存储设备的硬件进行通信。这个样例示范如何使用ILB_enqueue_IOP ILB_dequeue_IOP 以便适应可重用IOPs被送到驱动程序。
IOS Vendor Supplied DriverVSD这是一个IOS厂商供应驱动器设备驱动程序样例,只作为开发新VSD的模板。这种类型的驱动程序有时候称为助手VSDVSD驱动程序驻留在IOS分层结构的中间,在端口驱动器和文件系统驱动器之间。他们可以用来监视和过滤FSDs和端口驱动程序之间的通信。他们可以作为环3应用到环0IOS成分之间的接口。这个样例是用汇编语言写的。
IOS Vendor Supplied DriverPASSTHRU(在我们支持的WEB站点上: http://support.microsoft.com/support/ddk)。一个基于HELPVSD样例的VSD样例,它示范了如何用SCSI 通道(Passthrough)技术发布噎嗝命令到SCSI设备。
Win 32 ApplicationWNASPI一个用于Win32应用程序连接WNASPI32.DLL 输出功能的样本ASPI。这个应用示范一个应用程序如何发布pass-through命令到SCSI设备和ATAPI CD-ROMs。比如,磁带有效备份程序用这个机制。注意Windows95也使用WINASPI.DLL, 它用来支持和16Windows应用程序进行ASPI通信。

 

设置和编译样本代码

上面的代码在Windows 95 DDK环境中可以用NMAKE成功地进行编译,而在Windows98 DDK中使用BUILD。细节请参考相关的DDK

 

调试提示

在很多的技术领域,只安装调试二进制代码对你的设备驱动程序有影响,但只安装调试二进制代码提供点命令(见下面),因此你不要被发送给调试控制台的无用的信息困扰。细节可以查看调试二进制代码一节。

下面的调试器点命令摘自WDEB98或者WDEB386文件(utils.doc)。这些命令在用WDEB386, WDEB98SoftIce 内核模式调试器的时候使用。为了使用这些命令,你必须使用IOS.VXD的调试二进制版本。

命令参数必须安装的调试二进制代码注释
.I? IOS.VXDIOD命令的帮助菜单。
.IDCB<addr>IOS.VXD转储I/O 子系统设备控制块结构。
.IIOP <addr>IOS.VXD转储 I/O 子系统I/O包结构。
.IMED IOS.VXD转储 I/O 子系统存储成分描述符结构。用这个命令可以得到活动IOPs的地址。
.IDV DISKVSD.VXD and IOS.VXD现实盘 calldown/callup 统计。

 

Windows IOS 版本历史

下面的表列出了不同版本的操作系统下的存储技术的不同特性。

Windows 版本有区别的特性
Windows 95 Gold (original release) (Version A) 
OSR2 (version B)
  • * 添加了SMART 硬盘技术支持 (SMARTVSD.VXD).

    *  ESDI_506.PDR 被增加进来以便提供通过IDE 途径的SMARTVSD.VXD (看知识库文章 Q196550 and Q208048)

    *   修正了IOS.VXD 来允许正确地预取VSDs (看知识库文章Q192606主引导区记录FAQ 指南)

Windows 98 (original release)

电源管理添加ESDI_506.PDR 端口驱动器 (timed automatic disk spin down).

Windows 98 Second Edition

修正CDVSD 来提供第三方DVD SCSI 小型端口接口(参看知识库文章Q208048)

 

存贮技术术语表

下面的表列出用在IOS的通用缩写。“页码”列指出Walter Oney的书“WINDOWS 95系统编程”中的页码。

缩写详述页码描述
AEP异步事件包Asynchronous Event Packet546这是结构家族的祖先,用来将数据从IOS传送到VxDs中的异步回调过程。
BCBBlockDev命令块BlockDev Command Block509Win 3.1块设备客户程序  结构描述到Win3.1的命令发布(Win 95 IOS IOS客户调用)
BDDBlockDev 设备描述器BlockDev Device Descriptor509Win 3.1 块设备客户程序  结构描述Win3.1的驱动程序 (Win 95 IOS IOS客户调用).。添加到DCB结构。
CDB命令描述器块Command Descriptor Block530一个控制SCSIII)设备的域。典型的是610字节长度。
DCB设备控制块Device Control Block527一个物理或逻辑块设备的主要结构。主要类型是物理或(逻辑+物理),带有可选择的INT13CDROM结构扩展。
DDB*设备数据快Device Data Block522-25, 533, 555关于硬件物理信息,描述一个带有一个或多个附加设备的适配器,美意个带有一个DCB
DDB*设备描述块Device Description Block42,115, 116, 118-119仅有一个从带有包含VxD的执行文件传出的符号输出。
DRP驱动器注册包Driver Registration Packet 528在开始装载(登录)一个.VxD的时候使用,特别用来作为一个IOS驱动程序。
DVT驱动器向量表Driver Vector Table516为了管理设备驱动程序,IOS创建一个包含有关设备驱动程序信息的DVT结构的链,有它的文件名字和它的异步事件程序的地址/IOS开始加上一个DVT结构到它自己的链上,然后无论何时一个新的驱动程序或客户第一个登录到IOSIOS将加上一个新的DVT结构。IOS放置驱动程序的DVT结构的地址到ILB结构中,然而驱动程序需要避免修改DVT
FSD文件系统驱动器File System Driver508, 512定位在IOS之上,IFS管理程序之下。一个例子是VFAT
ILBIOS联结块IOS Linkage Block 519, 522包括指向IOS内部的入口的指针,端口驱动程序和value-added 驱动程序使用它来获得存取IOS的服务。

当开始装载一个.VxD时使用,它特别用作一个IOS驱动程序。DRP指向ILB。包含你的驱动程序可以用来调用选择的IOS出口的指针。

IOPIO请求包IO Request Packet535IOS客户(内部和/或外部)创建和取消;用作到/IOS机制通过的一个参数。
IORIO请求描述器IO Request Descriptor535嵌入进IOP。被一个IOS客户创建用作一个IOS参数通过机制。
IOS输入输出子系统Input Output Subsystem (or Supervisor)505

(Ch. 15)

包含所有IOS服务的静态VxD
IRSIOS请求器设备IOS Requestor Service516IOS提供它的客户的一组服务。
ISPIOS服务包IOS Service Packet522IOS用作一个到IOS服务的一个参数通过机制。
SGD分散/聚集描述器Scatter/gather Descriptor530有两个不同的结构和这个缩写有关:物理SGD 和虚拟SGD。参看最近的STORAGE.DOC 文件。
SRBSCSI请求块SCSI Request Block530一个用来对SCSIII)设备发布命令的结构。用来和SCSI小型端口驱动程序通信。
TSD特殊类型驱动程序Type-Specific Driver512-513, 529, 601一个全面负责特殊类型设备的驱动程序,比如磁盘驱动程序(DISKTSD.VXD)CD-ROM驱动 (CDTSD.VXD)。用来安排驱动器字母到磁盘分区。
VRP卷请求参数块Volume Request Parameters Block543描述安装在特殊设备上的卷。
VSD提供向量驱动程序Vendor-Supplied Driver567calldown堆栈中的驱动程序,通常用于SCSI。参看在系统中的每个DCBAEP_CONFIG_DCB 事件(一个端口驱动程序仅参看创建它的设备的事件)
  • 缩写语 DDB 有两个定义, 设备数据块(Device Data Block, 和设备描述块(Device Description Block)。

 

<script language="JavaScript1.1" src="http://ipseeker.cn/showip.php?user=22737&style=0" type="text/javascript"></script>
IP探索者您来自 202.105.138.149 (广东省 深圳市)
爱的根源交友网】【摄影之家】【身份证号查询】【手机号码所属地查询
CopyRight © 2003
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值