当 I/O 管理器向基于框架的驱动程序发送 I/O 请求时,框架会截获请求并创建框架请求对象。 框架“拥有”请求对象,因为只有框架可以访问请求并对该对象执行作。
框架创建请求对象后,它会将对象置于驱动程序的 I/O 队列之一中。 该框架继续拥有请求对象,直到它从队列中删除请求并将其传递到驱动程序。
驱动程序 收到 请求对象后,它拥有该请求。 驱动程序可以通过句柄访问请求对象,并对该对象执行作。 虽然驱动程序拥有请求对象,但它可以 重新排队、 完成、 取消或 转发 请求,之后它不再拥有请求对象,并且无法访问它。
当请求对象的所有权在驱动程序和框架之间传递时,对象句柄的值不会更改。 例如,如果驱动程序从I/O队列接收到一个请求,将其重新排入到另一个队列,然后再次接收到该请求,句柄的值将不会改变。 同样,如果驱动程序将请求转发到 I/O 目标,然后收到 I/O 目标完成请求的通知,驱动程序的通知回调函数将接收驱动程序提供给 I/O 目标的相同句柄值。