1/*
2 * ntddstor.h
3 *
4 * Storage class IOCTL interface.
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22
23#ifndef _NTDDSTOR_H_
24#define _NTDDSTOR_H_
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30#if defined(DEFINE_GUID)
31
32DEFINE_GUID(GUID_DEVINTERFACE_DISK,
33  0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
34
35DEFINE_GUID(GUID_DEVINTERFACE_CDROM,
36  0x53f56308, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
37
38DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,
39  0x53f5630a, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
40
41DEFINE_GUID(GUID_DEVINTERFACE_TAPE,
42  0x53f5630b, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
43
44DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,
45  0x53f5630c, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
46
47DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,
48  0x53f5630d, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
49
50DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,
51  0x53f56310, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
52
53DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,
54  0x53f56311, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
55
56DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,
57  0x53f56312, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
58
59DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,
60  0x2accfe60, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
61
62DEFINE_GUID(GUID_DEVINTERFACE_HIDDEN_VOLUME,
63  0x7f108a28, 0x9833, 0x4b3b, 0xb7, 0x80, 0x2c, 0x6b, 0x5f, 0xa5, 0xc0, 0x62);
64
65#define WDI_STORAGE_PREDICT_FAILURE_DPS_GUID \
66  {0xe9f2d03a, 0x747c, 0x41c2, {0xbb, 0x9a, 0x02, 0xc6, 0x2b, 0x6d, 0x5f, 0xcb}};
67
68/* Aliases for storage guids */
69#define DiskClassGuid               GUID_DEVINTERFACE_DISK
70#define CdRomClassGuid              GUID_DEVINTERFACE_CDROM
71#define PartitionClassGuid          GUID_DEVINTERFACE_PARTITION
72#define TapeClassGuid               GUID_DEVINTERFACE_TAPE
73#define WriteOnceDiskClassGuid      GUID_DEVINTERFACE_WRITEONCEDISK
74#define VolumeClassGuid             GUID_DEVINTERFACE_VOLUME
75#define MediumChangerClassGuid      GUID_DEVINTERFACE_MEDIUMCHANGER
76#define FloppyClassGuid             GUID_DEVINTERFACE_FLOPPY
77#define CdChangerClassGuid          GUID_DEVINTERFACE_CDCHANGER
78#define StoragePortClassGuid        GUID_DEVINTERFACE_STORAGEPORT
79#define HiddenVolumeClassGuid       GUID_DEVINTERFACE_HIDDEN_VOLUME
80
81#endif /* defined(DEFINE_GUID) */
82
83#ifndef _WINIOCTL_
84
85#define IOCTL_STORAGE_BASE                FILE_DEVICE_MASS_STORAGE
86
87#define IOCTL_STORAGE_CHECK_VERIFY \
88  CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
89
90#define IOCTL_STORAGE_CHECK_VERIFY2 \
91  CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)
92
93#define IOCTL_STORAGE_MEDIA_REMOVAL \
94  CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
95
96#define IOCTL_STORAGE_EJECT_MEDIA \
97  CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
98
99#define IOCTL_STORAGE_LOAD_MEDIA \
100  CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
101
102#define IOCTL_STORAGE_LOAD_MEDIA2 \
103  CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS)
104
105#define IOCTL_STORAGE_RESERVE \
106  CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
107
108#define IOCTL_STORAGE_RELEASE \
109  CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
110
111#define IOCTL_STORAGE_FIND_NEW_DEVICES \
112  CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
113
114#define IOCTL_STORAGE_EJECTION_CONTROL \
115  CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)
116
117#define IOCTL_STORAGE_MCN_CONTROL \
118  CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS)
119
120#define IOCTL_STORAGE_GET_MEDIA_TYPES \
121  CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
122
123#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX \
124  CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)
125
126#define IOCTL_STORAGE_RESET_BUS \
127  CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)
128
129#define IOCTL_STORAGE_RESET_DEVICE \
130  CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)
131
132#define IOCTL_STORAGE_GET_DEVICE_NUMBER \
133  CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS)
134
135#define IOCTL_STORAGE_PREDICT_FAILURE \
136  CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)
137
138#endif /* _WINIOCTL_ */
139
140#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER \
141  CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
142
143#define IOCTL_STORAGE_GET_HOTPLUG_INFO \
144  CTL_CODE(IOCTL_STORAGE_BASE, 0x0305, METHOD_BUFFERED, FILE_ANY_ACCESS)
145
146#define IOCTL_STORAGE_SET_HOTPLUG_INFO \
147  CTL_CODE(IOCTL_STORAGE_BASE, 0x0306, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
148
149#define OBSOLETE_IOCTL_STORAGE_RESET_BUS \
150  CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
151
152#define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE \
153  CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
154
155#define IOCTL_STORAGE_BREAK_RESERVATION \
156  CTL_CODE(IOCTL_STORAGE_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)
157
158#define IOCTL_STORAGE_PERSISTENT_RESERVE_IN \
159  CTL_CODE(IOCTL_STORAGE_BASE, 0x0406, METHOD_BUFFERED, FILE_READ_ACCESS)
160
161#define IOCTL_STORAGE_PERSISTENT_RESERVE_OUT \
162  CTL_CODE(IOCTL_STORAGE_BASE, 0x0407, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
163
164#define IOCTL_STORAGE_READ_CAPACITY \
165  CTL_CODE(IOCTL_STORAGE_BASE, 0x0450, METHOD_BUFFERED, FILE_READ_ACCESS)
166
167#define IOCTL_STORAGE_QUERY_PROPERTY \
168  CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
169
170#define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES \
171  CTL_CODE(IOCTL_STORAGE_BASE, 0x0501, METHOD_BUFFERED, FILE_WRITE_ACCESS)
172
173#define IOCTL_STORAGE_GET_BC_PROPERTIES \
174  CTL_CODE(IOCTL_STORAGE_BASE, 0x0600, METHOD_BUFFERED, FILE_READ_ACCESS)
175
176#define IOCTL_STORAGE_ALLOCATE_BC_STREAM \
177  CTL_CODE(IOCTL_STORAGE_BASE, 0x0601, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
178
179#define IOCTL_STORAGE_FREE_BC_STREAM \
180  CTL_CODE(IOCTL_STORAGE_BASE, 0x0602, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
181
182#define IOCTL_STORAGE_CHECK_PRIORITY_HINT_SUPPORT \
183  CTL_CODE(IOCTL_STORAGE_BASE, 0x0620, METHOD_BUFFERED, FILE_ANY_ACCESS)
184
185#define RECOVERED_WRITES_VALID         0x00000001
186#define UNRECOVERED_WRITES_VALID       0x00000002
187#define RECOVERED_READS_VALID          0x00000004
188#define UNRECOVERED_READS_VALID        0x00000008
189#define WRITE_COMPRESSION_INFO_VALID   0x00000010
190#define READ_COMPRESSION_INFO_VALID    0x00000020
191
192#define TAPE_RETURN_STATISTICS         __MSABI_LONG(0)
193#define TAPE_RETURN_ENV_INFO           __MSABI_LONG(1)
194#define TAPE_RESET_STATISTICS          __MSABI_LONG(2)
195
196/* DEVICE_MEDIA_INFO.DeviceSpecific.DiskInfo.MediaCharacteristics constants */
197#define MEDIA_ERASEABLE                   0x00000001
198#define MEDIA_WRITE_ONCE                  0x00000002
199#define MEDIA_READ_ONLY                   0x00000004
200#define MEDIA_READ_WRITE                  0x00000008
201#define MEDIA_WRITE_PROTECTED             0x00000100
202#define MEDIA_CURRENTLY_MOUNTED           0x80000000
203
204#define StorageIdTypeNAA StorageIdTypeFCPHName
205
206#define DeviceDsmActionFlag_NonDestructive  0x80000000
207
208#define IsDsmActionNonDestructive(_Action) ((BOOLEAN)((_Action & DeviceDsmActionFlag_NonDestructive) != 0))
209
210#define DeviceDsmAction_None            0
211#define DeviceDsmAction_Trim            1
212#define DeviceDsmAction_Notification   (2 | DeviceDsmActionFlag_NonDestructive)
213
214#define DEVICE_DSM_FLAG_ENTIRE_DATA_SET_RANGE    0x00000001
215
216#define DEVICE_DSM_NOTIFY_FLAG_BEGIN             0x00000001
217#define DEVICE_DSM_NOTIFY_FLAG_END               0x00000002
218
219#define IOCTL_STORAGE_BC_VERSION                 1
220
221#define STORAGE_PRIORITY_HINT_SUPPORTED          0x0001
222
223typedef struct _STORAGE_HOTPLUG_INFO {
224  ULONG Size;
225  BOOLEAN MediaRemovable;
226  BOOLEAN MediaHotplug;
227  BOOLEAN DeviceHotplug;
228  BOOLEAN WriteCacheEnableOverride;
229} STORAGE_HOTPLUG_INFO, *PSTORAGE_HOTPLUG_INFO;
230
231typedef struct _STORAGE_DEVICE_NUMBER {
232  DEVICE_TYPE DeviceType;
233  ULONG DeviceNumber;
234  ULONG PartitionNumber;
235} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;
236
237typedef struct _STORAGE_BUS_RESET_REQUEST {
238  UCHAR PathId;
239} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;
240
241typedef struct _STORAGE_BREAK_RESERVATION_REQUEST {
242  ULONG Length;
243  UCHAR _unused;
244  UCHAR PathId;
245  UCHAR TargetId;
246  UCHAR Lun;
247} STORAGE_BREAK_RESERVATION_REQUEST, *PSTORAGE_BREAK_RESERVATION_REQUEST;
248
249#ifndef _WINIOCTL_
250typedef struct _PREVENT_MEDIA_REMOVAL {
251  BOOLEAN PreventMediaRemoval;
252} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
253#endif
254
255typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
256  ULONG MediaChangeCount;
257  ULONG NewState;
258} CLASS_MEDIA_CHANGE_CONTEXT, *PCLASS_MEDIA_CHANGE_CONTEXT;
259
260typedef struct _TAPE_STATISTICS {
261  ULONG Version;
262  ULONG Flags;
263  LARGE_INTEGER RecoveredWrites;
264  LARGE_INTEGER UnrecoveredWrites;
265  LARGE_INTEGER RecoveredReads;
266  LARGE_INTEGER UnrecoveredReads;
267  UCHAR CompressionRatioReads;
268  UCHAR CompressionRatioWrites;
269} TAPE_STATISTICS, *PTAPE_STATISTICS;
270
271typedef struct _TAPE_GET_STATISTICS {
272  ULONG Operation;
273} TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS;
274
275typedef enum _STORAGE_MEDIA_TYPE {
276  DDS_4mm = 0x20,
277  MiniQic,
278  Travan,
279  QIC,
280  MP_8mm,
281  AME_8mm,
282  AIT1_8mm,
283  DLT,
284  NCTP,
285  IBM_3480,
286  IBM_3490E,
287  IBM_Magstar_3590,
288  IBM_Magstar_MP,
289  STK_DATA_D3,
290  SONY_DTF,
291  DV_6mm,
292  DMI,
293  SONY_D2,
294  CLEANER_CARTRIDGE,
295  CD_ROM,
296  CD_R,
297  CD_RW,
298  DVD_ROM,
299  DVD_R,
300  DVD_RW,
301  MO_3_RW,
302  MO_5_WO,
303  MO_5_RW,
304  MO_5_LIMDOW,
305  PC_5_WO,
306  PC_5_RW,
307  PD_5_RW,
308  ABL_5_WO,
309  PINNACLE_APEX_5_RW,
310  SONY_12_WO,
311  PHILIPS_12_WO,
312  HITACHI_12_WO,
313  CYGNET_12_WO,
314  KODAK_14_WO,
315  MO_NFR_525,
316  NIKON_12_RW,
317  IOMEGA_ZIP,
318  IOMEGA_JAZ,
319  SYQUEST_EZ135,
320  SYQUEST_EZFLYER,
321  SYQUEST_SYJET,
322  AVATAR_F2,
323  MP2_8mm,
324  DST_S,
325  DST_M,
326  DST_L,
327  VXATape_1,
328  VXATape_2,
329#if (NTDDI_VERSION < NTDDI_WINXP)
330  STK_EAGLE,
331#else
332  STK_9840,
333#endif
334  LTO_Ultrium,
335  LTO_Accelis,
336  DVD_RAM,
337  AIT_8mm,
338  ADR_1,
339  ADR_2,
340  STK_9940,
341  SAIT,
342  VXATape
343} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
344
345typedef enum _STORAGE_BUS_TYPE {
346  BusTypeUnknown = 0x00,
347  BusTypeScsi,
348  BusTypeAtapi,
349  BusTypeAta,
350  BusType1394,
351  BusTypeSsa,
352  BusTypeFibre,
353  BusTypeUsb,
354  BusTypeRAID,
355  BusTypeiScsi,
356  BusTypeSas,
357  BusTypeSata,
358  BusTypeSd,
359  BusTypeMmc,
360  BusTypeVirtual,
361  BusTypeFileBackedVirtual,
362  BusTypeMax,
363  BusTypeMaxReserved = 0x7F
364} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
365
366typedef struct _DEVICE_MEDIA_INFO {
367  union {
368    struct {
369      LARGE_INTEGER Cylinders;
370      STORAGE_MEDIA_TYPE MediaType;
371      ULONG TracksPerCylinder;
372      ULONG SectorsPerTrack;
373      ULONG BytesPerSector;
374      ULONG NumberMediaSides;
375      ULONG MediaCharacteristics;
376    } DiskInfo;
377    struct {
378      LARGE_INTEGER Cylinders;
379      STORAGE_MEDIA_TYPE MediaType;
380      ULONG TracksPerCylinder;
381      ULONG SectorsPerTrack;
382      ULONG BytesPerSector;
383      ULONG NumberMediaSides;
384      ULONG MediaCharacteristics;
385    } RemovableDiskInfo;
386    struct {
387      STORAGE_MEDIA_TYPE MediaType;
388      ULONG MediaCharacteristics;
389      ULONG CurrentBlockSize;
390      STORAGE_BUS_TYPE BusType;
391      union {
392        struct {
393          UCHAR MediumType;
394          UCHAR DensityCode;
395        } ScsiInformation;
396      } BusSpecificData;
397    } TapeInfo;
398  } DeviceSpecific;
399} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
400
401typedef struct _GET_MEDIA_TYPES {
402  ULONG DeviceType;
403  ULONG MediaInfoCount;
404  DEVICE_MEDIA_INFO MediaInfo[1];
405} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
406
407typedef struct _STORAGE_PREDICT_FAILURE {
408  ULONG PredictFailure;
409  UCHAR VendorSpecific[512];
410} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;
411
412typedef enum _STORAGE_QUERY_TYPE {
413  PropertyStandardQuery = 0,
414  PropertyExistsQuery,
415  PropertyMaskQuery,
416  PropertyQueryMaxDefined
417} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
418
419typedef enum _STORAGE_PROPERTY_ID {
420  StorageDeviceProperty = 0,
421  StorageAdapterProperty,
422  StorageDeviceIdProperty,
423  StorageDeviceUniqueIdProperty,
424  StorageDeviceWriteCacheProperty,
425  StorageMiniportProperty,
426  StorageAccessAlignmentProperty,
427  StorageDeviceSeekPenaltyProperty,
428  StorageDeviceTrimProperty,
429  StorageDeviceWriteAggregationProperty
430} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
431
432typedef struct _STORAGE_PROPERTY_QUERY {
433  STORAGE_PROPERTY_ID PropertyId;
434  STORAGE_QUERY_TYPE QueryType;
435  UCHAR AdditionalParameters[1];
436} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
437
438typedef struct _STORAGE_DESCRIPTOR_HEADER {
439  ULONG Version;
440  ULONG Size;
441} STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
442
443typedef struct _STORAGE_DEVICE_DESCRIPTOR {
444  ULONG Version;
445  ULONG Size;
446  UCHAR DeviceType;
447  UCHAR DeviceTypeModifier;
448  BOOLEAN RemovableMedia;
449  BOOLEAN CommandQueueing;
450  ULONG VendorIdOffset;
451  ULONG ProductIdOffset;
452  ULONG ProductRevisionOffset;
453  ULONG SerialNumberOffset;
454  STORAGE_BUS_TYPE BusType;
455  ULONG RawPropertiesLength;
456  UCHAR RawDeviceProperties[1];
457} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
458
459typedef struct _STORAGE_ADAPTER_DESCRIPTOR {
460  ULONG Version;
461  ULONG Size;
462  ULONG MaximumTransferLength;
463  ULONG MaximumPhysicalPages;
464  ULONG AlignmentMask;
465  BOOLEAN AdapterUsesPio;
466  BOOLEAN AdapterScansDown;
467  BOOLEAN CommandQueueing;
468  BOOLEAN AcceleratedTransfer;
469#if (NTDDI_VERSION < NTDDI_WINXP)
470  BOOLEAN BusType;
471#else
472  UCHAR BusType;
473#endif
474  USHORT BusMajorVersion;
475  USHORT BusMinorVersion;
476} STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
477
478typedef struct _STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR {
479  ULONG Version;
480  ULONG Size;
481  ULONG BytesPerCacheLine;
482  ULONG BytesOffsetForCacheAlignment;
483  ULONG BytesPerLogicalSector;
484  ULONG BytesPerPhysicalSector;
485  ULONG BytesOffsetForSectorAlignment;
486} STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR, *PSTORAGE_ACCESS_ALIGNMENT_DESCRIPTOR;
487
488typedef enum _STORAGE_PORT_CODE_SET {
489  StoragePortCodeSetReserved = 0,
490  StoragePortCodeSetStorport = 1,
491  StoragePortCodeSetSCSIport = 2
492} STORAGE_PORT_CODE_SET, *PSTORAGE_PORT_CODE_SET;
493
494typedef struct _STORAGE_MINIPORT_DESCRIPTOR {
495  ULONG Version;
496  ULONG Size;
497  STORAGE_PORT_CODE_SET Portdriver;
498  BOOLEAN LUNResetSupported;
499  BOOLEAN TargetResetSupported;
500} STORAGE_MINIPORT_DESCRIPTOR, *PSTORAGE_MINIPORT_DESCRIPTOR;
501
502typedef enum _STORAGE_IDENTIFIER_CODE_SET {
503  StorageIdCodeSetReserved = 0,
504  StorageIdCodeSetBinary = 1,
505  StorageIdCodeSetAscii = 2,
506  StorageIdCodeSetUtf8 = 3
507} STORAGE_IDENTIFIER_CODE_SET, *PSTORAGE_IDENTIFIER_CODE_SET;
508
509typedef enum _STORAGE_IDENTIFIER_TYPE {
510  StorageIdTypeVendorSpecific = 0,
511  StorageIdTypeVendorId = 1,
512  StorageIdTypeEUI64 = 2,
513  StorageIdTypeFCPHName = 3,
514  StorageIdTypePortRelative = 4,
515  StorageIdTypeTargetPortGroup = 5,
516  StorageIdTypeLogicalUnitGroup = 6,
517  StorageIdTypeMD5LogicalUnitIdentifier = 7,
518  StorageIdTypeScsiNameString = 8
519} STORAGE_IDENTIFIER_TYPE, *PSTORAGE_IDENTIFIER_TYPE;
520
521typedef enum _STORAGE_ID_NAA_FORMAT {
522  StorageIdNAAFormatIEEEExtended = 2,
523  StorageIdNAAFormatIEEERegistered = 3,
524  StorageIdNAAFormatIEEEERegisteredExtended = 5
525} STORAGE_ID_NAA_FORMAT, *PSTORAGE_ID_NAA_FORMAT;
526
527typedef enum _STORAGE_ASSOCIATION_TYPE {
528  StorageIdAssocDevice = 0,
529  StorageIdAssocPort = 1,
530  StorageIdAssocTarget = 2
531} STORAGE_ASSOCIATION_TYPE, *PSTORAGE_ASSOCIATION_TYPE;
532
533typedef struct _STORAGE_IDENTIFIER {
534  STORAGE_IDENTIFIER_CODE_SET CodeSet;
535  STORAGE_IDENTIFIER_TYPE Type;
536  USHORT IdentifierSize;
537  USHORT NextOffset;
538  STORAGE_ASSOCIATION_TYPE Association;
539  UCHAR Identifier[1];
540} STORAGE_IDENTIFIER, *PSTORAGE_IDENTIFIER;
541
542typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
543  ULONG Version;
544  ULONG Size;
545  ULONG NumberOfIdentifiers;
546  UCHAR Identifiers[1];
547} STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
548
549typedef struct _DEVICE_SEEK_PENALTY_DESCRIPTOR {
550  ULONG Version;
551  ULONG Size;
552  BOOLEAN IncursSeekPenalty;
553} DEVICE_SEEK_PENALTY_DESCRIPTOR, *PDEVICE_SEEK_PENALTY_DESCRIPTOR;
554
555typedef struct _DEVICE_WRITE_AGGREGATION_DESCRIPTOR {
556  ULONG Version;
557  ULONG Size;
558  BOOLEAN BenefitsFromWriteAggregation;
559} DEVICE_WRITE_AGGREGATION_DESCRIPTOR, *PDEVICE_WRITE_AGGREGATION_DESCRIPTOR;
560
561typedef struct _DEVICE_TRIM_DESCRIPTOR {
562  ULONG Version;
563  ULONG Size;
564  BOOLEAN TrimEnabled;
565} DEVICE_TRIM_DESCRIPTOR, *PDEVICE_TRIM_DESCRIPTOR;
566
567typedef ULONG DEVICE_DATA_MANAGEMENT_SET_ACTION;
568
569typedef struct _DEVICE_DATA_SET_RANGE {
570  LONGLONG StartingOffset;
571  ULONGLONG LengthInBytes;
572} DEVICE_DATA_SET_RANGE, *PDEVICE_DATA_SET_RANGE;
573
574typedef struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES {
575  ULONG Size;
576  DEVICE_DATA_MANAGEMENT_SET_ACTION Action;
577  ULONG Flags;
578  ULONG ParameterBlockOffset;
579  ULONG ParameterBlockLength;
580  ULONG DataSetRangesOffset;
581  ULONG DataSetRangesLength;
582} DEVICE_MANAGE_DATA_SET_ATTRIBUTES, *PDEVICE_MANAGE_DATA_SET_ATTRIBUTES;
583
584typedef struct _DEVICE_DSM_NOTIFICATION_PARAMETERS {
585  ULONG Size;
586  ULONG Flags;
587  ULONG NumFileTypeIDs;
588  GUID FileTypeID[1];
589} DEVICE_DSM_NOTIFICATION_PARAMETERS, *PDEVICE_DSM_NOTIFICATION_PARAMETERS;
590
591typedef struct _STORAGE_GET_BC_PROPERTIES_OUTPUT {
592  ULONG MaximumRequestsPerPeriod;
593  ULONG MinimumPeriod;
594  ULONGLONG MaximumRequestSize;
595  ULONG EstimatedTimePerRequest;
596  ULONG NumOutStandingRequests;
597  ULONGLONG RequestSize;
598} STORAGE_GET_BC_PROPERTIES_OUTPUT, *PSTORAGE_GET_BC_PROPERTIES_OUTPUT;
599
600typedef struct _STORAGE_ALLOCATE_BC_STREAM_INPUT {
601  ULONG Version;
602  ULONG RequestsPerPeriod;
603  ULONG Period;
604  BOOLEAN RetryFailures;
605  BOOLEAN Discardable;
606  BOOLEAN Reserved1[2];
607  ULONG AccessType;
608  ULONG AccessMode;
609} STORAGE_ALLOCATE_BC_STREAM_INPUT, *PSTORAGE_ALLOCATE_BC_STREAM_INPUT;
610
611typedef struct _STORAGE_ALLOCATE_BC_STREAM_OUTPUT {
612  ULONGLONG RequestSize;
613  ULONG NumOutStandingRequests;
614} STORAGE_ALLOCATE_BC_STREAM_OUTPUT, *PSTORAGE_ALLOCATE_BC_STREAM_OUTPUT;
615
616typedef struct _STORAGE_PRIORITY_HINT_SUPPORT {
617  ULONG SupportFlags;
618} STORAGE_PRIORITY_HINT_SUPPORT, *PSTORAGE_PRIORITY_HINT_SUPPORT;
619
620#if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
621
622typedef struct _STORAGE_MEDIA_SERIAL_NUMBER_DATA {
623  USHORT Reserved;
624  USHORT SerialNumberLength;
625  UCHAR SerialNumber[0];
626} STORAGE_MEDIA_SERIAL_NUMBER_DATA, *PSTORAGE_MEDIA_SERIAL_NUMBER_DATA;
627
628typedef struct _PERSISTENT_RESERVE_COMMAND {
629  ULONG Version;
630  ULONG Size;
631  __C89_NAMELESS union {
632    struct {
633      UCHAR ServiceAction:5;
634      UCHAR Reserved1:3;
635      USHORT AllocationLength;
636    } PR_IN;
637    struct {
638      UCHAR ServiceAction:5;
639      UCHAR Reserved1:3;
640      UCHAR Type:4;
641      UCHAR Scope:4;
642      UCHAR ParameterList[0];
643    } PR_OUT;
644  } DUMMYUNIONNAME;
645} PERSISTENT_RESERVE_COMMAND, *PPERSISTENT_RESERVE_COMMAND;
646
647#endif /* defined(_MSC_EXTENSIONS) */
648
649typedef struct _STORAGE_READ_CAPACITY {
650  ULONG Version;
651  ULONG Size;
652  ULONG BlockLength;
653  LARGE_INTEGER NumberOfBlocks;
654  LARGE_INTEGER DiskLength;
655} STORAGE_READ_CAPACITY, *PSTORAGE_READ_CAPACITY;
656
657typedef enum _WRITE_CACHE_TYPE {
658  WriteCacheTypeUnknown,
659  WriteCacheTypeNone,
660  WriteCacheTypeWriteBack,
661  WriteCacheTypeWriteThrough
662} WRITE_CACHE_TYPE;
663
664typedef enum _WRITE_CACHE_ENABLE {
665  WriteCacheEnableUnknown,
666  WriteCacheDisabled,
667  WriteCacheEnabled
668} WRITE_CACHE_ENABLE;
669
670typedef enum _WRITE_CACHE_CHANGE {
671  WriteCacheChangeUnknown,
672  WriteCacheNotChangeable,
673  WriteCacheChangeable
674} WRITE_CACHE_CHANGE;
675
676typedef enum _WRITE_THROUGH {
677  WriteThroughUnknown,
678  WriteThroughNotSupported,
679  WriteThroughSupported
680} WRITE_THROUGH;
681
682typedef struct _STORAGE_WRITE_CACHE_PROPERTY {
683  ULONG Version;
684  ULONG Size;
685  WRITE_CACHE_TYPE WriteCacheType;
686  WRITE_CACHE_ENABLE WriteCacheEnabled;
687  WRITE_CACHE_CHANGE WriteCacheChangeable;
688  WRITE_THROUGH WriteThroughSupported;
689  BOOLEAN FlushCacheSupported;
690  BOOLEAN UserDefinedPowerProtection;
691  BOOLEAN NVCacheEnabled;
692} STORAGE_WRITE_CACHE_PROPERTY, *PSTORAGE_WRITE_CACHE_PROPERTY;
693
694#ifdef __cplusplus
695}
696#endif
697
698#endif /* _NTDDSTOR_H_ */
699