本文主要讲解kmdf echo工程的AutoAsyn模块,它是一个自动同步的(支持异步调用的)driver。其中,AutoAsyn —— Auto Asynchronous。
一、文件结构
它主要包括8个文件:echo.inx —— 用于生成INF文件,public.h —— 与应用程序共享的头文件,传递GUID和IOCTL CODE。
driver.h和driver.c,驱动框架代码,包括入口函数等,device.h和device.c,设备管理代码等,queue.h和queue.c,处理应用层发来的请求的代码。
从文件结构可以看出,该驱动不包含trace相关代码,不支持TPP,不能使用traceview来观察它的log。但是,它提供了”KdPrint“函数打印的log,后续我将开启debugview来捕获它的log。
Readme文件中的描述如下:
Driver.h, Driver.c —— DriverEntry and Events on the Driver Object.
Device.h, Device.c —— Events on the Device Object.
Queue.h, Queue.c —— Contains Events on the I/O Queue Objects.
Echo.inx —— File that describes the installation of this driver. The build process converts this into an INF file.
二、代码讲解(Code Tour)
1,DriverEntry
它是整个驱动程序的入口函数,相当于win32的main()函数。它是驱动被加载后系统调用的第一个回调例程,因此,它需要进行一些初始化的操作和指定其他入口点,如”EvtDevice“和”DriverUnload“。
其中,最重要的是初始化DriverObject 。参考它的注释:
DriverObject - represents the instance of the function driver that is loaded into memory. DriverEntry must initialize members of DriverObject before it returns to the caller. DriverObject is allocated by the system before the driver is loaded, and it is released by the system after the system unloads the function driver from memory.
系统只是为DriverObject 分配了一块内存(无类型信息),真正的内容填充,需要在DriverEntry完成。在KMDF框架中,DriverObject 也是其中的一类对象,它也有config和attribute,也需要有Wdf***Create函数创建。在kmdf echo工程中,主要是为它配置config和调create:
WDF_DRIVER_CONFIG_INIT(&