为什么用注册表存储驱动信息RegistryPath
驱动加载非常早,甚至仅仅晚于windows内核,这时文件系统还没建立,驱动程序如果在此时需要享有自己的可操作空间,只有注册表可使用。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
为驱动信息存储位置。
WDF_DRIVER_CONFIG
驱动程序的一些可配置参数,其中包含了EvtDriverDeviceAdd和EvtDriverUnload的入口地址以及驱动初始化时的一些标志和分配内存使用的tag值。
WDF_DEIVER_CONGFIG_INIT
对config的初始化过程。
wdfDriverCreate
创建驱动对象
PWDFDEVICE_INIT
这个是wdf分配出来的一个数据结构,用来辅助创建一个新设备。
wdfDeviceInitSetDeviceType(DeviceInit, FILE_DEVICE_DISK) //设置设备类型
wdfDeviceInitSetIoType(DeviceInit, wdfDeviceIoDirect) //设置数据读取方式
wdfDeviceInitSetExculsive(DeviceInit, FALSE) //设置是否可以被打开多次
WDF_OBJECT_ATTRIBUTES
//设备对象的属性,用于管理设备对象的输入参数,主要包括设备对象的EvtClearUpCallback EvtDestroyCallback,关联设备上下文DEVICE_CONTEXT
WDF_OBJECT_ATTRIBUTES_INIT //初始化设备对象属性
WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE //设置设备对象上下文信息,也就是保存一些用户自定义的信息的地址到设备对象中
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE //上面两个macro集合体
DEVICE_CONTEXT
设备上下文,主要用于存储与当前设备有关的用户需要的自定义数据
wdfDeviceCreate(&DeviceInit, &deviceAttributes, &device);
pDeviceContext = DeviceGetContext(device);
为什么使用队列的方式存储请求
将请求插入到队列中由另一个线程去处理队列,这是一个典型的生产者消费者模型,这样做的好处是有了一个缓冲,同时还不用担心缓冲带来的同步问题,因为所有的请求都被队列排队了。wdf驱动框架中使用WDF_IO_QUQUE来处理请求,就是基于这种队列的方式,这样就不用开发人员去创建、删除、以及考虑事件同步等问题。
WDF_IO_QUEUE_CONFIG
是对io队列的存储以及irp回调的管理 EvtIoStop、EvtIoRead、EvtIoWrite、EvtIoDeviceControl
WDFQUEUE
队列句柄
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE
用于初始化队列信息,队列的分发类型主要有串行、并行和手动三种。
WdfIoQueueCreate
创建队列
驱动中请求处理方式
重新排队、完成请求、撤销请求、转发请求