IO目标对象的细节

转载自:http://blog.163.com/prince_william@126/blog/static/16976816120122711272459/


IO目标对象的细节  

2012-03-07 15:03:57|  分类:WDF |字号 订阅

IO目标是对IO请求将发送到的目标驱动的描述。比如,向另一个内核驱动中的设备发送一个IOCTL命令,这个远程设备对象就是IOCTL命令的IO目标。
新定义这么一个对象并不是为了形象上的好看,而是赋予了它很多实用的妙处。
(1)请求以同步方式发送到IO目标对象。
(2)请求以异步方式发送到IO目标对象。
(3)为发送到IO目标的请求设置超时,如果预期时间内仍未完成,就取消请求。
(4)IO目标对象可以被启动、停止、关闭,只有启动后的IO目标对象才能接受请求,否则将关闭外接请求通道。
(5)跟踪并维护发送到IO目标的IO请求。比如删除目标对象后,所有排队于其中的IO请求对象都将被删除。


调用WdfIoTargetGetDevice函数可以获取被封装的设备对象句柄
WDFDEVICEWdfIoTargetGetDevice(IN WDFIOTARGET IoTarget);
IO目标对象分为 普通对象特殊对象两种, 普通目标对象就是WDFIOTARGET,特殊目标对象目前只有一种,即USB IO目标对象。USB IO目标对象并没有一个对应的类型被暴露出来,而是隐藏在诸如WDFUSBDEVICE、WDFUSBPIPE这些对象内部,然后通过这些对象句柄来使用特殊IO目标对象。
普通IO目标对象,即WDFIOTARGET对象分为本地和远程两种,在有些资料中,本地IO目标对象还被称为默认对象,如果某个请求继续在当前设备栈中传递,则对应的WDFIOTARGET对象为本地的;若被传递到其它的设备栈中,不管此设备栈是否也通过本驱动,则对应的WDFIOTARGET对象统称为远程的。
可以直接从设备对象中获取WDFIOTARGET对象,所获取的对象对应着当前设备栈中的下一层设备。

WDFIOTARGET WdfDeviceGetIoTarget(IN WDFDEVICE Device);

通过此方式获取的WDFIOTARGET对象,称为此设备对象的本地(或默认)WDFIOTARGET对象,凡是发送到此设备对象的WDFREQUEST对象若要在设备栈中继续传递,则应当将请求发送到此本地目标对象。一个默认事件回调函数可实现如下:

void SomeEvtCallback(WDFDEVICE Device,WDFREQUEST Request)

{

//让IO请求在当前设备栈中继续传递

WdfRequestSend(Request,WdfDeviceGetIoTarget(Device),NULL);

}


使用一个远程IO目标对象需要经过两个步骤:第一步,创建远程IO目标对象;第二步,打开此对象。调用WdfIoTargetCreate接口新建一个IO目标对象:

NTSTATUS WdfIoTargetCreate(

IN WDFDEVICE Device, //

IN OPTIONAL PWDF_OBJECT_ATTRIBUTES IoTargetAttributes,

OUT WDFIOTARGET* IoTarget);

Device就是 被创建的IO目标对象的拥有者,在默认情况下,就是被创建的IO目标对象的父对象(可通过在IoTargetAttributes中设置ParentObject改变此默认情况)。参数IoTargetAttributes用来设置新建WDFIOTARGET对象的属性,可直接传入WDF_NO_OBJECT_ATTRIBUTES。参数IoTarget返回新建的目标对象,一个新建的目标对象是“空的”,并没有和任何“目标”相关联。所以在正式被使用前,还需要通过调用WdfIoTargetOpen接口函数将它打开,并和一个“目标”挂钩。

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对象有一个状态标志,它可以处于启动、停止和终止等状态;只有当一个WDFIOTARGET对象处于启动状态时,发送到它的IO请求才会被处理;

NTSTATUS WdfIoTargetStart(IN WDFIOTARGET IoTarget);

此接口函数用来启动一个WDFIOTARGET对象;相应的,还存在停止与终止接口;

NTSTATUS WdfIoTargetStop(IN WDFIOTARGET IoTarget);

NTSTATUS WdfIoTargetClose(IN WDFIOTARGET IoTarget);

由于只有WDFIOTARGET对象启动后,IO请求才能被正确处理,所以在传递请求前先查看WDFIOTARGET对象的状态。

WDF_IO_TARGET_STATE WdfIoTargetGetState(WDFIOTARGET Tar);

枚举类型WDF_IO_TARGET_STATE定义了所有的WDFIOTARGET对象状态:

typedef enum _WDF_IO_TARGET_STATE{

WdfIoTargetStateUndefine = 0, //无效状态,不可以使用

WdfIoTargetStarted, //已经启动

WdfIoTargetStopped, //被停止

WdfIoTargetClosedForQueryRemove, //请求被移除,故而不久设备将被移除

WdfIoTargetClosed, //已经被移除

WdfIoTargetDeleted, //被删除

}WDF_IO_TARGET_STATE,*PWDF_IO_TARGET_STATE;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java NIO(New IO)是Java 1.4版本提供的一种新的IO API,它提供了与传统IO API不同的IO处理方式,包括了通道(channel)和缓冲区(buffer)的概念。Java NIO目标是提供比传统IO更快、更高效的IO操作方式。 Java NIO源码解析需要深入了解Java NIO的核心概念,主要包括以下几个部分: 1. 缓冲区(Buffer):Java NIO中的缓冲区是一个对象,它包含了一定数量的数据元素,并且提供了对这些数据元素的基本操作方法。Java NIO中的所有数据都是通过缓冲区来传输的。 2. 通道(Channel):Java NIO中的通道是一种对象,它可以用来读取和写入数据。通道类似于流,但是它们可以被双向读写,并且可以同时处理多个线程。 3. 选择器(Selector):Java NIO中的选择器是一种对象,它可以用来监视多个通道的事件(如读写就绪),从而实现单线程处理多个通道的能力。 4. 文件处理:Java NIO中提供了一组文件处理的API,包括了文件读写、文件锁、文件映射等功能。 Java NIO源码解析需要深入研究Java NIO的实现细节,包括了缓冲区的实现、通道的实现、选择器的实现等。其中,缓冲区的实现是Java NIO的核心,也是最复杂的部分。Java NIO中的缓冲区是通过JNI(Java Native Interface)和Java堆内存来实现的,它提供了高效的数据传输方式,但是也带来了一些复杂性。通道的实现是基于底层的操作系统文件描述符来实现的,它提供了高效的IO操作方式,但是也需要考虑系统平台的差异性。选择器的实现是基于操作系统提供的事件驱动机制来实现的,它可以实现单线程同时处理多个通道的能力,但是也需要考虑系统平台的差异性。 总之,Java NIO源码解析需要深入理解Java NIO的核心概念和实现细节,这样才能更好地理解Java NIO的工作机制,并且能够在实际开发中灵活运用Java NIO的各种功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值