다음을 통해 공유


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에 대한 포인터입니다. 채우기 전에 TapeClassZeroMemory 를 사용하여 CDB를 지웁니다.
  • CdbLength - CDB의 바이트 수를 지정합니다.
TAPE_PROCESS_COMMAND_ROUTINE SRB에서 다음 멤버를 채울 수도 있습니다.
  • DataBuffer - 전송할 데이터 버퍼에 대한 포인터입니다. TapeClassAllocateSrbBuffer를 사용하여 DataTransferLength보다 크거나 같은 길이의 DataBuffer를 할당합니다.
  • DataTransferLength - SRB에서 전송할 바이트 수를 지정합니다. 이 멤버는 TapeClassAllocateSrbBuffer에 의해 설정됩니다.
  • TimeOutValue - 테이프 클래스 드라이버의 디바이스 확장에서 기본 제한 시간 값을 재정의하여 이 명령에 대한 제한 시간 값을 지정합니다.
  • SrbFlags - 이 명령에 대한 플래그를 지정합니다. SRB가 테이프 드라이브에 데이터를 보내는 경우 테이프 미니클래스 드라이버는 SRB_FLAGS_DATA_OUT 설정해야 합니다. SRB가 테이프 드라이브에서 데이터를 요청하거나 명령에 의해 전송되는 데이터가 없는 경우 이 멤버는 0일 수 있습니다.

[in] CallNumber

지정된 테이프 명령을 처리하기 위해 TAPE_PROCESS_COMMAND_ROUTINE 호출된 횟수를 지정합니다. CallNumber 는 이 루틴이 처음 호출될 때 0이며 미니클래스 드라이버가 명령이 완료되었음을 나타내는 TAPE_STATUS 값을 반환할 때까지 각 후속 호출에 대해 증가합니다.

[in, optional] StatusOfLastCommand

마지막 명령의 상태 지정합니다. 지정된 요청을 처리하기 위해 TAPE_PROCESS_COMMAND_ROUTINE 첫 번째 호출에서 StatusOfLastCommand 가 TAPE_STATUS_SUCCESS. 후속 호출에서 StatusOfLastCommand는 오류가 발생하고 테이프 미니클래스 드라이버가 이전 호출의 RetryFlags에서 RETURN_ERRORS 설정한 경우 TAPE_STATUS_SUCCESS 또는 오류 상태.

[in, out] RetryFlags

테이프 디바이스에서 오류를 보고할 때 테이프 클래스 드라이버가 수행해야 하는 작업을 지정하는 변수에 대한 포인터입니다.

낮은 순서의 단어는 SCSI 명령 실패 시 수행할 재시도 횟수를 지정합니다. 기본값은 0입니다(재시도 없음).

상위 단어에는 오류가 발생할 경우 테이프 클래스 드라이버가 컨트롤을 반환하는 방법을 지정하는 플래그가 포함되어 있습니다.

  • RETURN_ERRORS 및 IGNORE_ERRORS 명확하면(기본값) 테이프 클래스 드라이버는 원래 요청자에게 오류 상태 반환합니다.
  • 미니클래스 드라이버가 RETURN_ERRORS 설정하면 테이프 클래스 드라이버는 StatusOfLastCommand가 오류 상태 설정된 TAPE_PROCESS_COMMAND_ROUTINE 호출합니다.
  • 미니클래스 드라이버가 IGNORE_ERRORS 설정하면 테이프 클래스 드라이버는 실패 상태 성공으로 변환하고 StatusOfLastCommand가 성공으로 설정된 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 를 증가시키고 테이프 디바이스에 SRB를 보내지 않고 TAPE_PROCESS_COMMAND_ROUTINE 다시 호출하도록 지시합니다.
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

CreatePartitionIOCTL_TAPE_CREATE_PARTITION 요청의 디바이스별 측면을 처리합니다. 이 루틴은 필수입니다. CreatePartition 은 테이프 클래스 드라이버가 전달한 SRB의 CDB를 채워 테이프에 파티션을 만듭니다. 파티션을 만들려면 일반적으로 작업을 완료하려면 일련의 SRB가 필요합니다. CreatePartition이 지정된 SRB를 채우고 반환하면 테이프 클래스 드라이버는 SRB를 대상 디바이스로 보내고, SRB의 결과와 RetryFlags 값에 따라 TapeMiniCreatePartition을 다시 호출합니다.

CreatePartition 은 테이프 클래스 드라이버로 돌아가기 전에 SRB에서 다음 멤버를 입력해야 합니다.

테이프 미니클래스 드라이버가 파티션 정보를 미니 테이프 확장에 저장하는 경우 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를 입력하여 테이프 미디어 매개 변수를 가져옵니다. 미디어 매개 변수를 가져오려면 일반적으로 테이프 클래스 드라이버가 루틴을 처음 호출할 때 TAPE_STATUS_CHECK_TEST_UNIT_READY 반환하여 미니클래스 드라이버가 요청하는 테스트 단위 준비부터 시작하여 작업을 완료하려면 둘 이상의 SRB가 필요합니다.

GetMediaParameters가 지정된 SRB를 채우고 반환한 후 테이프 클래스 드라이버는 SRB를 디바이스로 보내고 SRB의 결과와 RetryFlags 값에 따라 GetMediaParameters를 다시 호출합니다.

GetMediaTypes

