WDMWDM驱动程序的基本驱动程序的基本结构结构sigang@mti.xidian.edu.cnsigang@mti.xidian.edu.cn内容内容两个基本的数据结构两个基本的数据结构两个例程两个例程两个基本的数据结构:两个基本的数据结构:WDMWDM驱动程序里面的两个基本的数据结驱动程序里面的两个基本的数据结构:驱动程序对象和设备对象构:驱动程序对象和设备对象C++C++中的方法,成员中的方法,成员LinuxLinux中中两个基本的数据结构:两个基本的数据结构:驱动程序对象代表着这个驱动程序,它包驱动程序对象代表着这个驱动程序,它包含指向驱动程序各个分发例程的指针,以含指向驱动程序各个分发例程的指针,以供操作系统在合适的时候调用供操作系统在合适的时候调用设备对象是一个硬件设备的具体实例,保设备对象是一个硬件设备的具体实例,保存有关这个设备的数据。存有关这个设备的数据。一个驱动程序可以产生多个设备对象,每一个驱动程序可以产生多个设备对象,每个设备对象都有自己特定的数据,但是这个设备对象都有自己特定的数据,但是这些设备使用的都是驱动程序对象里面包含些设备使用的都是驱动程序对象里面包含的同一组例程。的同一组例程。驱动程序对象驱动程序对象I/OI/O管理器用一个驱动程序对象来代表每一个设备管理器用一个驱动程序对象来代表每一个设备驱动程序驱动程序驱动程序对象对我们来说就是一个大的数据结构驱动程序对象对我们来说就是一个大的数据结构并不是每一个数据成员我们都能访问,有一些数并不是每一个数据成员我们都能访问,有一些数据成员是系统使用的,我们不能进行操作据成员是系统使用的,我们不能进行操作驱动程序设计的时候,会遇到更多的像这样的,驱动程序设计的时候,会遇到更多的像这样的,我们不能直接操作其所有的数据成员的对象,比我们不能直接操作其所有的数据成员的对象,比如设备对象和如设备对象和IRPIRP对象等等。对象等等。驱动程序对象驱动程序对象DDKDDK中驱动程序对象的定义是这样的:中驱动程序对象的定义是这样的:typedeftypedefstructstruct_DRIVER_OBJECT_DRIVER_OBJECT{{CSHORTCSHORTType;Type;CSHORTCSHORTSize;Size;…………}}DRIVER_OBJECT,DRIVER_OBJECT,*PDRIVER_OBJECT;*PDRIVER_OBJECT;具体的各个成员如下图所示,里面的灰色成员表具体的各个成员如下图所示,里面的灰色成员表示我们不能直接访问,就像示我们不能直接访问,就像C++C++中的私有成员一中的私有成员一样。样。驱动程序对象各个成员介绍驱动程序对象各个成员介绍DeviceObjectDeviceObject(PDEVICE_OBJECT)(PDEVICE_OBJECT)成员是一成员是一个这个驱动程序产生所有设备个这个驱动程序产生所有设备对象的连接,通过这个指针,对象的连接,通过这个指针,驱动程序维护所有它产生的所驱动程序维护所有它产生的所有设备对象。有设备对象。DriverExtensionDriverExtension(PDRIVER_EXTENSION)(PDRIVER_EXTENSION)成员成员所指向的数据结构只有一个成所指向的数据结构只有一个成员我们可以访问。就是员我们可以访问。就是AddDeviceAddDevice,它指向我们驱动程,它指向我们驱动程序的一个非常重要的序的一个非常重要的AddDeviceAddDevice例程,后面会介绍。例程,后面会介绍。DriverExtensionDriverExtension成员成员驱动程序对象驱动程序对象HardwareDatabaseHardwareDatabase(PUNICODE_STRING)(PUNICODE_STRING)是一个是一个表示注册表中路径的字符串,表示注册表中路径的字符串,类似类似\\RegistryRegistry\\MachineMachine\\HardwareHardware\\DeDescriptionscription\\SystemSystem。在这个路径。在这个路径下,存放系统给设备分配的资下,存放系统给设备分配的资源,在源,在WDMWDM驱动程序中,驱动程序中,PnPPnP管理器会把资源传递给驱动程管理器会把资源传递给驱动程序,所以,驱动程序中没必要序,所以,驱动程序中没必要直接访问这个成员。注意这个直接访问这个成员。注意这个字符串是字符串是UNICODE_STRING,UNICODE_STRING,其实内核中所有的字符都是用其实内核中所有的字符都是用UnicodeUnicode表示,后面会介绍表示,后面会介绍UNICODE_STRINGUNICODE_STRING和相关的函和相关的函数数驱动程序对象驱动程序对象FastIoDispatchFastIoDispatch(PFAST_IO_DISPATCH)(PFAST_IO_DISPATCH)是是一个指向一个函数指针表一个指向一个函数指针表的指针,这通常是在文件的指针,这通常是在文件系统和网络驱动中使用。系统和网络驱动中使用。DriverStartIoDriverStartIo(PDRIVER_STARTIO)(PDRIVER_STARTIO)是一是一个指向驱动程序中的一个个指向驱动程序中的一个函数的指针,这个函数是函数的指针,这个函数是为了串行化对硬件的访为了串行化对硬件的访问,后面会介绍。问,后面会介绍。驱动程序对象驱动程序对象DriverUnloadDriverUnload(PDRIVER_UNLOAD)(PDRIVER_UNLOAD)是是一个指向驱动程序的卸载一个指向驱动程序的卸载例程的指针。在例程的指针。在WDMWDM驱动驱动程序中,可以不提供这个程序中,可以不提供这个例程。例程。MajorFunctionMajorFunction(PDRIVER_DISPATCH(PDRIVER_DISPATCH数数组组))指向驱动程序中的主要指向驱动程序中的主要的处理用户请求的例程,的处理用户请求的例程,我们的主要工作就是写这我们的主要工作就是写这个指针数组里面各个指针个指针数组里面各个指针指向的函数。指向的函数。设备对象设备对象作为一个作为一个WDMWDM驱动程序的编写者,可能要驱动程序的编写者,可能要在驱动程序里面调用在驱动程序里面调用IoCreateDeviceIoCreateDevice创建一创建一个或者多个设备对象个或者多个设备对象每一个设备对象对应一个具体设备每一个设备对象对应一个具体设备下页的图描述了设备对象,同样,里面的下页的图描述了设备对象,同样,里面的灰色字段表示驱动程序不能直接访问的成灰色字段表示驱动程序不能直接访问的成员员设备对象设备对象DriverObjectDriverObject(PDRIVER_OBJECT)(PDRIVER_OBJECT)指向代表创建这个设指向代表创建这个设备的那个驱动程序的备的那个驱动程序的驱动程序对象。驱动程序对象。NextDeviceNextDevice(PDEVICE_OBJECT)(PDEVICE_OBJECT)指向同一个驱动程序指向同一个驱动程序创建的下一个设备对创建的下一个设备对象。象。设备对象设备对象CurrentIrpCurrentIrp(PIRP)(PIRP)通常通常被被IRPIRP排队例程排队例程StartPacketStartPacket和和StartNextPacketStartNextPacket使用,使用,它表示最近发送到驱它表示最近发送到驱动程序的动程序的StartIoStartIo例程的例程的那个那个IRPIRPFlags(ULONG)Flags(ULONG)包含一包含一组的标志位。下页的组的标志位。下页的表列出了驱动程序能表列出了驱动程序能够访问的标志够访问的标志FlagDescriptionDO_BUFFERED_IOReadsandwritesusethebufferedmethod(systemcopybuffer)foraccessinguser-modedata.DO_EXCLUSIVEOnlyonethreadatatimeisallowedtoopena-handle.DO_DIRECT_IOReadsandwritesusethedirectmethod(memorydescriptorlist)foraccessinguser-modedata.DO_DEVICE_INITIALIZINGDeviceobjectisn’tinitializedyet.DO_POWER_PAGABLEIRP_MJ_PNPmustbehandledatPASSIVE_LEVEL.DO_POWER_INRUSHDevicerequireslargeinrushofcurrentduringpower-on.设备对象设备对象Characteristics(ULONG)Characteristics(ULONG)是另外一组可选的标是另外一组可选的标志位,它由志位,它由I/OI/O管理器管理器根据驱动程序调用根据驱动程序调用IoCreateDeviceIoCreateDevice时的一时的一个参数来初始化。个参数来初始化。下页的表列出了这些下页的表列出了这些标志的意义标志的意义FlagDescriptionFILE_REMOVABLE_MEDIAMediacanberemovedfromdevice.FILE_READ_ONLY_DEVICEMediacanonlyberead,notwritten.FILE_FLOPPY_DISKETTEDeviceisafloppydiskdrive.FILE_WRITE_ONCE_MEDIAMediacanbewrittenonce.FILE_REMOTE_DEVICEDeviceaccessiblethroughnetwork-connection.FILE_DEVICE_IS_MOUNTEDPhysicalmediaispresentindevice.FILE_VIRTUAL_VOLUMEThisisavirtualvolume.FILE_AUTOGENERATED_DEVICE_NAMEI/OManagershouldautomatically-generateanameforthisdevice.FILE_DEVICE_SECURE_OPENForcesecuritycheckduringopen.设备对象设备对象DeviceExtensionDeviceExtension(PVOID)(PVOID)指向驱动程序编写者自定指向驱动程序编写者自定义的一个结构,这个结构义的一个结构,这个结构保存每个设备的特定信保存每个设备的特定信息。这个结构可能是在驱息。这个结构可能是在驱动程序中使用最多的结动程序中使用最多的结构。构。DeviceTypeDeviceType(DEVICE_TYPE)(DEVICE_TYPE)表示设备表示设备类型,它由类型,它由I/OI/O管理器根管理器根据驱动程序调用据驱动程序调用IoCreateDeviceIoCreateDevice时的一个参时的一个参数来初始化。数来初始化。设备对象设备对象StackSizeStackSize(CCHAR)(CCHAR)表示表示驱动程序设备栈中的驱动程序设备栈中的设备个数,包括功能设备个数,包括功能设备对象,过滤器设设备对象,过滤器设备对象,物理设备对备对象,物理设备对象等。主要是为了通象等。主要是为了通知知IRPIRP的创建者需要为的创建者需要为IRPIRP分配多少个堆栈位分配多少个堆栈位置。置。设备对象设备对象AlignmentRequirementAl