00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
#include "scsi.h"
00029 
#include "class.h"
00030 
00031 
00032 
00033 
00034 
00035 #define MAXIMUM_TAPE_INQUIRY_DATA 252
00036 
00037 
00038 
00039 
00040 
00041 typedef struct _TAPE_DATA {
00042      ULONG        
Flags;
00043      ULONG        
CurrentPartition;
00044      PVOID        
DeviceSpecificExtension;
00045      PSCSI_INQUIRY_DATA 
InquiryData;
00046 } 
TAPE_DATA, *
PTAPE_DATA;
00047 
00048 #define DEVICE_EXTENSION_SIZE sizeof(DEVICE_EXTENSION) + sizeof(TAPE_DATA)
00049 
00050 
00051 
00052 
00053 
00054 
00055 typedef struct _MODE_DEVICE_CONFIGURATION_PAGE {
00056 
00057     UCHAR 
PageCode : 6;
00058     UCHAR 
Reserved1 : 1;
00059     UCHAR 
PS : 1;
00060     UCHAR 
PageLength;
00061     UCHAR 
ActiveFormat : 5;
00062     UCHAR 
CAFBit : 1;
00063     UCHAR 
CAPBit : 1;
00064     UCHAR 
Reserved2 : 1;
00065     UCHAR 
ActivePartition;
00066     UCHAR 
WriteBufferFullRatio;
00067     UCHAR 
ReadBufferEmptyRatio;
00068     UCHAR 
WriteDelayTime[2];
00069     UCHAR 
REW : 1;
00070     UCHAR 
RBO : 1;
00071     UCHAR 
SOCF : 2;
00072     UCHAR 
AVC : 1;
00073     UCHAR 
RSmk : 1;
00074     UCHAR 
BIS : 1;
00075     UCHAR 
DBR : 1;
00076     UCHAR 
GapSize;
00077     UCHAR 
Reserved3 : 3;
00078     UCHAR 
SEW : 1;
00079     UCHAR 
EEG : 1;
00080     UCHAR 
EODdefined : 3;
00081     UCHAR 
BufferSize[3];
00082     UCHAR 
DCAlgorithm;
00083     UCHAR 
Reserved4;
00084 
00085 } 
MODE_DEVICE_CONFIGURATION_PAGE, *
PMODE_DEVICE_CONFIGURATION_PAGE;
00086 
00087 
00088 
00089 
00090 
00091 typedef struct _MODE_MEDIUM_PARTITION_PAGE {
00092 
00093     UCHAR 
PageCode : 6;
00094     UCHAR 
Reserved1 : 1;
00095     UCHAR 
PSBit : 1;
00096     UCHAR 
PageLength;
00097     UCHAR 
MaximumAdditionalPartitions;
00098     UCHAR 
AdditionalPartitionDefined;
00099     UCHAR 
Reserved2 : 3;
00100     UCHAR 
PSUMBit : 2;
00101     UCHAR 
IDPBit : 1;
00102     UCHAR 
SDPBit : 1;
00103     UCHAR 
FDPBit : 1;
00104     UCHAR 
MediumFormatRecognition;
00105     UCHAR 
Reserved3[2];
00106     UCHAR 
Partition0Size[2];
00107     UCHAR 
Partition1Size[2];
00108 
00109 } 
MODE_MEDIUM_PARTITION_PAGE, *
PMODE_MEDIUM_PARTITION_PAGE;
00110 
00111 
00112 
00113 
00114 
00115 typedef struct _MODE_DATA_COMPRESSION_PAGE {
00116 
00117     UCHAR 
PageCode : 6;
00118     UCHAR 
Reserved1 : 2;
00119     UCHAR 
PageLength;
00120     UCHAR 
Reserved2 : 6;
00121     UCHAR 
DCC : 1;
00122     UCHAR 
DCE : 1;
00123     UCHAR 
Reserved3 : 5;
00124     UCHAR 
RED : 2;
00125     UCHAR 
DDE : 1;
00126     UCHAR 
CompressionAlgorithm[4];
00127     UCHAR 
DecompressionAlgorithm[4];
00128     UCHAR 
Reserved4[4];
00129 
00130 } 
MODE_DATA_COMPRESSION_PAGE, *
PMODE_DATA_COMPRESSION_PAGE;
00131 
00132 
00133 
00134 
00135 
00136 
00137 typedef struct _MODE_MEDIUM_PART_PAGE {
00138 
00139    MODE_PARAMETER_HEADER       
ParameterListHeader;
00140    MODE_MEDIUM_PARTITION_PAGE  MediumPartPage;
00141 
00142 } 
MODE_MEDIUM_PART_PAGE, *
PMODE_MEDIUM_PART_PAGE;
00143 
00144 
00145 
00146 
00147 
00148 
00149 typedef struct _MODE_TAPE_MEDIA_INFORMATION {
00150 
00151    MODE_PARAMETER_HEADER       
ParameterListHeader;
00152    MODE_PARAMETER_BLOCK        
ParameterListBlock;
00153    MODE_MEDIUM_PARTITION_PAGE  MediumPartPage;
00154 
00155 } 
MODE_TAPE_MEDIA_INFORMATION, *
PMODE_TAPE_MEDIA_INFORMATION;
00156 
00157 
00158 
00159 
00160 
00161 
00162 typedef struct _MODE_DEVICE_CONFIG_PAGE {
00163 
00164    MODE_PARAMETER_HEADER       
ParameterListHeader;
00165    MODE_DEVICE_CONFIGURATION_PAGE  DeviceConfigPage;
00166 
00167 } 
MODE_DEVICE_CONFIG_PAGE, *
PMODE_DEVICE_CONFIG_PAGE;
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 typedef struct _MODE_DATA_COMPRESS_PAGE {
00176 
00177    MODE_PARAMETER_HEADER       
ParameterListHeader;
00178    MODE_DATA_COMPRESSION_PAGE  DataCompressPage;
00179 
00180 } 
MODE_DATA_COMPRESS_PAGE, *
PMODE_DATA_COMPRESS_PAGE;
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
NTSTATUS
00191 
DriverEntry(
00192     IN 
PDRIVER_OBJECT DriverObject,
00193     IN PUNICODE_STRING RegistryPath
00194     );
00195 
00196 
NTSTATUS
00197 
ScsiTapeInitialize(
00198     IN 
PDRIVER_OBJECT DriverObject
00199     );
00200 
00201 
NTSTATUS
00202 
ScsiTapeCreate (
00203     IN 
PDEVICE_OBJECT DeviceObject,
00204     IN 
PIRP Irp
00205     );
00206 
00207 
NTSTATUS
00208 
ScsiTapeReadWrite (
00209     IN 
PDEVICE_OBJECT DeviceObject,
00210     IN 
PIRP Irp
00211     );
00212 
00213 
NTSTATUS
00214 
ScsiTapeDeviceControl(
00215     IN 
PDEVICE_OBJECT DeviceObject,
00216     IN 
PIRP Irp
00217     );
00218 
00219 
00220 
00221 
00222 
00223 
00224 
00225 
00226 
NTSTATUS
00227 
TapeCreatePartition(
00228     IN 
PDEVICE_OBJECT DeviceObject,
00229     IN 
PIRP Irp
00230     );
00231 
00232 
NTSTATUS
00233 
TapeErase(
00234     IN 
PDEVICE_OBJECT DeviceObject,
00235     IN 
PIRP Irp
00236     );
00237 
00238 
VOID
00239 
TapeError(
00240     
PDEVICE_OBJECT DeviceObject,
00241     PSCSI_REQUEST_BLOCK Srb,
00242     NTSTATUS *Status,
00243     BOOLEAN *Retry
00244     );
00245 
00246 
NTSTATUS
00247 
TapeGetDriveParameters(
00248     IN 
PDEVICE_OBJECT DeviceObject,
00249     IN 
PIRP Irp
00250     );
00251 
00252 
NTSTATUS
00253 
TapeGetMediaParameters(
00254     IN 
PDEVICE_OBJECT DeviceObject,
00255     IN 
PIRP Irp
00256     );
00257 
00258 
NTSTATUS
00259 
TapeGetPosition(
00260     IN 
PDEVICE_OBJECT DeviceObject,
00261     IN 
PIRP Irp
00262     );
00263 
00264 
NTSTATUS
00265 
TapeGetStatus(
00266     IN 
PDEVICE_OBJECT DeviceObject,
00267     IN 
PIRP Irp
00268     );
00269 
00270 
NTSTATUS
00271 
TapePrepare(
00272     IN 
PDEVICE_OBJECT DeviceObject,
00273     IN 
PIRP Irp
00274     );
00275 
00276 
NTSTATUS
00277 
TapeReadWrite(
00278     IN 
PDEVICE_OBJECT DeviceObject,
00279     IN 
PIRP Irp
00280     );
00281 
00282 
NTSTATUS
00283 
TapeSetDriveParameters(
00284     IN 
PDEVICE_OBJECT DeviceObject,
00285     IN 
PIRP Irp
00286     );
00287 
00288 
NTSTATUS
00289 
TapeSetMediaParameters(
00290     IN 
PDEVICE_OBJECT DeviceObject,
00291     IN 
PIRP Irp
00292     );
00293 
00294 
NTSTATUS
00295 
TapeSetPosition(
00296     IN 
PDEVICE_OBJECT DeviceObject,
00297     IN 
PIRP Irp
00298     );
00299 
00300 BOOLEAN
00301 
TapeVerifyInquiry(
00302     IN PSCSI_INQUIRY_DATA LunInfo
00303     );
00304 
00305 
NTSTATUS
00306 
TapeWriteMarks(
00307     IN 
PDEVICE_OBJECT DeviceObject,
00308     IN 
PIRP Irp
00309     );
00310 
00311