网络操作系统简单的驱动程序开发南京理工大学计算机科学与技术学院2简单的驱动程序开发•Windows驱动程序中重要的数据结构•设备的层次结构•WDM驱动程序的基本结构•驱动程序的编译和安装•作业:一个简单的U盘过滤驱动程序南京理工大学计算机科学与技术学院3Windows驱动程序中重要的数据结构•Windows驱动程序中重要的数据结构驱动程序对象(DRIVER_OBJECT)设备对象(DEVICE_OBJECT)设备扩展(DEVICE_EXTENSION)南京理工大学计算机科学与技术学院4•驱动程序对象每个驱动程序都有惟一的驱动程序对象与之对应,驱动程序对象是在驱动加载的时候,由内核的对象管理器创建。驱动程序对象使用DRIVER_OBJECT数据结构表示。驱动程序对象在DriverEntry函数中初始化。Windows驱动程序中重要的数据结构驱动程序对象的定义typedefstruct_DRIVER_OBJECT{CSHORTType;CSHORTSize;PDEVICE_OBJECTDeviceObject;ULONGFlags;PVOIDDriverStart;ULONGDriverSize;PVOIDDriverSection;PDRIVER_EXTENSIONDriverExtension;UNICODE_STRINGDriverName;PUNICODE_STRINGHardwareDatabase;PFAST_IO_DISPATCHFastIoDispatch;PDRIVER_INITIALIZEDriverInit;PDRIVER_STARTIODriverStartIo;PDRIVER_UNLOADDriverUnload;PDRIVER_DISPATCHMajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1];}DRIVER_OBJECT;typedefstruct_DRIVER_OBJECT*PDRIVER_OBJECT;南京理工大学计算机科学与技术学院6Windows驱动程序中重要的数据结构驱动程序对象的布局DeviceObjectFastIoDispatchDriverStartIoDriverUnloadMajorFunction……FastI/O例程StartI/O例程DriverUnload例程分发例程设备对象1设备对象2设备对象3设备对象n驱动程序对象南京理工大学计算机科学与技术学院7Windows驱动程序中重要的数据结构•设备对象每个设备都有一个设备对象,由驱动程序对象创建。设备对象使用DEVICE_OBJECT数据结构表示,用于保存设备特征和状态信息。南京理工大学计算机科学与技术学院8Windows驱动程序中重要的数据结构DEVICE_OBJECT数据结构定义typedefstruct_DEVICE_OBJECT{…struct_DRIVER_OBJECT*DriverObject;struct_DEVICE_OBJECT*NextDevice;struct_DEVICE_OBJECT*AttachedDevice;struct_IRP*CurrentIrp;ULONGFlags;struct_DEVOBJ_EXTENSION*DeviceObjectExtension;…}DEVICE_OBJECT;typedefstruct_DEVICE_OBJECT*PDEVICE_OBJECT;设备对象的结构DriverObjectNextDeviceAttachedDeviceCurrentIrpDeviceExtension……DriverObjectNextDeviceAttachedDeviceCurrentIrpDeviceExtension……DriverObjectNextDeviceAttachedDeviceCurrentIrpDeviceExtension……本层设备对象本层设备对象本层设备对象驱动程序对象上一层设备对象DriverObjectNextDeviceAttachedDeviceCurrentIrpDeviceExtension……南京理工大学计算机科学与技术学院10Windows驱动程序中重要的数据结构•设备扩展设备对象记录通用的设备信息,而设备扩展结构中记录与设备相关的特殊信息,通常包括:设备对象的反向指针设备状态或驱动环境信息中断对象指针设备扩展是驱动程序专用的,其结构必须在驱动程序头文件中定义。南京理工大学计算机科学与技术学院11设备的层次结构•Windows的驱动程序模型是层次结构的垂直层次结构水平层次结构南京理工大学计算机科学与技术学院12设备的层次结构•驱动程序的垂直层次结构通过分层结构,一个设备可以附加在另一个设备之上。设备的创建顺序是先创建底层PDO,再创建高层FDO,即从底层设备到高层设备,中间可能夹杂着各种过滤型驱动程序。设备对象由驱动程序创建,即每层设备对应着不同的驱动程序。底层设备对象通过AttachedDevice来寻找上层设备对象若设备的AttachedDevice指针为空,则说明已经是设备堆栈的顶部。上层设备对象通过在设备扩展中记录低一层的设备对象,从而可以找到下一层的设备对象。南京理工大学计算机科学与技术学院13设备的层次结构设备的垂直结构上层过滤驱动程序HighFiDOStackSize=4AttachedDevice功能驱动程序FDOStackSize=3AttachedDeviceLowFiDOStackSize=2AttachedDevice下层过滤驱动程序总线驱动程序PDOStackSize=1AttachedDevice创建创建创建创建南京理工大学计算机科学与技术学院14设备的层次结构•驱动程序的水平层次结构由同一驱动程序创建的设备对象之间具有水平层次关系。在水平层次关系中,驱动程序创建第一个设备对象,每一个设备通过NextDevice指针指向下一个设备对象。南京理工大学计算机科学与技术学院15设备的层次结构设备的水平结构DriverObjectNextDeviceAttachedDeviceCurrentIrpDeviceExtension……DriverObjectNextDeviceAttachedDeviceCurrentIrpDeviceExtension……DriverObjectNextDeviceAttachedDeviceCurrentIrpDeviceExtension……本层设备对象本层设备对象本层设备对象驱动程序对象南京理工大学计算机科学与技术学院16WDM驱动程序的基本结构•WDM驱动程序的基本结构头文件WDM驱动的入口程序AddDevice例程对PnP的处理对PnP的缺省处理对IRP_MN_REMOVE_DEVICE的处理缺省分发例程卸载例程南京理工大学计算机科学与技术学院17驱动程序的编译和安装•使用DDK编译环境DDK编译环境提供两种编译版本:checked版本和free版本。Checked版本是未优化的调试版本,包含调试符号,支持源代码级调试。Free版本是最终的发行版本,进行了必要的优化。DDK编译环境调用build工具编译和链接代码。编译驱动程序需要两个脚本文件:makefile和sources。南京理工大学计算机科学与技术学院18驱动程序的编译和安装Makefile文件指定文件之间的相互依赖关系,确定项目中那些文件需要编译。通常,驱动程序使用相同的makefile文件,DDK文档不建议用户修改makefile文件。Makefile文件中只包含一行语句:!INCLUDE$(NTMAKEENV)\makefile.defSource文件记录了需要编译的源文件名、包含目录路径、库目录路径等信息。//目标驱动程序名称TARGETNAME=HelloWDM//目标代码生成类别,DRIVER表示生成驱动程序,//PROGRAM表示生成Win32程序TARGETTYPE=DRIVER//驱动程序类型,此处是WDM驱动程序DRIVERTYPE=WDM//目标代码生成路径TARGETPATH=OBJ//包含目录路径INCLUDES=$(BASEDIR)\inc;$(BASEDIR)\inc\ddk;//该项目所有源文件SOURCES=HelloWDM.cpp南京理工大学计算机科学与技术学院20驱动程序的编译和安装•安装WDM驱动程序的加载需要INF文件,INF文件描述了驱动程序安装的过程。南京理工大学计算机科学与技术学院21作业:一个简单的U盘过滤驱动程序•功能实现一个简单的U盘过滤驱动程序,使U盘变成一个只读存储器。•开发环境VisualC++与DDK•开发语言C/C++•要求设计说明源代码(重要语句注释)南京理工大学计算机科学与技术学院22作业:一个简单的U盘过滤驱动程序•U盘设备驱动的拓扑结构USB总线PDOUSBSTOR.sys(FDO)USBSTOR.sys(PDO)DISK.sys(磁盘驱动)PartMgr.sys(分区驱动)过滤驱动程序创建