TAPE_PROCESS_COMMAND_ROUTINE回调函数 (minitape.h)

TAPE_PROCESS_COMMAND_ROUTINE 处理 IOCTL 请求的设备特定方面。

语法

TAPE_PROCESS_COMMAND_ROUTINE TapeProcessCommandRoutine;

TAPE_STATUS TapeProcessCommandRoutine(
  [in, out]      PVOID MinitapeExtension,
  [in, out]      PVOID CommandExtension,
  [in, out]      PVOID CommandParameters,
  [in, out]      PSCSI_REQUEST_BLOCK Srb,
  [in]           ULONG CallNumber,
  [in, optional] TAPE_STATUS StatusOfLastCommand,
  [in, out]      PULONG RetryFlags
)
{...}

参数

[in, out] MinitapeExtension

指向特定于驱动程序的微型任务扩展的指针。 如果微型类驱动程序在初始化时未请求微型磁带扩展,则为 NULL

[in, out] CommandExtension

指向命令扩展的指针。 如果微型类驱动程序在初始化时未请求命令扩展,则为 NULL

[in, out] CommandParameters

指向调用方分配的缓冲区的指针,该缓冲区包含 TAPE_CREATE_PARTITION 结构。

[in, out] Srb

指向磁带类驱动程序分配并部分填充的 SRB 的指针。 TAPE_PROCESS_COMMAND_ROUTINE 必须在 SRB 中填写 CDB。

  • Cdb - 指向命令的 SCSI CDB 的指针。 在填写 CDB 之前,请使用 TapeClassZeroMemory 清除 CDB。
  • CdbLength - 指定 CDB 中的字节数。
TAPE_PROCESS_COMMAND_ROUTINE 也可能在 SRB 中填写以下成员:
  • DataBuffer - 指向要传输的数据缓冲区的指针。 使用 TapeClassAllocateSrbBuffer 分配长度大于或等于 DataTransferLength 的 DataBuffer
  • DataTransferLength - 指定要在 SRB 中传输的字节数。 此成员由 TapeClassAllocateSrbBuffer 设置。
  • TimeOutValue - 为此命令指定超时值,重写磁带类驱动程序的设备扩展的默认超时值。
  • SrbFlags - 指定此命令的标志。 如果 SRB 将数据发送到磁带驱动器,磁带微型类驱动程序必须设置SRB_FLAGS_DATA_OUT。 如果 SRB 正在从磁带驱动器请求数据,或者命令未传输任何数据,则此成员可以为零。

[in] CallNumber

指定调用 TAPE_PROCESS_COMMAND_ROUTINE 来处理给定磁带命令的次数。 首次调用此例程时,CallNumber 为零,并且每次后续调用都会递增,直到微型类驱动程序返回指示命令已完成的TAPE_STATUS值。

[in, optional] StatusOfLastCommand

指定最后一个命令的状态。 在对 TAPE_PROCESS_COMMAND_ROUTINE 处理给定请求的第一次调用中,将TAPE_STATUS_SUCCESS StatusOfLastCommand 。 在后续调用中,如果发生错误, 则 StatusOfLastCommand 为TAPE_STATUS_SUCCESS或错误状态,并且磁带小类驱动程序在上一次调用的 RetryFlags 中设置了RETURN_ERRORS。

[in, out] RetryFlags

指向变量的指针,该变量指定磁带设备报告错误时磁带类驱动程序应执行的操作。

低序字指定在 SCSI 命令失败时要执行的重试次数。 默认值为零, () 不重试。

高位字包含的标志指定发生错误时磁带类驱动程序应如何返回控制:

  • 如果清除RETURN_ERRORS和IGNORE_ERRORS (默认) 磁带类驱动程序会将失败状态返回给原始请求者。
  • 如果微型类驱动程序设置RETURN_ERRORS,则磁带类驱动程序调用 TAPE_PROCESS_COMMAND_ROUTINE ,并将 StatusOfLastCommand 设置为失败状态。
  • 如果微型类驱动程序设置IGNORE_ERRORS,磁带类驱动程序会将失败状态转换为成功,并调用将 StatusOfLastCommand 设置为 success 的TAPE_PROCESS_COMMAND_ROUTINE

返回值

