WDFIOTARGET WdfDeviceGetIoTarget(IN WDFDEVICE Device);
void SomeEvtCallback(WDFDEVICE Device,WDFREQUEST Request)
{
//让IO请求在当前设备栈中继续传递
WdfRequestSend(Request,WdfDeviceGetIoTarget(Device),NULL);
}
Device就是 被创建的IO目标对象的拥有者,在默认情况下,就是被创建的IO目标对象的父对象(可通过在IoTargetAttributes中设置ParentObject改变此默认情况)。参数IoTargetAttributes用来设置新建WDFIOTARGET对象的属性,可直接传入WDF_NO_OBJECT_ATTRIBUTES。参数IoTarget返回新建的目标对象,一个新建的目标对象是“空的”,并没有和任何“目标”相关联。所以在正式被使用前,还需要通过调用WdfIoTargetOpen接口函数将它打开,并和一个“目标”挂钩。NTSTATUS WdfIoTargetCreate(
IN WDFDEVICE Device, //
IN OPTIONAL PWDF_OBJECT_ATTRIBUTES IoTargetAttributes,
OUT WDFIOTARGET* IoTarget);
WDFIOTARGET对象有一个状态标志,它可以处于启动、停止和终止等状态;只有当一个WDFIOTARGET对象处于启动状态时,发送到它的IO请求才会被处理;WDF_OBJECT_ATTRIBUTES ioTargetAttribute;
WDFIOTARGET ioTarget;
WDF_IO_TARGET_OPEN_PARAMS openParams;
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&ioTargetAttribute,
TARGET_DEVICE_INFO);
status=WdfIoTargetCreate(device,
&ioTargetAttribute,
&ioTarget);
if(!NT_SUCCESS(status)) return status;
//刚刚创建的IO目标对象是空的
//需要通过打开操作,与一个实际的目标对象挂钩
WDF_IO_TARGET_OPEN_PARAMS_INIT_OPEN_BY_NAME(&openParams,
SymbolicLink,
STANDARD_RIGHTS_ALL);
status = WdfIoTargetOpen(ioTarget,&openParams);
if(!NT_SUCCESS(status)){
WdfObjectDelete(ioTarget);
return status;
}
此接口函数用来启动一个WDFIOTARGET对象;相应的,还存在停止与终止接口;NTSTATUS WdfIoTargetStart(IN WDFIOTARGET IoTarget);
由于只有WDFIOTARGET对象启动后,IO请求才能被正确处理,所以在传递请求前先查看WDFIOTARGET对象的状态。NTSTATUS WdfIoTargetStop(IN WDFIOTARGET IoTarget);
NTSTATUS WdfIoTargetClose(IN WDFIOTARGET IoTarget);
枚举类型WDF_IO_TARGET_STATE定义了所有的WDFIOTARGET对象状态:WDF_IO_TARGET_STATE WdfIoTargetGetState(WDFIOTARGET Tar);
typedef enum _WDF_IO_TARGET_STATE{
WdfIoTargetStateUndefine = 0, //无效状态,不可以使用
WdfIoTargetStarted, //已经启动
WdfIoTargetStopped, //被停止
WdfIoTargetClosedForQueryRemove, //请求被移除,故而不久设备将被移除
WdfIoTargetClosed, //已经被移除
WdfIoTargetDeleted, //被删除
}WDF_IO_TARGET_STATE,*PWDF_IO_TARGET_STATE;