驱动名词解释_第1页
驱动名词解释_第2页
驱动名词解释_第3页
驱动名词解释_第4页
驱动名词解释_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、驱动 驱动NTSTATUSNTSTATUS是被定义为32位的无符号长整型。在驱动程序开发中,人们习惯用NTSTATUS 返回状态。其中0-0X7FFFFFFF,被认为是正确的状态,而0X80000000-0XFFFFFFFF被认 为是错误的状态。有一个非常有用的宏NT_SUCCESS,用来检测状态是否正确。ININ,OUT,INOUT是一个空的宏,只是用来说明这个参数是用于输入参数,还是输出的参 数。DriverEntry操作系统在初始化驱动程序的时候会调用DriverEntry,通常会用这个函数来填充dispatch例 程的指针,这就象注册回调函数一样。有的设备要创建设备的对象,或者还要创建

2、一个设备 名字,以及其他的初始化操作。它的原型:NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)(IN,OUT,INOUT是一个空的宏,只是用来说明这个参数是用于输入参数,还是输出的参 数。NTSTATUS实际是个长整型可以在DDK头文件NTSTATUS.H中找到NTSTATUS的代 码列表。函数的第一个参数DriverObject是刚被初始化的驱动对象,就是操作系统为这个驱 动分配的空间的指针。函数的第二个参数RegistryPath是驱动在注册表中的键值。如果驱动 程序需

3、要访问设备的服务键需要保存这个键值以备后用。UNICODE_STRINGUNICODE_STRING结构是通过使用各种本地安全认证(LSA)的功能来指定一个Unicode 字符串。2结构体原型:typedef struct _LSA_UNICODE_STRING USHORT Length;USHORT MaximumLength;PWSTR Buffer; LSA_UNICODE_STRING *PLSA_UNICODE_STRING, UNICODE_STRING *PUNICODE_STRING;3结构成员:Length指定字符串的长度,以字节为单位指出的Buffer字符串的长度。如果是

4、以NULL字符结尾 (即0),则不包括NULL字符的长度。MaximumLengthBuffer字符串的总长度。MaximumLength和Length的关系可以参照:char c10 = 123;sizeof(c);和 strlen(c);得出的结果。Buffer一个宽字符的字符串的指针。注意,通过各种LSA函数返回的字符串可能不是以NULL结 尾。4使用范例:编辑UNICODE_STRING str = RTL_CONSTANT_STRING(LHello);KdPrint(Buffer:%wsnMaxinumLength:%dnLength:%d, str.Buffer, str.Max

5、imumLength, str.Length);AddDeviceAddDevice例程是WDM特有的,在DriverEntry中需要设置AddDevice例程的函数地址。 设置的方式是在驱动对象的DriverExtension子域的AddDevice子域保存AddDevice实际例 程的函数地址。AddDevice例程的名字可以随意命名。“ *“*NTSTAUS MyAddDevice(IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)/设置AddDevice实际例程的地址pDriverObject

6、-DriverExtension- AddDevice = MyAddDevice;#pragma code_set(INIT)/将此函数放到INIT段中当驱动加载结束后,此函数就可以从内存中卸载掉#pragma code_seg(PAGE)/此例程分派在分页中保存IRP_MJ_PNP即插即用例程的一个基本操作,其完成操作系统即插即用管理器发出的即插即用信息,主要 包括启动设备、停止设备、删除设备这三个功能,个别驱动还需要几个即插即用操作。RtlInitUnicodeString初始化字串代码1:UNICODE_STRING US1;RtlInitUnicodeString(&US1,LDDD

7、D);会动态分配一块指向“ DDDD ”的内存指针,赋值给US1.Buffer;代码2:wchar_t tmpstr260=0;UNICODE_STRING US1;RtlInitUnicodeString(&US1,tmpstr);这时US1.Buffer直接指向tmpstr,如果修改了 US1,也会同时修改tmpstr。另外此时 US1.MaximumLength=2;要重新设定MaximumLength=260*2,才能正常使用。IoCreateDevice()IoCreateDevice函数用于创建常规的设备对象.NTSTATUS IoCreateDevice(IN PDRIVER_O

8、BJECT DriverObject,IN ULONG DeviceExtensionSize,IN PUNICODE_STRING DeviceNameOPTIONAL,IN DEVICE_TYPE DeviceType,IN ULONG DeviceCharacteristics,IN BOOLEAN Exclusive,OUT PDEVICE_OBJECT *DeviceObject);DriverObject一个指向调用该函数的驱动程序对象.每一个驱动程序在它的DriverEntry过程里接收一个指 向它的驱动程序对象.WDM功能和过滤驱动程序也在他们的AddDevice过程接受一个驱