GetMediaTypes는IOCTL_STORAGE_GET_MEDIA_TYPES_EX 요청의 디바이스별 측면을 처리합니다. 이 루틴은 필수입니다. GetMediaTypes 는 테이프 클래스 드라이버가 전달한 SRB의 CDB를 입력하여 테이프 디바이스에서 지원하는 미디어 형식에 대한 정보를 가져옵니다. 미디어 형식을 가져오려면 일반적으로 테이프 클래스 드라이버가 루틴을 처음 호출할 때 TAPE_STATUS_CHECK_TEST_UNIT_READY 반환하여 미니클래스 드라이버가 요청하는 테스트 단위 준비부터 시작하여 작업을 완료하려면 둘 이상의 SRB가 필요합니다.

Getposition

GetPositionIOCTL_TAPE_GET_POSITION 요청의 디바이스별 측면을 처리합니다. 이 루틴은 필수입니다. GetPosition 은 테이프 클래스 드라이버가 전달한 SRB의 CDB를 입력하여 테이프의 위치를 읽습니다. 일반적으로 테이프 위치를 읽으려면 작업을 완료하는 데 SRB가 두 개 이상 필요하며, 테이프 클래스 드라이버가 루틴을 처음 호출할 때 TAPE_STATUS_CHECK_TEST_UNIT_READY 반환하여 미니클래스 드라이버가 요청하는 테스트 단위 준비부터 시작하는 경우가 많습니다.

GetStatus

GetStatusIOCTL_TAPE_GET_STATUS 요청의 디바이스별 측면을 처리합니다. 이 루틴은 필수입니다. GetStatus는 일반적으로 테이프 클래스 드라이버에 테스트 단위 준비 명령을 실행하도록 지시하여 테이프 디바이스의 상태 읽습니다.

디바이스가 미니클래스 드라이버가 TapeMiniTapeError 루틴에서 처리할 오류로 정리의 필요성을 보고하는 것과는 달리, 드라이브가 의미 있는 데이터를 정리해야 하는지 여부를 나타내는 경우 GetStatus 는 테이프 클래스 드라이버가 전달한 SRB의 CDB를 채우며 필요한 경우 TAPE_STATUS_REQUIRES_CLEANING 반환합니다.

준비

준비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를 채워 테이프의 블록 크기를 설정합니다. 블록 크기를 설정하려면 일반적으로 테이프 클래스 드라이버가 루틴을 처음 호출할 때 TAPE_STATUS_CHECK_TEST_UNIT_READY 반환하여 미니클래스 드라이버가 요청하는 테스트 단위 준비부터 작업을 완료하는 데 두 개 이상의 SRB가 필요합니다.

SetMediaParameters가 지정된 SRB를 채우고 반환하면 테이프 클래스 드라이버는 SRB를 디바이스로 보내고 SRB의 결과와 RetryFlags 값에 따라 SetMediaParameters를 다시 호출합니다.

SetPosition

SetPositionIOCTL_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 루틴의 활동은 디바이스별로 다릅니다. 루틴은 클래스 드라이버가 전달한 정보를 사용하여 읽기 및 쓰기에 대한 특수 전처리를 구현할 수 있습니다. 드라이브에 제한된 기능이 있는 경우 예를 들어 드라이버가 일관된 상태를 유지하기 위해 이 루틴이 필요할 수 있습니다.

테이프 미니클래스 드라이버가 DriverEntry 루틴에서 TapeClassInitialize로 전달하는 TAPE_INIT_DATA_EX 구조에서 이 루틴에 대해 NULL이 아닌 진입점을 설정하는 경우 테이프 클래스 드라이버는 테이프 디바이스에서 각 읽기 및 쓰기 작업 전에 호출합니다. 클래스 드라이버는 이 루틴에서 어떤 정보도 다시 기대하지 않습니다.

WMIOperations

WMIOperations 는 테이프 클래스 드라이버의 모든 WMI 호출에 대한 공통 진입점입니다. WMI를 지원하는 미니드라이버에서는 미니드라이버의 TAPE_PROCESS_COMMAND_ROUTINE 루틴을 가리키도록 구조 TAPE_INIT_DATA_EX 함수 포인터 멤버인 WMIOperations를 설정해야 합니다. Minidriver는 TapeClassInitialize를 호출하기 전에 DriverEntry 루틴에서 이 작업을 수행해야 합니다. 미니드라이버에서 WMI 작업을 지원하지 않는 경우 TapeWMIOperations 필드를 NULL로 설정해야 합니다.

테이프 클래스 드라이버는 TAPE_WMI_OPERATIONS 구조체의 멤버에 값을 할당하고 CommandParameters 매개 변수의 미니드라이버 WMIOperations 루틴에 이 구조를 전달합니다. 다른 미니 드라이버 루틴과 마찬가지로 WMIOperations는 표시된 WMI 메서드를 구현하는 데 필요한 SRB(SCSI 요청 블록) 및 CDB(명령 설명자 블록)를 채우고, 만들고, 초기화하고, 컨트롤을 테이프 클래스 드라이버에 반환합니다. 그런 다음 테이프 클래스 드라이버는 포트 드라이버를 호출하여 요청을 실행합니다.

미니 드라이버는 TAPE_WMI_OPERATIONS 구조체의 DataBuffer 멤버가 가리키는 버퍼의 WMI 데이터를 반환합니다.

요구 사항

요구 사항
대상 플랫폼 데스크톱
머리글 minitape.h(Minitape.h 포함)

추가 정보

SCSI_REQUEST_BLOCK

TAPE_STATUS

TapeClassAllocateSrbBuffer

TapeClassZeroMemory