USB系列之九:基于ASPI的U盘驱动程序

USB系列之七和之八介绍了ASPI,并通过一些实例说明了基于ASPI的编程方法,本文使用前两篇文章介绍的知识以及以前介绍的有关DOS驱动程序下驱动程序的内容实际完成一个简单的基于ASPI的U盘驱动程序,算是对ASPI应用的一个总结。
    在《USB系列之六》中,我们完成了一个简单的基于DOSUSB的U盘驱动程序,实际上我们今天的程序是在那个程序的基础上改的,基本结构完全相同,思路也完全一样,只是由于有ASPI的支持,无需再读取各种描述符表,读盘、写盘的操作也显得简洁了很多,希望对本文有兴趣的读者首先了解一下《USB系列之六》中程序的结构和思路,并认真理解《USB系列之七》、《USB系列之八》两篇文章。
    下面是本文涉及的基于ASPI的U盘驱动程序的源程序的下载地址:
    http://blog.hengch.com/source/aspiusb.zip
    程序本身没有什么可说的,因为如果仔细研究过《USB系列之六》的读者应该对程序结构非常熟悉,变化最大的部分当属初始化部分,另外几个子程序:readSec、writeSec、isReady和readCapa和《USB系列之六》中完全不一样,但概念也是一样的,都是请求device执行一个SCSI命令,其它部分连代码都是一样的,下面仅就其中的一些个人认为比较有特点的地方说一下:

    • 在标号begin后面有大约10几行的程序被注释掉了,这是专门为初始化部分调试编的,这段程序首先构造了一个Request Header,然后把驱动程序的中断例程地址压入堆栈,使ES:BX指向这个Request Header,最后跳到程序的策略例程上执行,当策略例程执行完后的retf指令将使程序直接执行中断例程(因为前面在堆栈里压入了中断例程的地址),这种方法我们已经多次用到,这样,只要我们把这个程序用debug调入到地址偏移0的位置,把ip寄存器改为0,就可以跟踪初始化部分的运行了,这是一种调试驱动程序初始化部分的方法。
    • 关于BPB表的返回很有意思。在初始化部分,最后在Request Header中返回BPB时,需要返回BPB指针的指针,所以在程序中有一个bpb_ptr的变量,初始化时一定要返回这个变量的段地址和偏移地址,而不是返回BPB表的段地址和偏移地址;但在驱动程序执行Get BPB调用(Command Code = 2)时,返回的却是BPB的段地址和偏移地址,而不是bpb_ptr这个变量的段地址和偏移地址,不知道我说清楚了没有。之所以强调这一点,是因为我在《USB系列之六》中的基于DOSUSB的驱动程序中,在初始化部分返回的不对。
    • 程序中可能还残留着一些基于DOSUSB的U盘驱动程序中的已经没有用的变量,请不要介意,自行删掉吧。
时间: 2024-10-08 12:51:23

USB系列之九:基于ASPI的U盘驱动程序的相关文章

USB系列之八:透过ASPI执行SCSI命令