返回代码 说明
TAPE_STATUS_SEND_SRB_AND_CALLBACK
向磁带类驱动程序指示 SRB 已填充并已准备好发送到目标设备。 默认情况下,磁带类驱动程序仅在 SRB 成功时再次调用 TAPE_PROCESS_COMMAND_ROUTINE 。 微类驱动程序可以通过在从 TAPE_PROCESS_COMMAND_ROUTINE 返回之前设置 RetryFlags 来修改默认行为。
TAPE_STATUS_CALLBACK
指示磁带类驱动程序递增 CallNumber 并再次调用 TAPE_PROCESS_COMMAND_ROUTINE ,而不向磁带设备发送 SRB。
TAPE_STATUS_CHECK_TEST_UNIT_READY
指示磁带类驱动程序填写 TEST UNIT READY 命令的 SRB 并将 SRB 发送到设备。
TAPE_STATUS_XXX
任何其他返回代码向磁带类驱动程序指示命令已完成,并指示成功、失败或警告。 此例程可能的完成返回值包括但不限于:
TAPE_STATUS_SUCCESS
TAPE_STATUS_INSUFFICIENT_RESOURCES
TAPE_STATUS_INVALID_DEVICE_REQUEST
TAPE_STATUS_INVALID_PARAMETER
TAPE_STATUS_IO_DEVICE_ERROR
TAPE_STATUS_MEDIA_WRITE_PROTECTED
TAPE_STATUS_NOT_IMPLEMENTED

注解

可以将以下函数分配给此回调占位符:

CreatePartition

CreatePartition 处理 IOCTL_TAPE_CREATE_PARTITION 请求的设备特定方面。 此例程是必需的。 CreatePartition 通过在磁带类驱动程序传递的 SRB 中填充 CDB,在磁带上创建分区。 创建分区通常需要一系列 SRB 才能完成操作。 在 CreatePartition 填充给定的 SRB 并返回后,磁带类驱动程序会将 SRB 发送到目标设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 TapeMiniCreatePartition

在返回到磁带类驱动程序之前,CreatePartition 必须在 SRB 中填写以下成员:

如果磁带微型类驱动程序将分区信息存储在微型磁带扩展中, 则 CreatePartition 会更新扩展,然后再使用 TAPE_STATUS_SUCCESS 返回到磁带类驱动程序。

擦 除

Erase 处理 IOCTL_TAPE_ERASE 请求的设备特定方面。 此例程是必需的。 擦除 通过填充磁带类驱动程序传递的 SRB 中的 CDB 来擦除磁带。 擦除磁带通常需要一个 SRB 才能完成操作。 在擦除填充 SRB 并返回后,磁带类驱动程序会将 SRB 发送到设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 Erase擦除 然后返回TAPE_STATUS_SUCCESS。

GetDriveParameters

GetDriveParameters 处理 IOCTL_TAPE_GET_DRIVE_PARAMS 请求的设备特定方面。 此例程是必需的。 GetDriveParameters 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来获取磁带驱动器参数。 获取驱动器参数通常需要一系列 SRB 才能完成操作。 在 GetDriveParameters 填充给定的 SRB 并返回后,磁带类驱动程序会将 SRB 发送到目标设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 GetDriveParameters

GetMediaParameters

GetMediaParameters 处理 IOCTL_TAPE_GET_MEDIA_PARAMS 请求的设备特定方面。 此例程是必需的。 GetMediaParameters 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来获取磁带介质参数。 获取媒体参数通常需要多个 SRB 才能完成操作,从测试单元准备就绪开始,微类驱动程序通过返回TAPE_STATUS_CHECK_TEST_UNIT_READY磁带类驱动程序首次调用例程时请求该单元。

在 GetMediaParameters 填充给定的 SRB 并返回后,磁带类驱动程序会将 SRB 发送到设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 GetMediaParameters。

GetMediaTypes

GetMediaTypes 处理 IOCTL_STORAGE_GET_MEDIA_TYPES_EX 请求的设备特定方面。 此例程是必需的。 GetMediaTypes 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来获取有关磁带设备支持的媒体类型的信息。 获取媒体类型通常需要多个 SRB 才能完成操作,从测试单元准备就绪开始,微类驱动程序通过返回TAPE_STATUS_CHECK_TEST_UNIT_READY磁带类驱动程序首次调用例程时请求该单元。

GetPosition

GetPosition 处理 IOCTL_TAPE_GET_POSITION 请求的设备特定方面。 此例程是必需的。 GetPosition 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来读取磁带的位置。 读取磁带位置通常需要多个 SRB 才能完成操作,通常从一个测试单元开始,小类驱动程序通过返回TAPE_STATUS_CHECK_TEST_UNIT_READY磁带类驱动程序首次调用例程时请求该单元。

GetStatus

GetStatus 处理 IOCTL_TAPE_GET_STATUS 请求的设备特定方面。 此例程是必需的。 GetStatus 读取磁带设备的状态,通常通过指示磁带类驱动程序发出测试单元就绪命令。

如果设备指示驱动器是否需要清理感知数据 (,而不是将清理需求报告为错误(微类驱动程序将在其 TapeMiniTapeError 例程) 中处理该错误), 则 GetStatus 会在磁带类驱动程序传递的 SRB 中填充 CDB 以获取检测数据,并在必要时, 返回TAPE_STATUS_REQUIRES_CLEANING。

