1/*
2 * This program is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU General Public License as
4 * published by the Free Software Foundation; either version 2 of
5 * the License, or (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
15 * MA 02111-1307 USA
16 */
17#ifndef SG_PT_WIN32_H
18#define SG_PT_WIN32_H
19/*
20 * The information in this file was obtained from scsi-wnt.h by
21 * Richard Stemmer, rs@epost.de . He in turn gives credit to
22 * Jay A. Key (for scsipt.c).
23 * The plscsi program (by Pat LaVarre <p.lavarre@ieee.org>) has
24 * also been used as a reference.
25 * Much of the information in this header can also be obtained
26 * from msdn.microsoft.com .
27 */
28
29#include <windows.h>
30
31#define SCSI_MAX_SENSE_LEN 64
32#define SCSI_MAX_CDB_LEN 16
33#define SCSI_MAX_INDIRECT_DATA 8192
34
35typedef struct {
36        USHORT          Length;
37        UCHAR           ScsiStatus;
38        UCHAR           PathId;
39        UCHAR           TargetId;
40        UCHAR           Lun;
41        UCHAR           CdbLength;
42        UCHAR           SenseInfoLength;
43        UCHAR           DataIn;
44        ULONG           DataTransferLength;
45        ULONG           TimeOutValue;
46        ULONG           DataBufferOffset;
47        ULONG           SenseInfoOffset;
48        UCHAR           Cdb[SCSI_MAX_CDB_LEN];
49} SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH;
50
51
52typedef struct {
53        USHORT          Length;
54        UCHAR           ScsiStatus;
55        UCHAR           PathId;
56        UCHAR           TargetId;
57        UCHAR           Lun;
58        UCHAR           CdbLength;
59        UCHAR           SenseInfoLength;
60        UCHAR           DataIn;
61        ULONG           DataTransferLength;
62        ULONG           TimeOutValue;
63        PVOID           DataBuffer;
64        ULONG           SenseInfoOffset;
65        UCHAR           Cdb[SCSI_MAX_CDB_LEN];
66} SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT;
67
68
69typedef struct {
70        SCSI_PASS_THROUGH spt;
71        /* plscsi shows a follow on 16 bytes allowing 32 byte cdb */
72        ULONG           Filler;
73        UCHAR           ucSenseBuf[SCSI_MAX_SENSE_LEN];
74        UCHAR           ucDataBuf[SCSI_MAX_INDIRECT_DATA];
75} SCSI_PASS_THROUGH_WITH_BUFFERS, *PSCSI_PASS_THROUGH_WITH_BUFFERS;
76
77
78typedef struct {
79        SCSI_PASS_THROUGH_DIRECT spt;
80        ULONG           Filler;
81        UCHAR           ucSenseBuf[SCSI_MAX_SENSE_LEN];
82} SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, *PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
83
84
85
86typedef struct {
87        UCHAR           NumberOfLogicalUnits;
88        UCHAR           InitiatorBusId;
89        ULONG           InquiryDataOffset;
90} SCSI_BUS_DATA, *PSCSI_BUS_DATA;
91
92
93typedef struct {
94        UCHAR           NumberOfBusses;
95        SCSI_BUS_DATA   BusData[1];
96} SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;
97
98
99typedef struct {
100        UCHAR           PathId;
101        UCHAR           TargetId;
102        UCHAR           Lun;
103        BOOLEAN         DeviceClaimed;
104        ULONG           InquiryDataLength;
105        ULONG           NextInquiryDataOffset;
106        UCHAR           InquiryData[1];
107} SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA;
108
109
110typedef struct {
111        ULONG           Length;
112        UCHAR           PortNumber;
113        UCHAR           PathId;
114        UCHAR           TargetId;
115        UCHAR           Lun;
116} SCSI_ADDRESS, *PSCSI_ADDRESS;
117
118
119/*
120 * method codes
121 */
122#define METHOD_BUFFERED         0
123#define METHOD_IN_DIRECT        1
124#define METHOD_OUT_DIRECT       2
125#define METHOD_NEITHER          3
126
127/*
128 * file access values
129 */
130#define FILE_ANY_ACCESS         0
131#define FILE_READ_ACCESS        0x0001
132#define FILE_WRITE_ACCESS       0x0002
133
134
135#define IOCTL_SCSI_BASE    0x00000004
136
137/*
138 * constants for DataIn member of SCSI_PASS_THROUGH* structures
139 */
140#define SCSI_IOCTL_DATA_OUT             0
141#define SCSI_IOCTL_DATA_IN              1
142#define SCSI_IOCTL_DATA_UNSPECIFIED     2
143
144/*
145 * Standard IOCTL define
146 */
147#define CTL_CODE(DevType, Function, Method, Access)             \
148        (((DevType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
149
150#define IOCTL_SCSI_PASS_THROUGH         CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
151#define IOCTL_SCSI_MINIPORT             CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
152#define IOCTL_SCSI_GET_INQUIRY_DATA     CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS)
153#define IOCTL_SCSI_GET_CAPABILITIES     CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS)
154#define IOCTL_SCSI_PASS_THROUGH_DIRECT  CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
155#define IOCTL_SCSI_GET_ADDRESS          CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS)
156
157#endif
158