在<USB系列之七>里我们介绍了ASPI的规范,并对一系列ASPI的命令做了测试,其中的02号命令是执行SCSI命令,我们专门在这篇文章中介绍,在<USB系列七>中,我们已经了解了调用ASPI的方法,主要是要填一个SRB(SCSI Request Block)的表,在以前的<USB系列之三:从你的U盘里读出更多的内容>文章中我们通过DOSUSB已经实现了许多SCSI命令,这些命令包括: SCSI INQUIRY Command SCSI READ CAPACITY (1

USB系列之六:基于DOSUSB的简单U盘驱动程序

首先要说明的是,该驱动程序仅实现了部分块设备的功能,如果作为成品软件使用,会感觉性能比较差,而且有些功能(比如FORMAT)是不能完成的,发表此驱动程序的目的旨在说明USB的编程原理以及DOS下驱动程序的工作原理:同时要说明的是,此驱动程序仅支持32M(包括32M)以下的U盘,当然这个问题解决起来并不困难,有兴趣的读者可以在阅读本文并理解的基础上加以改进使其支持32M以上2G以下的U盘.    前面的博文中提到由于DOSUSB是在命令行加载的,如果从config.sys中加载这个基于DOSUSB

USB系列之三:从你的U盘里读出更多的内容

U盘是我们最常使用的一种USB设备,本文继续使用DOSUSB做驱动,试图以读取扇区的方式读取你的U盘.    本文可能涉及的协议可能会比较多.一.了解你的U盘    首先我们用上一篇文章介绍的程序usbview.exe去看一下你的U盘,我在本文中用于测试的U盘情况如下: Device Descriptor: (设备描述符) USB Address: 1 Length: 18 Descriptor Type: 1 USB Specification nr.: 0x0110 Calss Code:

USB系列之七:ASPI介绍及命令测试

在以前的一篇博文<关于构建DOS下编程平台的总结>中曾经介绍了一种在DOS下驱动U盘的方法,我们大致回顾一下.在config.sys中加入两个驱动程序,就可以驱动U盘:    device = aspiohci.sys    device=di1000dd.sys    这两个驱动程序在上述博文中有下载.    如果大家仔细地阅读过我关于USB的文章的话,应该对OHCI这个东西不会陌生,在USB系列文章中,用大量的篇幅介绍了OHCI,这是因为OHCI这种符合USB1.1的控制器在使用上比UHC

USB系列之五:用汇编实现的一些USB功能

前面的USB系列一至四,实现了我们需要的一些USB功能,但都是用C语言的32位代码,之后我们插进了三篇关于DOS下设备驱动程序的文章,我们现在应该清楚,当我们要在DOS下写一个U盘的驱动时,最好使用汇编语言,而且不得不在实模式下编程. 基于这样一个原因,本文计划把<USB系列二>到<USB系列四>中的三段程序代码,用汇编语言再重新实现一遍,而且使用16位的8086模式编程,在下载下面的源代码之前,希望读者能够认真阅读USB系列以前所有的文章,最好能把其中的代码都看明白并亲自试一试,

单片机入门指南系列(九) 用万用焊板搭建实验电路

原文发表自我的个人主页:http://purplesword.info/mcu-primer-9 ,欢迎大家访问,多谢支持~ 这一篇我们继续上篇的话题,讲解自己搭建电路的另一种方法:用万用焊板搭建电路.在此之前,先普及几点基础知识. 1.电路板 首先我们了解下电路板.前面介绍了面包板可以搭建电路,但是在实际制作出来的电子设备中,我们用的通常都是电路板.电路板主要用于固定元器件,对元器件之间进行可靠的连接. 电路板基板常用不易燃烧的玻璃纤维.酚醛树脂.电木等材料制作.电路连接使用附着在其表面的铜皮

CRL快速开发框架系列教程二(基于Lambda表达式查询)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

solr与.net系列课程(九)solr5.1的配置

solr与.net系列课程(九)solr5.1的配置 最近一些园友来咨询solr5.1的配置方式,然后我就去官网下载了个最新版本的solr,发现solr5.0以后solr的下载包里的内容发生的变化,移除和添加了一些文件,这就导致solr的初始配置不一样了,导致一些园友学习solr时不得不下载以前的solr版本进行学习,为了与时俱进不被淘汰,所以的就在这里加一篇solr5.1的配置方式,希望大家少走一些弯路. 1.下载Tomcat与solr并解压(安装前先装jdk) Tomcat解压后磁盘路径为C

Unity3D脚本中文系列教程(九)

Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 operator bool 这个物体存在吗?Instantiate 克隆original物体并返回这个克隆.Destroy 移除一个游戏物体.组件或资源.DestroyImmediate 立即销毁物体obj.强烈建议使用Destroy代理.FindObjectsOfType 返回所有类型为type的激活物体