我们来看程序的第4行,这里有一个判断语句,它是在判断插入的设备是否是USBMSC_INTERFACE_CLASS类型的,这个常量是在usbmsc.h文件中定义的,也就是说如果设备不是USB存储设备,那么就结束这个函数,也就是此驱动只能处理USB存储设备。
当发现设备符合此驱动程序的要求后,就通过函数ParseUsbDescriptors()来解析这个设备,这个函数在下面的程序中将被实现,我们可以看一下该函数的函数体,很显然,它是在为设备进行各种配置,这就不多说它了。
再往下,分配内存,设置标志,从注册表中读取信息。注意,这里读取到的注册表信息是Drivers\\USB\\ClientDrivers\\Mass_Storage_Class和bInterfaceSubClass变量组合成的注册表键下的值,具体可参阅源程序,这个注册表键下放置的内容是 [HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers\Mass_Storage_Class\6] "DLL"="USBDISK6.DLL" "Prefix"="DSK" "Folder"="USB Disk" "IOCTL"=dword:4 "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}" 由此可以看出,通过此处的注册表读取,驱动程序可以知道这个设备将通过哪种形式以及哪个DLL向操作系统提供接口。同时也为后续的操作进行了准备。
最关键的部分就在接下来的LoadDriver()那句,加载了另一个驱动程序的DLL文件,就是上述注册表中的USBDISK6.DLL文件,计数器增一,取到该文件中UsbDiskAttach函数及UsbDiskDetach函数的地址,注册事件通知处理函数,然后调用了该DLL文件中的UsbDiskAttach函数。
由此可见,USB设备驱动程序有两层功能,一方面是识别出指定的设备并进行配置,另一方面按照要求调用更高层的驱动程序来向操作系统提供接口。当调用了USBDISK6.DLL后,操作系统就会按该文件中的程序以一个磁盘的形式或文件夹的形式进行处理,通过文件系统的操作,就可以对其进行读写控制了。我们也可以看一下HID设备的这个函数,它也是通过这种方式让操作系统知道把USB设备识别成鼠标设备的。
前文我们说过还有一个通知消息的回调函数,我们在刚才的程序体中已经发现通过: UsbFuncs->lpRegisterNotificationRoutine( hDevice, UsbDeviceNotify, pUsbDevice ); 语句已经对这个函数进行了设置。我们再向下来看一下这个函数的函数体。这个函数很简单,只要对USB_CLOSE_DEVICE消息进行处理,既然是要关闭USB设备,那么调用USBDISK6.DLL中的Detach函数是必须的,让上层的驱动程序进行释放,然后将引用计数减一,如果不再有设备引用此驱动程序,则FreeLibrary(),仅此而已。
其余的函数可以再仔细研究一下,在此就不详细描述了,接下来我们要弄明白的就是到底操作系统是如何通过抽象的DISK读写具体的设备呢? |
相关推荐
随着USB设备的不断增加,我们这些开发人员也就多了对USB设备进行驱动程序开发的工作。但是对于很多初学者来说,存在以下三个困难: 一是对WinCE的驱动程序结构了解得太少,没办法得心应手的专注于驱动程序的开发...
### USB 驱动程序导读 ...通过对WinCE框架的深入理解和样例程序的研究,您可以有效地克服开发过程中遇到的挑战,并最终开发出高效且可靠的USB设备驱动程序。此外,掌握这些知识还将为未来的项目打下坚实的基础。
第7章 Linux设备驱动程序开发 7.1 设备驱动概述 7.1.1 设备驱动和文件系统的关系 7.1.2 设备类型分类 7.1.3 内核空间和用户空间.. 7.2 设备驱动基础 7.2.1 设备驱动中关键数据结构 7.2.2 字符设备驱动开发 ...
**图10.1 USB设备驱动指针结构体** USB驱动程序使用了0x10000050至0x10000180地址范围内的片上RAM。应用程序不应该使用这个地址范围内的内存。对于使用片上USB驱动程序的应用程序,应该适当地修改连接器控制文件,...
标题“USB转串口驱动.rar”表明这是一个包含USB到串口转换器的驱动程序集合,这类设备常用于连接单片机、嵌入式系统或工业设备,以便通过计算机的USB接口进行通信。在描述中提到的“常见USB转串口驱动”,意味着这个...
在该系统上,可能需要通过USB转串口驱动来连接PC进行程序下载、调试或数据传输,因为TQ2440开发板可能没有直接的USB设备接口或者需要更灵活的数据通信方式。 在提供的标签“win7”中,我们理解这个话题主要关注...
1. **Windows驱动**:在"windows"目录下,通常会包含适用于不同Windows版本(如Windows XP、Windows 7、Windows 8及更高版本)的驱动程序安装文件。这些文件可能包括.inf和.cat文件,它们是Windows设备安装过程中...
- **PCI 设备与内核交互**:类似于 USB 设备,PCI 设备也需要通过特定的驱动程序与内核进行交互,以实现对设备的初始化、配置和数据传输等功能。 ### SCSI 设备支持 - **SCSI (Small Computer System Interface)**...
1. 深入剖析windows mobile启动过程 1 2. WinCE驱动开发学习笔记 11 3. 在Windows CE增加自定义中断处理 12 4. WinCE NK.bin与NK.nb0 13 ...8. wince下USB设备驱动程序导读 23 9. Windows CE 下应用程序自动启动 31
LINUX内核源代码导读 ...http://www.eoeandroid.com/thread-198472-1-1.html 精通LINUX设备驱动程序开发中文扫描版36M http://www.eoeandroid.com/thread-198291-1-1.html 精通Android游戏开发中文扫描版完整版40M ...
在Linux系统中,HUB驱动程序管理USB集线器,允许连接多个USB设备,并且会讨论如何处理拓扑变化和设备分配。 “Linux那些事儿之我是U盘.pdf”将关注通用串行总线(USB)闪存驱动器。这部分会解释Linux如何识别和处理...
《Linux那些事》系列文档包含了Linux操作系统的深度解析,涵盖了从基础到核心的多个方面,旨在帮助学习者深入了解Linux内核及其驱动程序的工作原理。这个压缩包提供了九个章节的内容,涉及了USB、PCI、SCSI、Block层...
- **兼容性**:尽管PCI Express采用了全新的技术架构,但它在软件层面上与PCI保持了良好的兼容性,这意味着开发者可以利用现有的PCI驱动程序来支持PCIe设备。 #### 四、总结 PCI总线和PCI Express总线是现代计算...
3-5-2 驱动程序的编写 3-5-3 中断与异常处理 3-6 调试技术 3-6-1 仿真软件 3-6-2 目标平台上的调试 3-6-3 硬件辅助调试 3-7 您必须了解的事情 3-7-1 常见的错误处理 3-7-2 程序技巧 3-8 总览 第4章 信息...
- **软件开发**: 附带了基础的驱动程序和简单的控制代码,适合初学者逐步掌握PWM控制原理。 #### 四、配套学习资源 1. **009 赠送学习资料** - 包含了大量的参考资料和技术文档,有助于加深对机械臂工作原理的...
178 3-4-1 系统开发 178 3-4-2 编译 183 3-4-3 链接 189 3-4-4 重新定位 191 3-4-5 下载 192 3-5 沟通软件与硬件的桥梁 194 3-5-1 由说明书认识硬件组件 194 3-5-2 驱动程序的编写 ...
这部分内容提供了所有外围器件的地址分配表,这对于编写正确的驱动程序至关重要。 - **最小系统**:最小系统是指最少数量的组件组合,用于验证硬件是否能正常工作。这部分内容展示了构建一个能够启动并运行简单程序...