9、动程序对象的指针.DeviceExtensionSize指定驱动程序为设备扩展对象而定义的结构体的大小.DeviceName(可选的参数)指向一个以零结尾的包含Unicode字符串的缓冲区,那是这个设备的名称,该字 符串必须是一个完整的设备路径名.WDM功能驱动程序和过滤驱动程序它们的设备对象没有名字.注意:如果设备名未提供(即这个参数是NULL),IoCreateDevice创建的设备对象将不会有一 个DACL与之相关联.DeviceType指定一个由一个系统定义的FILE_DEVICE_XXX常量,表明了这个设备的类型(如FILE_DEVICE_DISK,FILE_DEVICE_KEYBO

10、ARD等),或供应商定义的一种新型设备的 类型.DeviceCharacteristics指定一个或多个系统定义的常量,连接在一起,提供有关驱动程序的设备其他信息.对于可能 的设备特征信息,见 DEVICE_OBJECT 结构体.Exclusive如果指定设备是独占的,大部分驱动程序设置这个值为 FALSE,如果是独占的话设置为 TRUE,非独占设置为FALSE.DeviceObject一个指向DEVICE_OBJECT结构体指针的指针,这是一个指针的指针,指向的指针用来接收 DEVICE_OBJECT结构体的指针.IoCreateDevice函数成功时返回STATUS_SUCCESS,失败时

11、返回适当的NTSTATUS错误代码. 这时这个函返回值 STATUS_INSUFFICIENT_RESOURCESSTATUS_OBJECT_NAME_EXISTSSTATUS_OBJECT_NAME_COLLISIONDEVICE_EXTENSION设备扩展(DEVICE_EXTENSION )是与设备对象相关的另一种重要的数据结构。可以用它来 保存与特定设备关联的信息。设备扩展其实只是一个未分页的池,由驱动开发者来定义它的 大小和内容。并由I/O管理器自动把它分配给设备对象,即设备对象的PVOID DeviceExtension字段。由于此结构是驱动开发者自定义的,所以必须要让系统知道需要

12、给 此结构预留多少空间,因此要把设备扩展结构的大小作为参数传递给IoCreateDevice函数。I/O管理器的loCreateDevice函数将为设备对象和设备扩展对象在非分页内存池内申请内存。 般要包括设备对象的反向指针、设备状态或驱动程序环境信息等,它的布局类似设备扩展于如下结构:typedef struct tagDEVICE_EXTENSION PDEVICE_OBJECT DeviceObject;PDEVICE_OBJECT LowerDeviceObject;PDEVICE_OBJECT Pdo;IO_REMOVE_LOCK RemoveLock;UNICODE_STRING

13、devname;/ device object this extension belongs to/ next lower driver in same stack/ the PDO/ removal control locking structure DEVICE_EXTENSION, *PDEVICE_EXTENSION;设备扩展的内容依赖特定的驱动程序,应该根据驱动程序的需要来定义。设备扩展主要用来维护设备状态信息、存储驱动程序使用的内核对象或系统资源(如自旋 锁)、保存驱动程序需要的数据等。由于大多数的总线驱动、功能驱动和过滤器驱动都要工 作在任意线程上下文,即任意线程都可能成为当前线

14、程,所以,设备扩展是保存设备状态信 息和数据的主要空间。每一个实现了 ISR的驱动程序都要存储中断对象(一种内核对象)指针,大部分的驱动程 序把它们存储在设备扩展里。每一个标准的驱动程序函数在接收一个IRP时,同时接收到 的还有一个指向申请该IO操作的设备对象的指针,此函数能够通过此指针访问到相应的设 备扩展。另外,上一层的设备扩展都保存一个指向下一层设备对象的指针(如上述结构中的 PDEVICE_OBJECT LowerDeviceObject字段)作为调用 IoCallDriver 函数的参数。FILE_DEVICE_UNKNOWN未知设备IoCreateSymbolicLink创建一个设

