处理磁带设备控制请求

所有磁带微型类驱动程序必须使用 TAPE_STATUS 枚举器中列出的值报告状态。 但是,当磁带类驱动程序完成 I/O 控制请求时,它将使用等效的 NT 状态值报告状态。 下表提供了TAPE_STATUS值与其等效 NT 状态值之间的映射:

NT 状态值 磁带状态值

STATUS_INSUFFICIENT_RESOURCES

TAPE_STATUS_INSUFFICIENT_RESOURCES

STATUS_NOT_IMPLEMENTED

TAPE_STATUS_NOT_IMPLEMENTED

STATUS_INVALID_DEVICE_REQUEST

TAPE_STATUS_INVALID_DEVICE_REQUEST

STATUS_INVALID_PARAMETER

TAPE_STATUS_INVALID_PARAMETER

STATUS_VERIFY_REQUIRED

TAPE_STATUS_MEDIA_CHANGED

STATUS_BUS_RESET

TAPE_STATUS_BUS_RESET

STATUS_SETMARK_DETECTED

TAPE_STATUS_SETMARK_DETECTED

STATUS_FILEMARK_DETECTED

TAPE_STATUS_FILEMARK_DETECTED

STATUS_BEGINNING_OF_MEDIA

TAPE_STATUS_BEGINNING_OF_MEDIA

STATUS_END_OF_MEDIA

TAPE_STATUS_END_OF_MEDIA

STATUS_BUFFER_OVERFLOW

TAPE_STATUS_BUFFER_OVERFLOW

STATUS_NO_DATA_DETECTED

TAPE_STATUS_NO_DATA_DETECTED

STATUS_EOM_OVERFLOW

TAPE_STATUS_EOM_OVERFLOW

STATUS_NO_MEDIA

TAPE_STATUS_NO_MEDIA

STATUS_IO_DEVICE_ERROR

TAPE_STATUS_IO_DEVICE_ERROR

STATUS_UNRECOGNIZED_MEDIA

TAPE_STATUS_UNRECOGNIZED_MEDIA

STATUS_DEVICE_NOT_READY

TAPE_STATUS_DEVICE_NOT_READY

STATUS_MEDIA_WRITE_PROTECTED

TAPE_STATUS_MEDIA_WRITE_PROTECTED

STATUS_DEVICE_DATA_ERROR

TAPE_STATUS_DEVICE_DATA_ERROR

STATUS_NO_SUCH_DEVICE

TAPE_STATUS_NO_SUCH_DEVICE

STATUS_INVALID_BLOCK_LENGTH

TAPE_STATUS_INVALID_BLOCK_LENGTH

STATUS_IO_TIMEOUT

TAPE_STATUS_IO_TIMEOUT

STATUS_DEVICE_NOT_CONNECTED

TAPE_STATUS_DEVICE_NOT_CONNECTED

STATUS_DATA_OVERRUN

TAPE_STATUS_DATA_OVERRUN

STATUS_DEVICE_BUSY

TAPE_STATUS_DEVICE_BUSY

STATUS_DEVICE_REQUIRES_CLEANING

TAPE_STATUS_REQUIRES_CLEANING

STATUS_CLEANER_CARTRIDGE_INSTALLED

TAPE_STATUS_CLEANER_CARTRIDGE_INSTALLED

每当类驱动程序必须多次调用微类例程才能完成请求时,微类驱动程序都会使用返回状态来指示请求是否已完成或是否应再次调用该例程。 磁带类驱动程序维护对给定请求调用微类例程的次数的从零开始的计数,并将该计数作为 CallNumber 参数传递给例程。

微类例程返回以下状态值之一,指示类驱动程序应再次调用该例程:

  • TAPE_STATUS_SEND_SRB_AND_CALLBACK

    此返回值指示磁带类驱动程序将 SRB 发送到设备。 磁带小类例程通常在填写磁带类驱动程序传递的 SRB 后返回此状态。 如果操作成功,类驱动程序将递增 CallNumber 并再次调用微类例程。 如果 SRB 失败,类驱动程序会根据 RetryFlags 的值再次调用微类例程。

  • TAPE_STATUS_CHECK_TEST_UNIT_READY

    此返回值指示磁带类驱动程序为测试单元就绪命令创建 SRB,并将 SRB 发送到设备。

  • TAPE_STATUS_CALLBACK

    此返回值指示磁带类驱动程序在不向设备发送 SRB 的情况下递增 CallNumber 。 这简化了支持多个设备的案例陈述。 例如,假设特定微类驱动程序支持的大多数磁带设备都需要三个 SRB 来处理特定请求。 但是,一个设备只需要第一个和第三个 SRB。 对于唯一设备,磁带微型类驱动程序可以返回TAPE_STATUS_CALLBACK跳过第二个 SRB,从而允许驱动程序使用相同的代码来处理它支持的所有设备的请求。

  • TAPE_STATUS_REQUIRES_CLEANING

    如果磁带设备支持清理通知,而不是错误,磁带微型类驱动程序的 TapeMiniGetStatus 例程将返回此状态,以指示磁带类驱动程序需要清理驱动器。

当微类例程处理完请求(成功或重试后出现错误)时,它将返回磁带类驱动程序,其中包含指示请求成功或失败的 TAPE_STATUS_XXX