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盘驱动程序中的已经没有用的变量,请不要介意,自行删掉吧。
USB系列之九:基于ASPI的U盘驱动程序的更多相关文章
- USB系列之八:透过ASPI执行SCSI命令
在<USB系列之七>里我们介绍了ASPI的规范,并对一系列ASPI的命令做了测试,其中的02号命令是执行SCSI命令,我们专门在这篇文章中介绍,在<USB系列七>中,我们已经了 ...
- USB系列之六:基于DOSUSB的简单U盘驱动程序
首先要说明的是,该驱动程序仅实现了部分块设备的功能,如果作为成品软件使用,会感觉性能比较差,而且有些功能(比如FORMAT)是不能完成的,发表此驱动程序的目的旨在说明USB的编程原理以及DOS下驱动程 ...
- USB系列之三:从你的U盘里读出更多的内容
U盘是我们最常使用的一种USB设备,本文继续使用DOSUSB做驱动,试图以读取扇区的方式读取你的U盘.本文可能涉及的协议可能会比较多. 一.了解你的U盘 首先我们用上一篇文章介绍的程序usbvi ...
- USB系列之七:ASPI介绍及命令测试
在以前的一篇博文<关于构建DOS下编程平台的总结>中曾经介绍了一种在DOS下驱动U盘的方法,我们大致回顾一下.在config.sys中加入两个驱动程序,就可以驱动U盘:device = a ...
- USB系列之五:用汇编实现的一些USB功能
前面的USB系列一至四,实现了我们需要的一些USB功能,但都是用C语言的32位代码,之后我们插进了三篇关于DOS下设备驱动程序的文章,我们现在应该清楚,当我们要在DOS下写一个U盘的驱动时,最好使用汇 ...
- Keil MDK STM32系列(九) 基于HAL和FatFs的FAT格式SD卡TF卡读写
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- CRL快速开发框架系列教程九(导入/导出数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十九】
<Web 前端开发精华文章推荐>2013年第七期(总第十九期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...
随机推荐
- android核心分析--转
http://blog.csdn.net/column/details/androidcore.html http://simon-fu.vicp.cc/?p=999 http://www.uml.o ...
- qt info.plist 添加
http://www.waitingfy.com/archives/1242 http://www.sollyu.com/settings-icon-under-the-qt-mac-applicat ...
- windows 守护进程
use Win32::Process::Info; while (1==1){ use Sys::Hostname; use HTTP::Date qw(time2iso str2time time2 ...
- RedHat9通过Host-only配置网络连接
首先我用的是VMware8版本安装的RedHat9.VMware给我们提供了三种让虚拟机里的安装系统连上网的方式.分别是Host-only,Bridge,NAT.我要讲的是Host-only. 第一步 ...
- Linux 文件系统同步
同步就是将物理内存中dirty的页写入到磁盘中,保证磁盘和物理页之间的内容一致. 触发同步操作的时机: 1.周期性内核线程,扫描脏页,根据一定的规则选择脏页,将页写回到磁盘. 2.如果内核中的脏页过多 ...
- linux下的守护进程及会话、进程组
守护进程.会话.进程组网上有许多不错的资料.我也是网上搜罗了一堆,加上自己的理解.不敢说原创,只是写在这怕自己忘记罢了.才疏学浅,难免有错误,欢迎大家指正.下面这篇写很不错,大家可以去看看:http: ...
- LinQ to SQL 增,删,改 代码演示
NorthwindDBDataContext dc = new NorthwindDBDataContext(); protected void Page_Load(object sender, Ev ...
- php 站内搜索 多表 分页
借鉴了:http://blog.chinaunix.net/uid-20787846-id-3488253.html 这篇文章 ,在此基础上增加了分页功能 <?php /* 关键字 */ $ke ...
- 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找
千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...
- 【解决方法】EasyUI DataGrid不显示滚动条时,没有数据的问题
解决方法 于dataGrid例如,下面的代码被添加到的定义: JavaScript Code 1 2 3 4 5 6 7 8 9 10 onLoadSuccess : function (data ...