15、备链接。驱动程序虽然有了设备名称,但是这种设备名称只能在内核态可见, 而对于应用程序是不可见的,因此,驱动需要要暴露一个符号链接,该链接指向真正的设备 名称NTSTATUS IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName,IN PUNICODE_STRING DeviceName );参数:SymbolicLinkNameUnicode字符串指针,是一个用户态可见的名称。DeviceNameUnicode字符串指针,是驱动程序创建的设备对象名称。Return Value如果符号链接创建成功返回STATUS_SUCCESSDRIV

16、ER_OBJECT每个驱动程序对象代表了一个加载了的内核模式驱动程序映像.这个驱动对象就是以 DRIVER_OBJECT结构体的形式存在的.这个驱动对象的指针从驱动程序的DriverEntry函数 或AddDevice函数的参数传入的.typedef structPDEVICE_OBJECT DeviceObject;PUNICODE_STRING HardwareDatabase;PFAST_IO_DISPATCH FastIoDispatch;PDRIVER_INITIALIZE DriverInit;PDRIVER_STARTIO DriverStartIo;PDRIVER_UNLOAD

17、 DriverUnload;PDRIVER_DISPATCH MajorFunctionIRP_MJ_NUM+1;DRIVER_OBJECT,*PDRIVER_OBJECT;DeviceObject指向驱动程序创建的设备对象。这个驱动程序调用IoCreateDevice的时候会自动赋予正确的 设备对象指针。每个驱动程序会有一个或多个设备对象。其中,每个设备对象都有一个指针指向下一个驱动 对象,最后一个设备对象指向空。此处的DeviceObject指向驱动对象的第一个设备对象。 通过DeviceObject,就可以遍历驱动对象里的所有设备对象。设备对象是由程序员自己创建 的,而非操作系统完成,在

18、驱动被卸载的时候,遍历每个设备对象,并将其删除。HardwareDatabaseHardwareDatabase记录的是设备的硬件数据库名,这里同样用Unicode字符串记录。该字符 串一般为 HKEY_LOCAL_MACHINEHardwareDESCRIPTIONSystem,是一个注册表路径。 FastIoDispatch文件驱动中用到的派遣函数。指向这个驱动程序的FastIO入口点定义的一个结构。这个成 员只能通过FSDs和网络传输驱动来使用。DriverInit指向DriverEntry函数的,这是通过IO管理器来建立的。DriverStartIoDriverStartIo?如果驱动

19、程序使用标准的IRP排队方式,应该设置该成员,使其指向驱动程序 的StartIo例程记录StartIO例程的函数地址,用于串行化操作,如果一个驱动程序没有StartIo函数,这个 成员将是NULL。DriverExtension-AddDevice?指向驱动程序的AddDevice函数。PnP管理器将为每个硬件实 例调用一次AddDevice例程DriverUnloadDriverUnload?指向驱动程序的清除例程。I/O管理器会在卸载驱动程序前调用该例程。通常, WDM驱动程序的DriverEntry例程一般不分配任何资源,所以DriverUnload例程也没有什 么清除工作要做。指定驱动

20、卸载时所用的回调函数地址,如果驱动程序没有卸载函数这个成员将是NULL。MajorFunctionIRP_MJ_NUM+1MajorFunction?是一个指针数组,I/O管理器把每个数组元素都初始化成指向一个哑派遣函 数,这个哑派遣函数仅返回失败。驱动程序可能仅需要处理几种类型的IRP,所以至少应该 设置与那几种IRP类型相对应的指针元素,使它们指向相应的派遣函数。指向驱动程序的DispatchXXX函数指针的数组。每个驱动程序至少要设置一个DispatchXXX 函数指针在这个数组里来处理这个驱动程序IRP请求包。任何一个驱动程序可以设置和 IRP_MJ_XXX代码一样多的Dispatch

21、XXX来处理IRP请求包.每个DispatchXXX结构如下: NTSTATUS DispatchXXX(IN PDEVICE_OBJECT DeviceObjec, IN PIRP Irp);wdmDEVICE_OBJECT设备对象用于保存设备特征和状态的相关信息。一个设备对象表示一个逻辑的、虚拟的或物 理的设备,设备对象的I/O请求由一个驱动对象操控着。每一个内核模式的驱动必须创建设 备对象,它通过调用IoCreateDevice函数一次或多次来创建。设备对象用结构体DEVICE_OBJECT表示。每个设备对象有一个指针(NextDevice)指向 下一个设备对象,从而形成一个设备对象链表

