312 lines
5.9 KiB
C++
312 lines
5.9 KiB
C++
/*++
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
tape.h
|
||
|
||
Abstract:
|
||
|
||
These are the structures and defines that are used in the
|
||
SCSI tape class drivers. The tape class driver is separated
|
||
into two modules. Tape.c contains code common to all tape
|
||
class drivers including the driver's major entry points.
|
||
The major entry point names each begin with the prefix
|
||
'ScsiTape.' The second module is the device specific code.
|
||
It provides support for a set of functions. Each device
|
||
specific function name is prefixed by 'Tape.'
|
||
|
||
Author:
|
||
|
||
Mike Glass
|
||
|
||
Revision History:
|
||
|
||
*/
|
||
|
||
#include "scsi.h"
|
||
#include "class.h"
|
||
|
||
|
||
// Define the maximum inquiry data length.
|
||
|
||
|
||
#define MAXIMUM_TAPE_INQUIRY_DATA 252
|
||
|
||
|
||
// Tape device data
|
||
|
||
|
||
typedef struct _TAPE_DATA {
|
||
ULONG Flags;
|
||
ULONG CurrentPartition;
|
||
PVOID DeviceSpecificExtension;
|
||
PSCSI_INQUIRY_DATA InquiryData;
|
||
} TAPE_DATA, *PTAPE_DATA;
|
||
|
||
#define DEVICE_EXTENSION_SIZE sizeof(DEVICE_EXTENSION) + sizeof(TAPE_DATA)
|
||
|
||
|
||
|
||
// Define Device Configuration Page
|
||
|
||
|
||
typedef struct _MODE_DEVICE_CONFIGURATION_PAGE {
|
||
|
||
UCHAR PageCode : 6;
|
||
UCHAR Reserved1 : 1;
|
||
UCHAR PS : 1;
|
||
UCHAR PageLength;
|
||
UCHAR ActiveFormat : 5;
|
||
UCHAR CAFBit : 1;
|
||
UCHAR CAPBit : 1;
|
||
UCHAR Reserved2 : 1;
|
||
UCHAR ActivePartition;
|
||
UCHAR WriteBufferFullRatio;
|
||
UCHAR ReadBufferEmptyRatio;
|
||
UCHAR WriteDelayTime[2];
|
||
UCHAR REW : 1;
|
||
UCHAR RBO : 1;
|
||
UCHAR SOCF : 2;
|
||
UCHAR AVC : 1;
|
||
UCHAR RSmk : 1;
|
||
UCHAR BIS : 1;
|
||
UCHAR DBR : 1;
|
||
UCHAR GapSize;
|
||
UCHAR Reserved3 : 3;
|
||
UCHAR SEW : 1;
|
||
UCHAR EEG : 1;
|
||
UCHAR EODdefined : 3;
|
||
UCHAR BufferSize[3];
|
||
UCHAR DCAlgorithm;
|
||
UCHAR Reserved4;
|
||
|
||
} MODE_DEVICE_CONFIGURATION_PAGE, *PMODE_DEVICE_CONFIGURATION_PAGE;
|
||
|
||
|
||
// Define Medium Partition Page
|
||
|
||
|
||
typedef struct _MODE_MEDIUM_PARTITION_PAGE {
|
||
|
||
UCHAR PageCode : 6;
|
||
UCHAR Reserved1 : 1;
|
||
UCHAR PSBit : 1;
|
||
UCHAR PageLength;
|
||
UCHAR MaximumAdditionalPartitions;
|
||
UCHAR AdditionalPartitionDefined;
|
||
UCHAR Reserved2 : 3;
|
||
UCHAR PSUMBit : 2;
|
||
UCHAR IDPBit : 1;
|
||
UCHAR SDPBit : 1;
|
||
UCHAR FDPBit : 1;
|
||
UCHAR MediumFormatRecognition;
|
||
UCHAR Reserved3[2];
|
||
UCHAR Partition0Size[2];
|
||
UCHAR Partition1Size[2];
|
||
|
||
} MODE_MEDIUM_PARTITION_PAGE, *PMODE_MEDIUM_PARTITION_PAGE;
|
||
|
||
|
||
// Define Data Compression Page
|
||
|
||
|
||
typedef struct _MODE_DATA_COMPRESSION_PAGE {
|
||
|
||
UCHAR PageCode : 6;
|
||
UCHAR Reserved1 : 2;
|
||
UCHAR PageLength;
|
||
UCHAR Reserved2 : 6;
|
||
UCHAR DCC : 1;
|
||
UCHAR DCE : 1;
|
||
UCHAR Reserved3 : 5;
|
||
UCHAR RED : 2;
|
||
UCHAR DDE : 1;
|
||
UCHAR CompressionAlgorithm[4];
|
||
UCHAR DecompressionAlgorithm[4];
|
||
UCHAR Reserved4[4];
|
||
|
||
} MODE_DATA_COMPRESSION_PAGE, *PMODE_DATA_COMPRESSION_PAGE;
|
||
|
||
|
||
// Mode parameter list header and medium partition page -
|
||
// used in creating partitions
|
||
|
||
|
||
typedef struct _MODE_MEDIUM_PART_PAGE {
|
||
|
||
MODE_PARAMETER_HEADER ParameterListHeader;
|
||
MODE_MEDIUM_PARTITION_PAGE MediumPartPage;
|
||
|
||
} MODE_MEDIUM_PART_PAGE, *PMODE_MEDIUM_PART_PAGE;
|
||
|
||
|
||
|
||
// Mode parameters for retrieving tape or media information
|
||
|
||
|
||
typedef struct _MODE_TAPE_MEDIA_INFORMATION {
|
||
|
||
MODE_PARAMETER_HEADER ParameterListHeader;
|
||
MODE_PARAMETER_BLOCK ParameterListBlock;
|
||
MODE_MEDIUM_PARTITION_PAGE MediumPartPage;
|
||
|
||
} MODE_TAPE_MEDIA_INFORMATION, *PMODE_TAPE_MEDIA_INFORMATION;
|
||
|
||
|
||
// Mode parameter list header and device configuration page -
|
||
// used in retrieving device configuration information
|
||
|
||
|
||
typedef struct _MODE_DEVICE_CONFIG_PAGE {
|
||
|
||
MODE_PARAMETER_HEADER ParameterListHeader;
|
||
MODE_DEVICE_CONFIGURATION_PAGE DeviceConfigPage;
|
||
|
||
} MODE_DEVICE_CONFIG_PAGE, *PMODE_DEVICE_CONFIG_PAGE;
|
||
|
||
|
||
|
||
// Mode parameter list header and data compression page -
|
||
// used in retrieving data compression information
|
||
|
||
|
||
typedef struct _MODE_DATA_COMPRESS_PAGE {
|
||
|
||
MODE_PARAMETER_HEADER ParameterListHeader;
|
||
MODE_DATA_COMPRESSION_PAGE DataCompressPage;
|
||
|
||
} MODE_DATA_COMPRESS_PAGE, *PMODE_DATA_COMPRESS_PAGE;
|
||
|
||
|
||
|
||
|
||
// The following routines are the exported entry points for
|
||
// all tape class drivers. Note all these routines name start
|
||
// with 'ScsiTape.'
|
||
|
||
|
||
NTSTATUS
|
||
DriverEntry(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PUNICODE_STRING RegistryPath
|
||
);
|
||
|
||
NTSTATUS
|
||
ScsiTapeInitialize(
|
||
IN PDRIVER_OBJECT DriverObject
|
||
);
|
||
|
||
NTSTATUS
|
||
ScsiTapeCreate (
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
ScsiTapeReadWrite (
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
ScsiTapeDeviceControl(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
|
||
|
||
|
||
// The following routines are provided by the tape
|
||
// device-specific module. Each routine name is
|
||
// prefixed with 'Tape.'
|
||
|
||
NTSTATUS
|
||
TapeCreatePartition(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeErase(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
TapeError(
|
||
PDEVICE_OBJECT DeviceObject,
|
||
PSCSI_REQUEST_BLOCK Srb,
|
||
NTSTATUS *Status,
|
||
BOOLEAN *Retry
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeGetDriveParameters(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeGetMediaParameters(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeGetPosition(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeGetStatus(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapePrepare(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeReadWrite(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeSetDriveParameters(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeSetMediaParameters(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeSetPosition(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
BOOLEAN
|
||
TapeVerifyInquiry(
|
||
IN PSCSI_INQUIRY_DATA LunInfo
|
||
);
|
||
|
||
NTSTATUS
|
||
TapeWriteMarks(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
|