欢迎来到天天文库
浏览记录
ID:32585845
大小:65.52 KB
页数:15页
时间:2019-02-13
《wdm驱动程序的框架》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、WDM驱动程序的框架1・DriverEntry()DDK中定义的函数原型如下:NTSTATUSDriverEntry(INPDRIVER_OBJECTDriverObject.INPUNICODE_STRINGRegistryPath);DriverEntry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序。DriverEntry的第二个参数是设备服务键的键名。如果该例程执行成功,则返回STATUS_SUCCESS,如果失败,则依据失败状态返回定义在ntstatus.h中的错误值。这是驱动程序的入口函数,相当于用户态程序的main()函数
2、,它在驱动程序被加载进内存的时■候调用。主要工作是把各种函数指针填入驱动程序对彖。这些指针为操作系统指明了驱动程序容器屮各种子例程的位置,这样,该驱动程序对彖关联的设备对象在接收到上层的IRP的时候,就会通过驱动程序对象中设置的函数指针,找到相应的派遣函数來做处理。Eg.—个简单的DriverEntry()代码片断:DriverObject->DriverUnload=DriverUnload;<—1DrivcrObjcct->DrivcrExtcnsion-〉AddDcvicc二AddDcvicc;DriverObject->DriverStartIo=Startlo;
3、DriverObject->MajorFunction[TRPMJCREATE]二DriverDispatchCreate;<—2DriverObject->MajorFunction[IRPMJCLOSE]二DriverDispatchClose;DriverUnload指向驱动程序的清除例程。I/O管理器会在卸载驱动程序前调用该例程。通常,WDM驱动程序的DriverEntry例程一般不分配任何资源,所以DriverUnload例程也没冇什么清除工作要做。DriverDispatchxxx驱动程序可能仅需要处理儿种类型的IRP,所以至少应该设置与那儿种IRP类型相对应
4、的指针元素,使它们指向相应的派遣函数。AddDevice指向驱动程序的AddDevice两数,在该畅数中主耍创建一个设备对象并把它连接到以pdo为底的设备堆栈中。2.AddDevice()DDK中定义的函数原型如下:NTSTATUSAxxAddDevice(INPDRIVER_OBJECTDriverObject,INPDEVICE_OBJECTPhysicalDeviceObject);AddDevice隊i数的第一个参数是指向该驱动的驱动对彖的指针,第二个参数代表由底层驱动创建的物理设备对象。对于功能驱动程序,其AddDevice函数的某木职责是创建一个设备对象并把它
5、连接到以pdo为底的设备堆栈中。相关步骤如下:true1.调用loCreateDevice()创建设备对象,并建立一个私有的设备扩展对彖。true2.寄存一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接。true3.初始化设备扩展和设备对象的Flag成员。true4.调用IoAttachDeviceToDeviceStack()函数把新设备对象放到堆栈上。※关于AddDevice()pKi数:在规范的WDM程序屮,创建设备对象的任务本来该由AddDevicepKi数来做,而这个函数也是通过驱动程序对象的一个函数指针來定位的。在这种规范
6、的WDM程序中,一旦有新硬件加入,系统就会口动通过驱动程序对象的函数指针找到AddDevice函数,并调用它來创建设备对象。但是在这里,并不是在为实际存在的硬件写驱动,而只是写一个内核模式下的程序,因此就只需耍在DriverEntry函数中创建一个设备对彖,然后创建设备链接(可选)就可以了。(以上为网上摘录)2.DriverDispatchXXX一般派遣函数冇两个参数:一个指向DEVICE_OBJECT结构的指针,指向由驱动在AddDeviceC或DriverEntry)中创建的设备对象。第二个参数是指向一个IRP结构的指针。派遣两数DriverDispatchXXX主要
7、负责处理上层的IRP。这里先要提一下,每个IRP都与两个数据结构相关联,就是IRP本身和IRPStack——IO_STACK_LOCATION结构。在这两个结构里面,包含了所有上层传递给木层设备对象的信息。最重耍的一个信息就是:在IO_STACK_LOCATION结构中,包含了IRP的功能码MajorFunction和MinorFunction(IRP的功能码标识了该IRP具体是什么请求,比如读请求的MajorFunction值为IRP_MJ_READ)oDriverDispatch函数的处理流程一般是这样的:首先通过IRP获
此文档下载收益归作者所有