驱动开发3WDM 驱动程序的基本.pdf

上传人:asd****56 文档编号:70321531 上传时间:2023-01-19 格式:PDF 页数:65 大小:528.59KB
返回 下载 相关 举报
驱动开发3WDM 驱动程序的基本.pdf_第1页
第1页 / 共65页
驱动开发3WDM 驱动程序的基本.pdf_第2页
第2页 / 共65页
点击查看更多>>
资源描述

《驱动开发3WDM 驱动程序的基本.pdf》由会员分享,可在线阅读,更多相关《驱动开发3WDM 驱动程序的基本.pdf(65页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、WDMWDM驱动程序的基本驱动程序的基本驱动程序的基本驱动程序的基本结构结构结构结构内容内容内容内容?两个基本的数据结构两个基本的数据结构?两个例程两个例程两个基本的数据结构:两个基本的数据结构:两个基本的数据结构:两个基本的数据结构:?WDMWDM驱动程序里面的两个基本的数据结驱动程序里面的两个基本的数据结构:驱动程序对象和设备对象构:驱动程序对象和设备对象?C+C+中的方法,成员中的方法,成员?LinuxLinux中中两个基本的数据结构:两个基本的数据结构:两个基本的数据结构:两个基本的数据结构:?驱动程序对象代表着这个驱动程序,它包驱动程序对象代表着这个驱动程序,它包含指向驱动程序各个分

2、发例程的指针,以含指向驱动程序各个分发例程的指针,以供操作系统在合适的时候调用供操作系统在合适的时候调用?设备对象是一个硬件设备的具体实例,保设备对象是一个硬件设备的具体实例,保存有关这个设备的数据。存有关这个设备的数据。?一个驱动程序可以产生多个设备对象,每一个驱动程序可以产生多个设备对象,每个设备对象都有自己特定的数据,但是这个设备对象都有自己特定的数据,但是这些设备使用的都是驱动程序对象里面包含些设备使用的都是驱动程序对象里面包含的同一组例程。的同一组例程。驱动程序对象驱动程序对象驱动程序对象驱动程序对象?I/OI/O管理器用一个驱动程序对象来代表每一个设备管理器用一个驱动程序对象来代表

3、每一个设备驱动程序驱动程序?驱动程序对象对我们来说就是一个大的数据结构驱动程序对象对我们来说就是一个大的数据结构?并不是每一个数据成员我们都能访问,有一些数并不是每一个数据成员我们都能访问,有一些数据成员是系统使用的,我们不能进行操作据成员是系统使用的,我们不能进行操作?驱动程序设计的时候,会遇到更多的像这样的,驱动程序设计的时候,会遇到更多的像这样的,我们不能直接操作其所有的数据成员的对象,比我们不能直接操作其所有的数据成员的对象,比如设备对象和如设备对象和IRPIRP对象等等。对象等等。驱动程序对象驱动程序对象驱动程序对象驱动程序对象?DDKDDK中驱动程序对象的定义是这样的:中驱动程序对

4、象的定义是这样的:?typedeftypedef structstruct _DRIVER_OBJECT_DRIVER_OBJECT?CSHORTCSHORT Type;Type;?CSHORTCSHORT Size;Size;?DRIVER_OBJECT,DRIVER_OBJECT,*PDRIVER_OBJECT;*PDRIVER_OBJECT;?具体的各个成员如下图所示,里面的灰色成员表具体的各个成员如下图所示,里面的灰色成员表示我们不能直接访问,就像示我们不能直接访问,就像C+C+中的私有成员一中的私有成员一样。样。驱动程序对象各个成员介绍驱动程序对象各个成员介绍驱动程序对象各个成员介绍

5、驱动程序对象各个成员介绍?DeviceObjectDeviceObject(PDEVICE_OBJECT)(PDEVICE_OBJECT)成员是一成员是一个这个驱动程序产生所有设备个这个驱动程序产生所有设备对象的连接,通过这个指针,对象的连接,通过这个指针,驱动程序维护所有它产生的所驱动程序维护所有它产生的所有设备对象。有设备对象。?DriverExtensionDriverExtension(PDRIVER_EXTENSION)(PDRIVER_EXTENSION)成员成员所指向的数据结构只有一个成所指向的数据结构只有一个成员我们可以访问。就是员我们可以访问。就是AddDeviceAddDe

6、vice,它指向我们驱动程,它指向我们驱动程序的一个非常重要的序的一个非常重要的AddDeviceAddDevice例程,后面会介绍。例程,后面会介绍。DriverExtensionDriverExtension成员成员成员成员驱动程序对象驱动程序对象驱动程序对象驱动程序对象?HardwareDatabaseHardwareDatabase(PUNICODE_STRING)(PUNICODE_STRING)是一个是一个表示注册表中路径的字符串,表示注册表中路径的字符串,类似类似 RegistryRegistry MachineMachine HardwareHardware DeDescrip

7、tionscription SystemSystem。在这个路径。在这个路径下,存放系统给设备分配的资下,存放系统给设备分配的资源,在源,在WDMWDM驱动程序中,驱动程序中,PnPPnP管理器会把资源传递给驱动程管理器会把资源传递给驱动程序,所以,驱动程序中没必要序,所以,驱动程序中没必要直接访问这个成员。注意这个直接访问这个成员。注意这个字符串是字符串是UNICODE_STRING,UNICODE_STRING,其实内核中所有的字符都是用其实内核中所有的字符都是用UnicodeUnicode表示,后面会介绍表示,后面会介绍UNICODE_STRINGUNICODE_STRING和相关的函和

8、相关的函数数驱动程序对象驱动程序对象驱动程序对象驱动程序对象?FastIoDispatchFastIoDispatch(PFAST_IO_DISPATCH)(PFAST_IO_DISPATCH)是是一个指向一个函数指针表一个指向一个函数指针表的指针,这通常是在文件的指针,这通常是在文件系统和网络驱动中使用。系统和网络驱动中使用。?DriverStartIoDriverStartIo(PDRIVER_STARTIO)(PDRIVER_STARTIO)是一是一个指向驱动程序中的一个个指向驱动程序中的一个函数的指针,这个函数是函数的指针,这个函数是为了串行化对硬件的访为了串行化对硬件的访问,后面会介

9、绍。问,后面会介绍。驱动程序对象驱动程序对象驱动程序对象驱动程序对象?DriverUnloadDriverUnload(PDRIVER_UNLOAD)(PDRIVER_UNLOAD)是是一个指向驱动程序的卸载一个指向驱动程序的卸载例程的指针。在例程的指针。在WDMWDM驱动驱动程序中,可以不提供这个程序中,可以不提供这个例程。例程。?MajorFunctionMajorFunction(PDRIVER_DISPATCH(PDRIVER_DISPATCH数数组组)指向驱动程序中的主要指向驱动程序中的主要的处理用户请求的例程,的处理用户请求的例程,我们的主要工作就是写这我们的主要工作就是写这个指针

10、数组里面各个指针个指针数组里面各个指针指向的函数。指向的函数。设备对象设备对象设备对象设备对象?作为一个作为一个WDMWDM驱动程序的编写者,可能要驱动程序的编写者,可能要在驱动程序里面调用在驱动程序里面调用IoCreateDeviceIoCreateDevice创建一创建一个或者多个设备对象个或者多个设备对象?每一个设备对象对应一个具体设备每一个设备对象对应一个具体设备?下页的图描述了设备对象,同样,里面的下页的图描述了设备对象,同样,里面的灰色字段表示驱动程序不能直接访问的成灰色字段表示驱动程序不能直接访问的成员员设备对象设备对象设备对象设备对象?DriverObjectDriverObj

11、ect(PDRIVER_OBJECT)(PDRIVER_OBJECT)指向代表创建这个设指向代表创建这个设备的那个驱动程序的备的那个驱动程序的驱动程序对象。驱动程序对象。?NextDeviceNextDevice(PDEVICE_OBJECT)(PDEVICE_OBJECT)指向同一个驱动程序指向同一个驱动程序创建的下一个设备对创建的下一个设备对象。象。设备对象设备对象设备对象设备对象?CurrentIrpCurrentIrp(PIRP)(PIRP)通常通常被被IRPIRP排队例程排队例程StartPacketStartPacket 和和StartNextPacketStartNextPack

12、et使用,使用,它表示最近发送到驱它表示最近发送到驱动程序的动程序的StartIoStartIo例程的例程的那个那个IRPIRP?Flags(ULONG)Flags(ULONG)包含一包含一组的标志位。下页的组的标志位。下页的表列出了驱动程序能表列出了驱动程序能够访问的标志够访问的标志FlagDescriptionDO_BUFFERED_IO Reads and writes use the buffered method(system copy buffer)for accessing user-mode data.DO_EXCLUSIVE Only one thread at a time

13、 is allowed to open a-handle.DO_DIRECT_IO Reads and writes use the direct method(memory descriptor list)for accessing user-mode data.DO_DEVICE_INITIALIZING Device object isnt initialized yet.DO_POWER_PAGABLE IRP_MJ_PNP must be handled at PASSIVE_LEVEL.DO_POWER_INRUSH Device requires large inrush of

14、current during power-on.设备对象设备对象设备对象设备对象?Characteristics(ULONG)Characteristics(ULONG)是另外一组可选的标是另外一组可选的标志位,它由志位,它由I/OI/O管理器管理器根据驱动程序调用根据驱动程序调用IoCreateDeviceIoCreateDevice时的一时的一个参数来初始化。个参数来初始化。?下页的表列出了这些下页的表列出了这些标志的意义标志的意义FlagDescriptionFILE_REMOVABLE_MEDIA Media can be removed from device.FILE_READ_O

15、NLY_DEVICE Media can only be read,not written.FILE_FLOPPY_DISKETTE Device is a floppy disk drive.FILE_WRITE_ONCE_MEDIA Media can be written once.FILE_REMOTE_DEVICE Device accessible through network-connection.FILE_DEVICE_IS_MOUNTED Physical media is present in device.FILE_VIRTUAL_VOLUME This is a vi

16、rtual volume.FILE_AUTOGENERATED_DEVICE_NAME I/O Manager should automatically-generate a name for this device.FILE_DEVICE_SECURE_OPEN Force security check during open.设备对象设备对象设备对象设备对象?DeviceExtensionDeviceExtension(PVOID)(PVOID)指向驱动程序编写者自定指向驱动程序编写者自定义的一个结构,这个结构义的一个结构,这个结构保存每个设备的特定信保存每个设备的特定信息。这个结构可能是

17、在驱息。这个结构可能是在驱动程序中使用最多的结动程序中使用最多的结构。构。?DeviceTypeDeviceType(DEVICE_TYPE)(DEVICE_TYPE)表示设备表示设备类型,它由类型,它由I/OI/O管理器根管理器根据驱动程序调用据驱动程序调用IoCreateDeviceIoCreateDevice时的一个参时的一个参数来初始化。数来初始化。设备对象设备对象设备对象设备对象?StackSizeStackSize(CCHAR)(CCHAR)表示表示驱动程序设备栈中的驱动程序设备栈中的设备个数,包括功能设备个数,包括功能设备对象,过滤器设设备对象,过滤器设备对象,物理设备对备对象,

18、物理设备对象等。主要是为了通象等。主要是为了通知知IRPIRP的创建者需要为的创建者需要为IRPIRP分配多少个堆栈位分配多少个堆栈位置。置。设备对象设备对象设备对象设备对象?AlignmentRequirementAlignmentRequirement(ULONG)(ULONG)指明读写设备时指明读写设备时数据如何对齐,如数据如何对齐,如FILE_BYTE_ALIGNMENFILE_BYTE_ALIGNMENT T,FILE_512_BYTE_ALIGNFILE_512_BYTE_ALIGNMENTMENT。它的数值时。它的数值时2 2的的x x幂减幂减1 1,例如,例如0 x3F 0 x

19、3F 表示表示FILE_64_BYTE_ALIGNMFILE_64_BYTE_ALIGNMENTENT。驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型?PVOID,PVOID64PVOID,PVOID64Generic pointers(default precision and 64Generic pointers(default precision and 64-bit bit-precision)precision)?NTAPI Used with service function declarations NTAPI Used with service

20、 function declarations to force use of _to force use of _stdcallstdcall calling convention on calling convention on i86 architecturesi86 architectures?VOID Equivalent to VOID Equivalent to“voidvoid”驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型?CHAR,PCHARCHAR,PCHAR8 8-bit character,pointer to same(signed

21、or not bit character,pointer to same(signed or not-according to compiler default)according to compiler default)?UCHAR,PUCHARUCHAR,PUCHARUnsigned 8Unsigned 8-bit character,pointer to samebit character,pointer to same?SCHAR,PSCHARSCHAR,PSCHARSigned 8Signed 8-bit character,pointer to samebit character,

22、pointer to same驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型?SHORT,PSHORT Signed 16SHORT,PSHORT Signed 16-bit integer,bit integer,pointer to samepointer to same?CSHORT Signed short integer,used as a CSHORT Signed short integer,used as a cardinal numbercardinal number?USHORT,PUSHORT Unsigned 16USHORT,PUSH

23、ORT Unsigned 16-bit integer,bit integer,pointer to samepointer to same驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型?LONG,PLONG Signed 32LONG,PLONG Signed 32-bit integer,pointer bit integer,pointer to sameto same?ULONG,PULONG Unsigned 32ULONG,PULONG Unsigned 32-bit integer,bit integer,pointer to samepoint

24、er to same?WCHAR,PWSTR,PWCHAR Wide(Unicode)WCHAR,PWSTR,PWCHAR Wide(Unicode)character or string character or string?PCWSTR Pointer to constant Unicode PCWSTR Pointer to constant Unicode stringNTSTATUSstringNTSTATUS驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型驱动程序中的数据类型?NTSTATUS Status code(typed as signed long NTST

25、ATUS Status code(typed as signed long integer)integer)?LARGE_INTEGER Signed 64LARGE_INTEGER Signed 64-bit integer bit integer?ULARGE_INTEGER Unsigned 64ULARGE_INTEGER Unsigned 64-bit integerbit integer?PSZ,PCSZ Pointer to ASCIIZ(singlePSZ,PCSZ Pointer to ASCIIZ(single-byte)byte)string or constant st

26、ring string or constant string?BOOLEAN,PBOOLEAN TRUE or FALSE BOOLEAN,PBOOLEAN TRUE or FALSE(equivalent to UCHAR)(equivalent to UCHAR)两个基本例程两个基本例程两个基本例程两个基本例程?DriverEntryDriverEntry?AddDeviceAddDeviceDriverEntryDriverEntry 例程例程例程例程?驱动程序的全局的初始化工作,要在驱动程序的全局的初始化工作,要在DriverEntryDriverEntry函数里面做函数里面做,例如指

27、明各个分发例程,例如指明各个分发例程?声明如下:声明如下:extern C extern C NTSTATUSNTSTATUS DriverEntry(INDriverEntry(IN PDRIVER_OBJECTPDRIVER_OBJECT DrDriverObjectiverObject,ININ PUNICODE_STRINGPUNICODE_STRING RegistryPathRegistryPath)?使用使用extern extern“C C”的原因:的原因:?所有的内核模式的函数,包括我们写的驱动程序所有的内核模式的函数,包括我们写的驱动程序都使用都使用_stdcallstdc

28、all调用约定,但是我们可能是在一个调用约定,但是我们可能是在一个支持支持C+C+的编译单元里面写驱动代码,这时这个的编译单元里面写驱动代码,这时这个extern Cextern C指示按照指示按照_stdcallstdcall调用约定进行编译,这调用约定进行编译,这样连接器才能找到这个函数。样连接器才能找到这个函数。DriverEntryDriverEntry 例程例程例程例程?参数里面的参数里面的ININ,有时候还能看到,有时候还能看到OUTOUT或者或者IN OUTIN OUT,这些只是指示参数是输入或者输,这些只是指示参数是输入或者输出,没有什么特别的作用出,没有什么特别的作用?函数的

29、返回值函数的返回值NTSTATUSNTSTATUS,它其实就是一个,它其实就是一个ULONGULONG,用来表示函数的完成状况,在内,用来表示函数的完成状况,在内核里面很多函数都返回一个核里面很多函数都返回一个NTSTATUSNTSTATUS值值。在。在DDKDDK的的NTSTATUS.HNTSTATUS.H头文件里面有头文件里面有很多返回值的意义说明。很多返回值的意义说明。DriverEntryDriverEntry 例程例程例程例程?DriverEntryDriverEntry函数的第一个参数是指向驱动程函数的第一个参数是指向驱动程序对象的指针,我们要做的主要工作就是序对象的指针,我们要做

30、的主要工作就是初始化这个驱动程序对象,即填充各个函初始化这个驱动程序对象,即填充各个函数指针,使得系统能够调用我们提供的各数指针,使得系统能够调用我们提供的各个分发例程。个分发例程。?第二个参数是一个指向驱动程序在注册表第二个参数是一个指向驱动程序在注册表中的一个项的路径,如果后面要用,必须中的一个项的路径,如果后面要用,必须用一个全局变量保存它用一个全局变量保存它一个一个一个一个DriverEntryDriverEntry的例子的例子的例子的例子/一个全局变量一个全局变量UNICODE_STRING UNICODE_STRING servkeyservkey;extern C NTSTATU

31、Sextern C NTSTATUS DriverEntryDriverEntry(ININ PDRIVER_OBJECTPDRIVER_OBJECT DriverObjectDriverObject,ININ PUNICODE_STRINGPUNICODE_STRING RegistryPathRegistryPath)/定义各种分发例程定义各种分发例程DriverObjectDriverObject-DriverUnloadDriverUnload=DriverUnloadDriverUnload;DriverObjectDriverObject-DriverExtensionDriver

32、Extension-AddDeviceAddDevice=AddDeviceAddDevice;一个一个一个一个DriverEntryDriverEntry的例子的例子的例子的例子/定义各种分发例程定义各种分发例程DriverObjectDriverObject-MajorFunctionIRP_MJ_PNPMajorFunctionIRP_MJ_PNP=DispatchPnpDispatchPnp;DriverObjectDriverObject-MajorFunctionIRP_MJ_POWERMajorFunctionIRP_MJ_POWER=DispatchPowerDispatchP

33、ower;DriverObjectDriverObject-MajorFunctionIRP_MJ_SYSTEM_CONTROLMajorFunctionIRP_MJ_SYSTEM_CONTROL =DispatchWmiDispatchWmi;一个一个一个一个DriverEntryDriverEntry的例子的例子的例子的例子/申请空间申请空间servkey.Bufferservkey.Buffer=(PWSTR)(PWSTR)ExAllocatePoolExAllocatePool(PagedPoolPagedPool,RegistryPathRegistryPath-LengthLeng

34、th+sizeof(WCHARsizeof(WCHAR););if if(!(!servkey.Bufferservkey.Buffer)returnreturn STATUS_INSUFFICIENT_RESOURCES;STATUS_INSUFFICIENT_RESOURCES;一个一个一个一个DriverEntryDriverEntry的例子的例子的例子的例子/保存注册表路径保存注册表路径servkey.MaximumLengthservkey.MaximumLength=RegistryPathRegistryPath-LengthLength+sizeof(WCHARsizeof(W

35、CHAR););RtlCopyUnicodeString(&servkeyRtlCopyUnicodeString(&servkey,RegistryPathRegistryPath););servkey.BufferRegistryPathservkey.BufferRegistryPath-Length/Length/sizeof(WCHARsizeof(WCHAR)=0;0;returnreturn STATUS_SUCCESS;STATUS_SUCCESS;AddDeviceAddDevice例程例程例程例程?PnPPnP管理器为每一个设备实例调用一次管理器为每一个设备实例调用一次Ad

36、dDeviceAddDevice函数函数?该函数的原型如下:该函数的原型如下:NTSTATUS NTSTATUS AddDevice(PDRIVER_OBJECTAddDevice(PDRIVER_OBJECTDriverObjectDriverObject,PDEVICE_OBJECT,PDEVICE_OBJECT pdopdo)DriverObjectDriverObject参数指向一个驱动程序对象,参数指向一个驱动程序对象,就是在就是在DriverEntryDriverEntry例程中初始化的那个驱动例程中初始化的那个驱动程序对象。程序对象。pdopdo参数指向设备堆栈底部的物参数指向设

37、备堆栈底部的物理设备对象。理设备对象。AddDeviceAddDevice例程职责例程职责例程职责例程职责?对于功能驱动程序,其对于功能驱动程序,其AddDeviceAddDevice函数的基本职函数的基本职责是创建一个设备对象并把它连接到以责是创建一个设备对象并把它连接到以pdopdo为底为底的设备堆栈中。相关步骤如下:的设备堆栈中。相关步骤如下:?调用调用IoCreateDeviceIoCreateDevice创建设备对象,并建立一个创建设备对象,并建立一个私有的设备扩展对象。私有的设备扩展对象。?注册一个或多个设备接口,以便应用程序能知注册一个或多个设备接口,以便应用程序能知道设备的存在

38、。另外,还可以给出设备名并创道设备的存在。另外,还可以给出设备名并创建符号连接。建符号连接。?初始化设备扩展和设备对象的初始化设备扩展和设备对象的FlagFlag成员。成员。?调用调用IoAttachDeviceToDeviceStackIoAttachDeviceToDeviceStack函数把新设备函数把新设备对象放到堆栈上。对象放到堆栈上。创建设备对象创建设备对象创建设备对象创建设备对象PDEVICE_OBJECT PDEVICE_OBJECT fdofdo;NTSTATUSNTSTATUSstatus=status=IoCreateDevice(DriverObjectIoCreate

39、Device(DriverObject,sizeof(DEVICE_EXTENSIONsizeof(DEVICE_EXTENSION),),NULL,NULL,FILE_DEVICE_UNKNOWN,FILE_DEVICE_UNKNOWN,FILE_DEVICE_SECURE_OPEN,FILE_DEVICE_SECURE_OPEN,FALSE,FALSE,&fdofdo););创建设备对象创建设备对象创建设备对象创建设备对象?第一个参数第一个参数(DriverObjectDriverObject)就是就是AddDeviceAddDevice的第一个参数。的第一个参数。该参数用于在驱动程序对象

40、和新设备对象之间建立连接,该参数用于在驱动程序对象和新设备对象之间建立连接,这样这样I/OI/O管理器就可以向设备发送指定的管理器就可以向设备发送指定的IRPIRP。?第二个参数是设备扩展结构的大小。第二个参数是设备扩展结构的大小。I/OI/O管理器自动分配管理器自动分配这个内存,并把设备对象中的这个内存,并把设备对象中的DeviceExtensionDeviceExtension指针指向这指针指向这块内存。块内存。?第三个参数在本例中为第三个参数在本例中为NULLNULL。它可以是命名该设备对象。它可以是命名该设备对象的的UNICODE_STRINGUNICODE_STRING串的地址。决定

41、是否命名设备对象串的地址。决定是否命名设备对象以及以什么名字命名还需要仔细考虑以及以什么名字命名还需要仔细考虑?第四个参数第四个参数(FILE_DEVICE_UNKNOWNFILE_DEVICE_UNKNOWN)是设备的类是设备的类型。通常我们可以指定型。通常我们可以指定FILE_DEVICE_UNKNOWNFILE_DEVICE_UNKNOWN。创建设备对象创建设备对象创建设备对象创建设备对象?第五个参数第五个参数(FILE_DEVICE_SECURE_OPENFILE_DEVICE_SECURE_OPEN)为为设备对象提供设备对象提供CharacteristicsCharacteristi

42、cs标志。这些标志主要标志。这些标志主要关系到块存储设备关系到块存储设备(如软盘、如软盘、CDROMCDROM等等等等)。?第六个参数第六个参数(FALSEFALSE)指出设备是否是独占的。通指出设备是否是独占的。通常,对于独占设备,常,对于独占设备,I/OI/O管理器仅允许打开该设备管理器仅允许打开该设备的一个句柄。的一个句柄。?第七个参数第七个参数(&fdofdo)是存放设备对象指针的地址,是存放设备对象指针的地址,IoCreateDeviceIoCreateDevice函数使用该变量保存刚创建设备对函数使用该变量保存刚创建设备对象。象。为设备命名为设备命名为设备命名为设备命名?Windo

43、ws 2000Windows 2000使用对象管理器集中管理大量的内部数据结使用对象管理器集中管理大量的内部数据结构,包括我们讨论过的驱动程序对象和设备对象。通常设构,包括我们讨论过的驱动程序对象和设备对象。通常设备对象都把自己的名字放到备对象都把自己的名字放到 DeviceDevice目录中目录中?在在Windows 2000Windows 2000中,设备的名称有两个用途。第一个用中,设备的名称有两个用途。第一个用途,设备命名后,其它内核模式部件可以通过调用途,设备命名后,其它内核模式部件可以通过调用IoGetDeviceObjectPointerIoGetDeviceObjectPoin

44、ter函数找到该设备,找到设备对函数找到该设备,找到设备对象后,就可以向该设备的驱动程序发送象后,就可以向该设备的驱动程序发送IRPIRP。?另一个用途,允许应用程序打开命名设备的句柄,这样它另一个用途,允许应用程序打开命名设备的句柄,这样它们就可以向驱动程序发送们就可以向驱动程序发送IRPIRP。应用程序可以使用标准的。应用程序可以使用标准的CreateFileCreateFile APIAPI打开命名设备句柄,然后用打开命名设备句柄,然后用ReadFileReadFile、WriteFileWriteFile,和,和DeviceIoControlDeviceIoControl向驱动程序发出

45、请求。向驱动程序发出请求。为设备命名为设备命名为设备命名为设备命名?hDevicehDevice=CreateFileCreateFile(.EzusbEzusb-0,0,GENERIC_WRITE|GENERIC_READ,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_WRITE|FILE_SHARE_READ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,NULL,OPEN_EXISTING,OPEN_EXISTING,0,0,NULL);NULL);?应用程序打开设备句柄时使用应用程序打开设备句柄时使用 .路径前缀而不是标准的路

46、径前缀而不是标准的UNC(UNC(统一命统一命名约定名约定)名称如名称如C:C:MYFILE.CPPMYFILE.CPP或或 FREDFRED C C-DriveDrive HISFILE.CPPHISFILE.CPP。在。在内部,内部,I/OI/O管理器在执行名称搜索前自动把管理器在执行名称搜索前自动把 .转换成转换成?。为了把。为了把?目录中的名字与名字在其它目录目录中的名字与名字在其它目录(例如,在例如,在 DeviceDevice目录目录)中的对象相中的对象相连接,对象管理器实现了一种称为符号连接连接,对象管理器实现了一种称为符号连接(symbolic link)(symbolic l

47、ink)的对象。的对象。为设备命名为设备命名为设备命名为设备命名?调用调用IoCreateSymbolicLinkIoCreateSymbolicLink函数创建一个符号连接函数创建一个符号连接IoCreateSymbolicLink(linknameIoCreateSymbolicLink(linkname,targnametargname););linknamelinkname是要创建的符号连接名,是要创建的符号连接名,targnametargname是要连接的名是要连接的名字。字。?如果命名了设备对象,那么任何内核模式程序都如果命名了设备对象,那么任何内核模式程序都可以打开该设备的句柄。

48、另外,任何内核模式或可以打开该设备的句柄。另外,任何内核模式或用户模式程序都能创建连接到该设备的符号连用户模式程序都能创建连接到该设备的符号连接,并可以使用这个符号连接打开设备的句柄。接,并可以使用这个符号连接打开设备的句柄。为设备命名为设备命名为设备命名为设备命名?命名设备对象的例子命名设备对象的例子UNICODE_STRING UNICODE_STRING devnamedevname;RtlInitUnicodeString(&devnameRtlInitUnicodeString(&devname,LL DeviceDevice Simple0);Simple0);IoCreateDe

49、vice(DriverObjectIoCreateDevice(DriverObject,sizeof(DEVICE_EXTENSIONsizeof(DEVICE_EXTENSION),),&devnamedevname,.);,.);为设备命名为设备命名为设备命名为设备命名?如果驱动程序支持多个设备,那么如果驱动程序支持多个设备,那么AddDeviceAddDevice例程就要被例程就要被调用多次,就要给每个设备一个名字,如何实现?调用多次,就要给每个设备一个名字,如何实现??UNICODE_STRING UNICODE_STRING devnamedevname;static LONG s

50、tatic LONG lastindexlastindex=-1;1;LONG LONG devindexdevindex=InterlockedIncrement(&lastindexInterlockedIncrement(&lastindex););WCHAR name32;WCHAR name32;_ _snwprintf(namesnwprintf(name,arraysize(namearraysize(name),),LL DeviceDevice SIMPLE%2.2d,SIMPLE%2.2d,devindexdevindex););RtlInitUnicodeString(&

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com