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
指向特定于驱动程序的微型任务扩展的指针。 如果微型类驱动程序在初始化时未请求 minitape 扩展,则 NULL。
[in, out] CommandExtension
指向命令扩展的指针。 如果微型类驱动程序在初始化时未请求命令扩展,则 NULL。
[in, out] CommandParameters
指向调用方分配的缓冲区的指针,该缓冲区包含 TAPE_CREATE_PARTITION 结构。
[in, out] Srb
指向磁带类驱动程序分配和部分填充的 SRB 的指针。 TAPE_PROCESS_COMMAND_ROUTINE 必须在 SRB 中填写 CDB。
- Cdb - 指向命令的 SCSI CDB 的指针。 使用 TapeClassZeroMemory 清除 CDB,然后再将其填写。
- CdbLength - 指定 CDB 中的字节数。
- 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 的第一次调用中,StatusOfLastCommand TAPE_STATUS_SUCCESS。 在后续调用中,如果发生错误,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 设置为成功 TAPE_PROCESS_COMMAND_ROUTINE。
返回值
返回代码 | 描述 |
---|---|
|
向磁带类驱动程序指示 SRB 已填充并已准备好发送到目标设备。 默认情况下,仅当 SRB 成功时,磁带类驱动程序才会再次调用 TAPE_PROCESS_COMMAND_ROUTINE。 微型类驱动程序可以通过在从 TAPE_PROCESS_COMMAND_ROUTINE返回之前设置 RetryFlags 来修改默认行为。 |
|
指示磁带类驱动程序递增 CallNumber,并在不向磁带设备发送 SRB 的情况下再次调用 TAPE_PROCESS_COMMAND_ROUTINE。 |
|
指示磁带类驱动程序填写 TEST UNIT READY 命令的 SRB,并将 SRB 发送到设备。 |
|
任何其他返回代码都向磁带类驱动程序指示命令已完成,并指示成功、失败或警告。 此例程的可能完成返回值包括但不限于:
|
言论
可以将以下函数分配给此回调占位符:
CreatePartition
CreatePartition 处理 IOCTL_TAPE_CREATE_PARTITION 请求的设备特定方面。 此例程是必需的。 CreatePartition 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来创建磁带上的分区。 创建分区通常需要一系列 SRB 才能完成该作。 CreatePartition 填充给定 SRB 并返回后,磁带类驱动程序会将 SRB 发送到目标设备,并根据 SRB 的结果以及 RetryFlags的值,再次调用 TapeMiniCreatePartition。CreatePartition 必须在返回磁带类驱动程序之前填写 SRB 中的以下成员:
如果磁带微型类驱动程序将分区信息存储在 minitape 扩展中,CreatePartition 更新扩展,然后再使用 TAPE_STATUS_SUCCESS 返回到磁带类驱动程序。
擦除
擦除 处理 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。
准备
准备 处理 IOCTL_TAPE_PREPARE 请求的设备特定方面。 此例程是必需的。 准备 通过在磁带类驱动程序传递的 SRB 中填充 CDB 来准备磁带。 如果设备支持请求的作,则准备磁带通常需要一个 SRB。 准备 填充 SRB 并返回后,磁带类驱动程序会将 SRB 发送到设备,并根据 SRB 的结果以及 RetryFlags的值,再次调用 准备。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 例程。 微型驱动程序应在 DriverEntry 例程中执行此作,然后再调用 TapeClassInitialize。 如果微型驱动程序不支持 WMI作,则应将 TapeWMIOperations 字段设置为 NULL。磁带类驱动程序将值分配给TAPE_WMI_OPERATIONS结构的成员,并将此结构传递给 minidriver 的 WMIOperations 例程中的 CommandParameters 参数。 与其他微型驱动程序例程一样,WMIOperations 填充、创建和初始化 SCSI 请求块(SRB)和实现指示的 WMI 方法所需的命令描述符块(CDB),并将控制权返回到磁带类驱动程序。 然后,磁带类驱动程序调用端口驱动程序来执行请求。
微型驱动程序返回由TAPE_WMI_OPERATIONS结构的 DataBuffer 成员指向的缓冲区中的 WMI 数据。
要求
要求 | 价值 |
---|---|
目标平台 | 桌面 |
标头 | minitape.h (包括 Minitape.h) |