准备

Prepare 处理 IOCTL_TAPE_PREPARE 请求的设备特定方面。 此例程是必需的。 准备 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来准备磁带。 如果设备支持请求的操作,则准备磁带通常需要一个 SRB。 在 Prepare 填充 SRB 并返回后,磁带类驱动程序会将 SRB 发送到设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 Prepare

SetDriveParameters

SetDriveParameters 处理 IOCTL_TAPE_SET_DRIVE_PARAMS 请求的设备特定方面。 此例程是必需的。 SetDriveParameters 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来为磁带设备设置参数。 设置参数通常涉及一系列 SRB 来完成操作。 在 SetDriveParameters 填充给定的 SRB 并返回后,磁带类驱动程序会将 SRB 发送到设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 SetDriveParameters

SetMediaParameters

SetMediaParameters 处理 IOCTL_TAPE_SET_MEDIA_PARAMS 请求中特定于设备的方面。 此例程是必需的。 SetMediaParameters 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来设置磁带的块大小。 设置块大小通常需要多个 SRB 才能完成操作,从小类驱动程序在磁带类驱动程序首次调用例程时通过返回TAPE_STATUS_CHECK_TEST_UNIT_READY测试单元准备就绪开始。

在 SetMediaParameters 填充给定的 SRB 并返回后,磁带类驱动程序会将 SRB 发送到设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 SetMediaParameters

SetPosition

SetPosition 处理 IOCTL_TAPE_SET_POSITION 请求的设备特定方面。 此例程是必需的。 SetPosition 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来设置磁带的位置。 设置位置通常需要一个 SRB。 在 SetPosition 填充 SRB 并返回后,磁带类驱动程序会将 SRB 发送到设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 SetPosition。 然后,SetPosition 返回TAPE_STATUS_SUCCESS。

WriteMarks

WriteMarks 处理 IOCTL_TAPE_WRITE_MARKS 请求的设备特定方面。 此例程是必需的。 WriteMarks 通过在磁带类驱动程序传递的 SRB 中填充 CDB,将标记写入磁带。 写入标记通常需要一个 SRB 才能完成操作。 在 WriteMarks 填充 SRB 并返回后,磁带类驱动程序会将 SRB 发送到设备,并根据 SRB 的结果和 RetryFlags 的值再次调用 WriteMarks。 然后,WriteMarks 返回TAPE_STATUS_SUCCESS。

PreProcessReadWrite

PreProcessReadWrite 是一个可选的特殊用途例程,用于执行读取和写入操作之前所需的任何特定于设备的操作。 大多数磁带微型类驱动程序不需要此例程。 PreProcessReadWrite 例程的活动特定于设备。 例程可以使用类驱动程序传递给它的信息来实现读取和写入的特殊预处理。 例如,如果驱动器的功能有限,驱动程序可能需要此例程来保持一致状态。

如果磁带微型类驱动程序在TAPE_INIT_DATA_EX结构中为此例程设置非 NULL 入口点,则磁带类驱动程序会从其 DriverEntry 例程传递给 TapeClassInitialize,则磁带类驱动程序在磁带设备上的每次读取和写入操作之前调用它。 类驱动程序不需要从此例程返回任何信息。

WMIOperations

WMIOperations 是从磁带类驱动程序进行的所有 WMI 调用的公共入口点。 支持 WMI 的微型驱动程序应在 结构TAPE_INIT_DATA_EX中设置函数指针成员 WMIOperations,以指向微型驱动程序的 TAPE_PROCESS_COMMAND_ROUTINE 例程。 在调用 TapeClassInitialize 之前,微型驱动程序应在其 DriverEntry 例程中执行此操作。 如果微型驱动程序不支持 WMI 操作,则应将 TapeWMIOperations 字段设置为 NULL

磁带类驱动程序将值分配给 TAPE_WMI_OPERATIONS 结构的成员,并在 CommandParameters 参数中将此结构传递给微型驱动程序的 WMIOperations 例程。 与其他微型驱动程序例程一样, WMIOperations (SRB) 填充、创建和初始化 SCSI 请求块,命令描述符块 (实现指示的 WMI 方法所需的 CDB) 块,并将控制权返回到磁带类驱动程序。 然后,磁带类驱动程序调用端口驱动程序来执行请求。

微型驱动程序返回 TAPE_WMI_OPERATIONS 结构的 DataBuffer 成员指向的缓冲区中的 WMI 数据。

要求

要求
目标平台 桌面
标头 minitape.h (包括 Minitape.h)

另请参阅

SCSI_REQUEST_BLOCK

TAPE_STATUS

TapeClassAllocateSrbBuffer

TapeClassZeroMemory