22、。该链表的第一个设备是由驱动对象结构体中 的DeviceObject成员指明的。设备对象结构体DEVICE_OBJECT的具体定义如下:复制代码typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)_DEVICE_OBJECTCSHORT Type;USHORT Size;LONG ReferenceCount;/*指向驱动程序中驱动对象的指针*/struct _DRIVER_OBJECT *DriverObject;/*指向下一个设备对象的指针*/struct _DEVICE_OBJECT *NextDevice;struct _

23、DEVICE_OBJECT *AttachedDevice;/*当前IRP结构*/struct _IRP *CurrentIrp;PIO_TIMER Timer;/*设备对象的特性标志*/ULONG Flags;ULONG Characteristics;_volatile PVPB Vpb;/*指向设备扩展对象的指针*/PVOID DeviceExtension;/*指明设备类型*/DEVICE_TYPE DeviceType;/*堆栈的最小层数*/CCHAR StackSize;union LIST_ENTRY ListEntry;WAIT_CONTEXT_BLOCK Wcb; Queue

24、;/*内存对齐*/ULONG AlignmentRequirement;KDEVICE_QUEUE DeviceQueue;KDPC Dpc;/*下列成员用于支持文件系统的互斥操作*以便对文件系统处理线程使用设备的计数保持跟踪*/ULONG ActiveThreadCount;PSECURITY_DESCRIPTOR SecurityDescriptor;KEVENT DeviceLock;USHORT SectorSize;USHORT Spare1;struct _DEVOBJ_EXTENSION *DeviceObjectExtension;PVOID Reserved; DEVICE_

25、OBJECT;typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;复制代码下面分别描述设备对象中驱动程序可访问成员的具体含义。PDRIVER_OBJECT DriverObject:指向驱动程序中的驱动对象。同属一个驱动程序的驱动对 象指针都指向同一个驱动对象。PDEVICE_OBJECT NextDevice:指向下一个设备对象。这里的下一个设备对象是同一个驱 动程序创建的若干设备对象中的一个。每个设备对象会根据NextDevice成员形成链表,从 而遍历每个设备对象。在每次成功调用IoCreateDevice后,I/O管理器就会更新该链表。当 驱动被

26、卸载时,需要遍历该链表,删除每个设备对象。PIRP CurrentIrp:如果驱动使用StartIO例程,此成员将指向当前的IRP结构,否则为NULL。ULONG Flags:此成员是一个32位的无符号整型变量,每个位有不同的含义。可通过按位 取“或”操作为新创建的设备对象设置不同的特性。ULONG Characteristics:此成员说明设备对象的特性,当驱动程序调用IoCreate-Device时, 可设置 FILE_REMOVABLE_MEDIA (表示存储设备支持可移动介质)、 FILE_READ_ONLY_DEVICE (表示设备不能写)、FILE_FLOPPY_DISKETTE

27、(表示设备是 软盘设备)等值。PVOID DeviceExtension:指向设备扩展对象。DEVICE_TYPE DeviceType:指明设备的类型,由IoCreateDevice设置,根据设备的需要填 写相应的设备类型。CCHAR StackSize:在多层驱动的情况下,驱动与驱动之间形成类似堆栈的结构。IRP会依 次从最高层传递到最底层。StackSize就是用于指定发送到该驱动的IRP在堆栈位置的最小 层数的。IoCreateDevice在一个新创建的设备对象中设置该成员。ULONG AlignmentRequirement:进行数据传输的时候,规范设备的地址对齐。IoCompleteRequestIoCompleteRequest函数表示调用方已完成所有I/O请求处理操作,并将给定的IRP返回给 I/O管理器。Irp指向将要完成的IRP报文数据结构。PriorityBoost指定系统定义的常量,用来增加运 行时要求操作的原始线程的优先权。如果要求操作的原始线程需要驱动程序快速的完成处 理,或者IRP填充完成时有错误发生,那么这个值就应该设为IO_NO_INCREMENT。否则 PriorityBoost常量的值应设

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论