File indexing completed on 2024-04-28 08:41:54

0001 #ifndef WINSPTI_H
0002 #define WINSPTI_H
0003 /*
0004  *
0005  * winspti.h
0006  * SPDX-FileCopyrightText: 2007 Jeremy C. Andrus <jeremy@jeremya.com>
0007  *
0008  * This file is part of the K3b project.
0009  * SPDX-FileCopyrightText: 1998-2007 Sebastian Trueg <trueg@k3b.org>
0010  *
0011  * Parts of this file are inspired (and copied) from various source
0012  * files in the cdrdao project (C) J. Schilling, Andreas Mueller
0013  * and many others.
0014  *
0015  * SPDX-License-Identifier: GPL-2.0-or-later
0016  * See the file "COPYING" for the exact licensing terms.
0017  */
0018 
0019 /*------------------------------------------------------------------------------
0020  winspti.h
0021 ------------------------------------------------------------------------------*/
0022 #include <windows.h>
0023 
0024 #define SENSE_LEN_SPTI          36  /* Sense length for ASPI is only 14 */
0025 #define NUM_MAX_NTSCSI_DRIVES   26  /* a: ... z:            */
0026 #define NUM_FLOPPY_DRIVES       2
0027 #define NUM_MAX_NTSCSI_HA       NUM_MAX_NTSCSI_DRIVES
0028 
0029 #define NTSCSI_HA_INQUIRY_SIZE  36
0030 
0031 #define SCSI_CMD_INQUIRY        0x12
0032 
0033 typedef struct
0034 {
0035   BYTE    ha;           /* SCSI Bus #           */
0036   BYTE    tgt;          /* SCSI Target #        */
0037   BYTE    lun;          /* SCSI Lun #           */
0038   BYTE    PortNumber;   /* SCSI Card # (\\.\SCSI%d) */
0039   BYTE    PathId;       /* SCSI Bus/Channel # on card n */
0040   BYTE    driveLetter;  /* Win32 drive letter (e.g. c:) */
0041   BOOL    bUsed;        /* Win32 drive letter is used   */
0042   HANDLE  hDevice;      /* Win32 handle for ioctl() */
0043   BYTE    inqData[NTSCSI_HA_INQUIRY_SIZE];
0044 } SPTI_Drive;
0045 
0046 typedef struct {
0047     USHORT      Length;
0048     UCHAR       ScsiStatus;
0049     UCHAR       PathId;
0050     UCHAR       TargetId;
0051     UCHAR       Lun;
0052     UCHAR       CdbLength;
0053     UCHAR       SenseInfoLength;
0054     UCHAR       DataIn;
0055     ULONG       DataTransferLength;
0056     ULONG       TimeOutValue;
0057     ULONG       DataBufferOffset;
0058     ULONG       SenseInfoOffset;
0059     UCHAR       Cdb[16];
0060 } SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH;
0061 
0062 
0063 typedef struct {
0064     USHORT      Length;
0065     UCHAR       ScsiStatus;
0066     UCHAR       PathId;
0067     UCHAR       TargetId;
0068     UCHAR       Lun;
0069     UCHAR       CdbLength;
0070     UCHAR       SenseInfoLength;
0071     UCHAR       DataIn;
0072     ULONG       DataTransferLength;
0073     ULONG       TimeOutValue;
0074     PVOID       DataBuffer;
0075     ULONG       SenseInfoOffset;
0076     UCHAR       Cdb[16];
0077 } SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT;
0078 
0079 
0080 typedef struct {
0081     SCSI_PASS_THROUGH spt;
0082     ULONG       Filler;
0083     UCHAR       ucSenseBuf[SENSE_LEN_SPTI];
0084     UCHAR       ucDataBuf[512];
0085 } SCSI_PASS_THROUGH_WITH_BUFFERS, *PSCSI_PASS_THROUGH_WITH_BUFFERS;
0086 
0087 
0088 typedef struct {
0089     SCSI_PASS_THROUGH_DIRECT spt;
0090     ULONG       Filler;
0091     UCHAR       ucSenseBuf[SENSE_LEN_SPTI];
0092 } SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, *PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
0093 
0094 
0095 
0096 typedef struct {
0097     UCHAR       NumberOfLogicalUnits;
0098     UCHAR       InitiatorBusId;
0099     ULONG       InquiryDataOffset;
0100 } SCSI_BUS_DATA, *PSCSI_BUS_DATA;
0101 
0102 
0103 typedef struct {
0104     BYTE        SD_Error;
0105     BYTE        SD_Segment;
0106     BYTE        SD_SenseKey;
0107     DWORD       SD_Information;
0108     BYTE        SD_AS_Length;
0109     DWORD       SD_CommandInformation;
0110     BYTE        SD_ASC;
0111     BYTE        SD_ASCQ;
0112     BYTE        SD_FieldReplaceableUnit;
0113     BYTE        SD_SpecificKey1;
0114     BYTE        SD_SpecificKey2;
0115     BYTE        SD_SpecificKey3;
0116     BYTE        SD_Data[14];
0117 } SCSI_SENSE_DATA, *PSCSI_SENSE_DATA;
0118 
0119 
0120 
0121 typedef struct {
0122     UCHAR       NumberOfBusses;
0123     SCSI_BUS_DATA   BusData[1];
0124 } SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;
0125 
0126 
0127 typedef struct {
0128     UCHAR       PathId;
0129     UCHAR       TargetId;
0130     UCHAR       Lun;
0131     BOOLEAN     DeviceClaimed;
0132     ULONG       InquiryDataLength;
0133     ULONG       NextInquiryDataOffset;
0134     UCHAR       InquiryData[1];
0135 } SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA;
0136 
0137 
0138 typedef struct {
0139     ULONG       Length;
0140     UCHAR       PortNumber;
0141     UCHAR       PathId;
0142     UCHAR       TargetId;
0143     UCHAR       Lun;
0144 } SCSI_ADDRESS, *PSCSI_ADDRESS;
0145 
0146 
0147 /*
0148  * method codes
0149  */
0150 #define METHOD_BUFFERED     0
0151 #define METHOD_IN_DIRECT    1
0152 #define METHOD_OUT_DIRECT   2
0153 #define METHOD_NEITHER      3
0154 
0155 /*
0156  * file access values
0157  */
0158 #define FILE_ANY_ACCESS     0
0159 #define FILE_READ_ACCESS    0x0001
0160 #define FILE_WRITE_ACCESS   0x0002
0161 
0162 
0163 #define IOCTL_SCSI_BASE    0x00000004
0164 
0165 /*
0166  * constants for DataIn member of SCSI_PASS_THROUGH* structures
0167  */
0168 #define SCSI_IOCTL_DATA_OUT     0
0169 #define SCSI_IOCTL_DATA_IN      1
0170 #define SCSI_IOCTL_DATA_UNSPECIFIED 2
0171 
0172 /*
0173  * Standard IOCTL define
0174  */
0175 #define CTL_CODE(DevType, Function, Method, Access)         \
0176     (((DevType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
0177 
0178 #define IOCTL_SCSI_PASS_THROUGH     CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
0179 #define IOCTL_SCSI_MINIPORT     CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
0180 #define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS)
0181 #define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS)
0182 #define IOCTL_SCSI_PASS_THROUGH_DIRECT  CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
0183 #define IOCTL_SCSI_GET_ADDRESS      CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS)
0184 
0185 #endif // WINSPTI_H