IO相关的操作是围绕设备对象进行的。
设备对象分下几类:
1、功能设备对象(FDO): 功能驱动为设备创建一个FDO,在设备栈里它位于物理设备(PDO)的上层。
2、物理设备对象(PDO): 总线驱动创建PDO,逻辑上代表物理设备本身,功能设备对象(FDO)代表系统对这个PDO做的处理。FDO为什么会被总线驱动创建?是因为FDO代表的物理设备连接到此总线设备上,总线驱动起了承担总线设备的功能驱动作用。
3.过滤设备对象(Filter DO):
4、控制设备对象(CDO): 它一般不存在设备栈里,而是一个独立的设备.这个设备用作用户程序接口,用户程序通过CreateFile将它打开,通过它发送IO请求给驱动处理。用户程序通过CDO对内核驱动实现控制。
可以通过WdfDeviceSetXXX、WdfDeviceInitXXX系列函数来设置设备对象属性,通过WdfDeviceGetXXX系列函数来获取设备对象属性。
那么怎么创建设备对象呢?
PNP类驱动在EvtDriverDeviceAdd事件里创建设备,
下面是创建设备对象的代码示例:
typedef struct _FDO_CONTEXT_SPACE
{
WDFDEVICE WdfDevice; // 设备对象
WDFQUEUE ReadQueue; // 读请求队列
WDFQUEUE WriteQueue; // 写请求队列
WDFQUEUE IoctlQueue; // 控制请求队列