| 1 | /*
 | 
|---|
| 2 |  * ntdddisk.h
 | 
|---|
| 3 |  *
 | 
|---|
| 4 |  * Disk 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 __NTDDDISK_H
 | 
|---|
| 24 | #define __NTDDDISK_H
 | 
|---|
| 25 | 
 | 
|---|
| 26 | #if __GNUC__ >=3
 | 
|---|
| 27 | #pragma GCC system_header
 | 
|---|
| 28 | #endif
 | 
|---|
| 29 | 
 | 
|---|
| 30 | #ifdef __cplusplus
 | 
|---|
| 31 | extern "C" {
 | 
|---|
| 32 | #endif
 | 
|---|
| 33 | 
 | 
|---|
| 34 | #include "ntddk.h"
 | 
|---|
| 35 | #include "ntddstor.h"
 | 
|---|
| 36 | 
 | 
|---|
| 37 | #define DD_DISK_DEVICE_NAME               "\\Device\\UNKNOWN"
 | 
|---|
| 38 | #define DD_DISK_DEVICE_NAME_U             L"\\Device\\UNKNOWN"
 | 
|---|
| 39 | 
 | 
|---|
| 40 | #define IOCTL_DISK_BASE                   FILE_DEVICE_DISK
 | 
|---|
| 41 | 
 | 
|---|
| 42 | #define IOCTL_DISK_CHECK_VERIFY \
 | 
|---|
| 43 |   CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
 | 
|---|
| 44 | 
 | 
|---|
| 45 | #define IOCTL_DISK_CONTROLLER_NUMBER \
 | 
|---|
| 46 |   CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 47 | 
 | 
|---|
| 48 | #define IOCTL_DISK_CREATE_DISK \
 | 
|---|
| 49 |   CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 50 | 
 | 
|---|
| 51 | #define IOCTL_DISK_DELETE_DRIVE_LAYOUT \
 | 
|---|
| 52 |   CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 53 | 
 | 
|---|
| 54 | #define IOCTL_DISK_FIND_NEW_DEVICES \
 | 
|---|
| 55 |   CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
 | 
|---|
| 56 | 
 | 
|---|
| 57 | #define IOCTL_DISK_FORMAT_TRACKS \
 | 
|---|
| 58 |   CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 59 | 
 | 
|---|
| 60 | #define IOCTL_DISK_FORMAT_TRACKS_EX \
 | 
|---|
| 61 |   CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 62 | 
 | 
|---|
| 63 | #define IOCTL_DISK_GET_CACHE_INFORMATION \
 | 
|---|
| 64 |   CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS)
 | 
|---|
| 65 | 
 | 
|---|
| 66 | #define IOCTL_DISK_GET_DRIVE_GEOMETRY \
 | 
|---|
| 67 |   CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 68 | 
 | 
|---|
| 69 | #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX \
 | 
|---|
| 70 |   CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 71 | 
 | 
|---|
| 72 | #define IOCTL_DISK_GET_DRIVE_LAYOUT \
 | 
|---|
| 73 |   CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
 | 
|---|
| 74 | 
 | 
|---|
| 75 | #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX \
 | 
|---|
| 76 |   CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 77 | 
 | 
|---|
| 78 | #define IOCTL_DISK_GET_MEDIA_TYPES \
 | 
|---|
| 79 |   CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 80 | 
 | 
|---|
| 81 | #define IOCTL_DISK_GET_LENGTH_INFO \
 | 
|---|
| 82 |   CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)
 | 
|---|
| 83 | 
 | 
|---|
| 84 | #define IOCTL_DISK_GET_PARTITION_INFO \
 | 
|---|
| 85 |   CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
 | 
|---|
| 86 | 
 | 
|---|
| 87 | #define IOCTL_DISK_GET_PARTITION_INFO_EX \
 | 
|---|
| 88 |   CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 89 | 
 | 
|---|
| 90 | #define IOCTL_DISK_GROW_PARTITION \
 | 
|---|
| 91 |   CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 92 | 
 | 
|---|
| 93 | #define IOCTL_DISK_INTERNAL_CLEAR_VERIFY \
 | 
|---|
| 94 |   CTL_CODE(IOCTL_DISK_BASE, 0x0101, METHOD_NEITHER, FILE_ANY_ACCESS)
 | 
|---|
| 95 | 
 | 
|---|
| 96 | #define IOCTL_DISK_INTERNAL_SET_VERIFY \
 | 
|---|
| 97 |   CTL_CODE(IOCTL_DISK_BASE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS)
 | 
|---|
| 98 | 
 | 
|---|
| 99 | #define IOCTL_DISK_IS_WRITABLE \
 | 
|---|
| 100 |   CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 101 | 
 | 
|---|
| 102 | #define IOCTL_DISK_PERFORMANCE \
 | 
|---|
| 103 |   CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 104 | 
 | 
|---|
| 105 | #define IOCTL_DISK_PERFORMANCE_OFF \
 | 
|---|
| 106 |   CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 107 | 
 | 
|---|
| 108 | #define IOCTL_DISK_REASSIGN_BLOCKS \
 | 
|---|
| 109 |   CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 110 | 
 | 
|---|
| 111 | #define IOCTL_DISK_RESERVE \
 | 
|---|
| 112 |   CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
 | 
|---|
| 113 | 
 | 
|---|
| 114 | #define IOCTL_DISK_SET_CACHE_INFORMATION \
 | 
|---|
| 115 |   CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 116 | 
 | 
|---|
| 117 | #define IOCTL_DISK_SET_DRIVE_LAYOUT \
 | 
|---|
| 118 |   CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 119 | 
 | 
|---|
| 120 | #define IOCTL_DISK_SET_DRIVE_LAYOUT_EX \
 | 
|---|
| 121 |   CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 122 | 
 | 
|---|
| 123 | #define IOCTL_DISK_SET_PARTITION_INFO \
 | 
|---|
| 124 |   CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 125 | 
 | 
|---|
| 126 | #define IOCTL_DISK_SET_PARTITION_INFO_EX \
 | 
|---|
| 127 |   CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 128 | 
 | 
|---|
| 129 | #define IOCTL_DISK_UPDATE_DRIVE_SIZE \
 | 
|---|
| 130 |   CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 131 | 
 | 
|---|
| 132 | #define IOCTL_DISK_VERIFY \
 | 
|---|
| 133 |   CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)
 | 
|---|
| 134 | 
 | 
|---|
| 135 | #define SMART_GET_VERSION \
 | 
|---|
| 136 |   CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
 | 
|---|
| 137 | 
 | 
|---|
| 138 | #define SMART_RCV_DRIVE_DATA \
 | 
|---|
| 139 |   CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 140 | 
 | 
|---|
| 141 | #define SMART_SEND_DRIVE_COMMAND \
 | 
|---|
| 142 |   CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 | 
|---|
| 143 | 
 | 
|---|
| 144 | 
 | 
|---|
| 145 | #define PARTITION_ENTRY_UNUSED            0x00
 | 
|---|
| 146 | #define PARTITION_FAT_12                  0x01
 | 
|---|
| 147 | #define PARTITION_XENIX_1                 0x02
 | 
|---|
| 148 | #define PARTITION_XENIX_2                 0x03
 | 
|---|
| 149 | #define PARTITION_FAT_16                  0x04
 | 
|---|
| 150 | #define PARTITION_EXTENDED                0x05
 | 
|---|
| 151 | #define PARTITION_HUGE                    0x06
 | 
|---|
| 152 | #define PARTITION_IFS                     0x07
 | 
|---|
| 153 | #define PARTITION_OS2BOOTMGR              0x0A
 | 
|---|
| 154 | #define PARTITION_FAT32                   0x0B
 | 
|---|
| 155 | #define PARTITION_FAT32_XINT13            0x0C
 | 
|---|
| 156 | #define PARTITION_XINT13                  0x0E
 | 
|---|
| 157 | #define PARTITION_XINT13_EXTENDED         0x0F
 | 
|---|
| 158 | #define PARTITION_PREP                    0x41
 | 
|---|
| 159 | #define PARTITION_LDM                     0x42
 | 
|---|
| 160 | #define PARTITION_UNIX                    0x63
 | 
|---|
| 161 | #define VALID_NTFT                        0xC0
 | 
|---|
| 162 | #define PARTITION_NTFT                    0x80
 | 
|---|
| 163 | 
 | 
|---|
| 164 | #define IsFTPartition( PartitionType ) \
 | 
|---|
| 165 |   (((PartitionType) & PARTITION_NTFT) && \
 | 
|---|
| 166 |   IsRecognizedPartition(PartitionType))
 | 
|---|
| 167 | 
 | 
|---|
| 168 | #define IsContainerPartition(PartitionType) \
 | 
|---|
| 169 |   (((PartitionType) == PARTITION_EXTENDED) || \
 | 
|---|
| 170 |   ((PartitionType) == PARTITION_XINT13_EXTENDED))
 | 
|---|
| 171 | 
 | 
|---|
| 172 | #define IsRecognizedPartition(PartitionType) ( \
 | 
|---|
| 173 |         (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \
 | 
|---|
| 174 |         (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \
 | 
|---|
| 175 |         (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \
 | 
|---|
| 176 |         (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \
 | 
|---|
| 177 |         (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \
 | 
|---|
| 178 |         (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) || \
 | 
|---|
| 179 |         ((PartitionType) == PARTITION_FAT_12) || \
 | 
|---|
| 180 |         ((PartitionType) == PARTITION_FAT_16) || \
 | 
|---|
| 181 |         ((PartitionType) == PARTITION_HUGE) || \
 | 
|---|
| 182 |         ((PartitionType) == PARTITION_IFS) || \
 | 
|---|
| 183 |         ((PartitionType) == PARTITION_FAT32) || \
 | 
|---|
| 184 |         ((PartitionType) == PARTITION_FAT32_XINT13) || \
 | 
|---|
| 185 |         ((PartitionType) == PARTITION_XINT13))
 | 
|---|
| 186 | 
 | 
|---|
| 187 | #define WMI_DISK_GEOMETRY_GUID \
 | 
|---|
| 188 |   {0x25007f51, 0x57c2, 0x11d1, {0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10}}
 | 
|---|
| 189 | 
 | 
|---|
| 190 | typedef USHORT BAD_TRACK_NUMBER;
 | 
|---|
| 191 | typedef USHORT *PBAD_TRACK_NUMBER;
 | 
|---|
| 192 | 
 | 
|---|
| 193 | typedef enum _MEDIA_TYPE {
 | 
|---|
| 194 |   Unknown,
 | 
|---|
| 195 |   F5_1Pt2_512,
 | 
|---|
| 196 |   F3_1Pt44_512,
 | 
|---|
| 197 |   F3_2Pt88_512,
 | 
|---|
| 198 |   F3_20Pt8_512,
 | 
|---|
| 199 |   F3_720_512,
 | 
|---|
| 200 |   F5_360_512,
 | 
|---|
| 201 |   F5_320_512,
 | 
|---|
| 202 |   F5_320_1024,
 | 
|---|
| 203 |   F5_180_512,
 | 
|---|
| 204 |   F5_160_512,
 | 
|---|
| 205 |   RemovableMedia,
 | 
|---|
| 206 |   FixedMedia,
 | 
|---|
| 207 |   F3_120M_512,
 | 
|---|
| 208 |   F3_640_512,
 | 
|---|
| 209 |   F5_640_512,
 | 
|---|
| 210 |   F5_720_512,
 | 
|---|
| 211 |   F3_1Pt2_512,
 | 
|---|
| 212 |   F3_1Pt23_1024,
 | 
|---|
| 213 |   F5_1Pt23_1024,
 | 
|---|
| 214 |   F3_128Mb_512,
 | 
|---|
| 215 |   F3_230Mb_512,
 | 
|---|
| 216 |   F8_256_128
 | 
|---|
| 217 | } MEDIA_TYPE, *PMEDIA_TYPE;
 | 
|---|
| 218 | 
 | 
|---|
| 219 | typedef enum _DETECTION_TYPE {
 | 
|---|
| 220 |   DetectNone,
 | 
|---|
| 221 |   DetectInt13,
 | 
|---|
| 222 |   DetectExInt13
 | 
|---|
| 223 | } DETECTION_TYPE;
 | 
|---|
| 224 | 
 | 
|---|
| 225 | typedef struct _DISK_CONTROLLER_NUMBER {
 | 
|---|
| 226 |   ULONG  ControllerNumber;
 | 
|---|
| 227 |   ULONG  DiskNumber;
 | 
|---|
| 228 | } DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
 | 
|---|
| 229 | 
 | 
|---|
| 230 | typedef struct _DISK_INT13_INFO {
 | 
|---|
| 231 |   USHORT  DriveSelect;
 | 
|---|
| 232 |   ULONG  MaxCylinders;
 | 
|---|
| 233 |   USHORT  SectorsPerTrack;
 | 
|---|
| 234 |   USHORT  MaxHeads;
 | 
|---|
| 235 |   USHORT  NumberDrives;
 | 
|---|
| 236 | } DISK_INT13_INFO, *PDISK_INT13_INFO;
 | 
|---|
| 237 | 
 | 
|---|
| 238 | typedef struct _DISK_EX_INT13_INFO {
 | 
|---|
| 239 |   USHORT  ExBufferSize;
 | 
|---|
| 240 |   USHORT  ExFlags;
 | 
|---|
| 241 |   ULONG  ExCylinders;
 | 
|---|
| 242 |   ULONG  ExHeads;
 | 
|---|
| 243 |   ULONG  ExSectorsPerTrack;
 | 
|---|
| 244 |   ULONG64  ExSectorsPerDrive;
 | 
|---|
| 245 |   USHORT  ExSectorSize;
 | 
|---|
| 246 |   USHORT  ExReserved;
 | 
|---|
| 247 | } DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
 | 
|---|
| 248 | 
 | 
|---|
| 249 | typedef struct _DISK_DETECTION_INFO {
 | 
|---|
| 250 |   ULONG  SizeOfDetectInfo;
 | 
|---|
| 251 |   DETECTION_TYPE  DetectionType;
 | 
|---|
| 252 |   _ANONYMOUS_UNION union {
 | 
|---|
| 253 |     _ANONYMOUS_STRUCT struct {
 | 
|---|
| 254 |       DISK_INT13_INFO  Int13;
 | 
|---|
| 255 |       DISK_EX_INT13_INFO  ExInt13;
 | 
|---|
| 256 |     } DUMMYSTRUCTNAME;
 | 
|---|
| 257 |   } DUMMYUNIONNAME;
 | 
|---|
| 258 | } DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
 | 
|---|
| 259 | 
 | 
|---|
| 260 | typedef struct _DISK_GEOMETRY {
 | 
|---|
| 261 |   LARGE_INTEGER  Cylinders;
 | 
|---|
| 262 |   MEDIA_TYPE  MediaType;
 | 
|---|
| 263 |   ULONG  TracksPerCylinder;
 | 
|---|
| 264 |   ULONG  SectorsPerTrack;
 | 
|---|
| 265 |   ULONG  BytesPerSector;
 | 
|---|
| 266 | } DISK_GEOMETRY, *PDISK_GEOMETRY;
 | 
|---|
| 267 | 
 | 
|---|
| 268 | typedef struct _DISK_GEOMETRY_EX {
 | 
|---|
| 269 |   DISK_GEOMETRY  Geometry;
 | 
|---|
| 270 |   LARGE_INTEGER  DiskSize;
 | 
|---|
| 271 |   UCHAR  Data[1];
 | 
|---|
| 272 | } DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
 | 
|---|
| 273 | 
 | 
|---|
| 274 | #define DiskGeometryGetPartition(Geometry) \
 | 
|---|
| 275 |    ((PDISK_PARTITION_INFO)((Geometry) + 1))
 | 
|---|
| 276 | 
 | 
|---|
| 277 | #define DiskGeometryGetDetect(Geometry)\
 | 
|---|
| 278 |  ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \
 | 
|---|
| 279 |   DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
 | 
|---|
| 280 | 
 | 
|---|
| 281 | typedef struct _PARTITION_INFORMATION {
 | 
|---|
| 282 |   LARGE_INTEGER  StartingOffset;
 | 
|---|
| 283 |   LARGE_INTEGER  PartitionLength;
 | 
|---|
| 284 |   DWORD  HiddenSectors;
 | 
|---|
| 285 |   DWORD  PartitionNumber;
 | 
|---|
| 286 |   BYTE  PartitionType;
 | 
|---|
| 287 |   BOOLEAN  BootIndicator;
 | 
|---|
| 288 |   BOOLEAN  RecognizedPartition;
 | 
|---|
| 289 |   BOOLEAN  RewritePartition;
 | 
|---|
| 290 | } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
 | 
|---|
| 291 | 
 | 
|---|
| 292 | typedef struct _PARTITION_INFORMATION_GPT {
 | 
|---|
| 293 |   GUID  PartitionType;
 | 
|---|
| 294 |   GUID  PartitionId;
 | 
|---|
| 295 |   ULONG64  Attributes;
 | 
|---|
| 296 |   WCHAR Name  [36];
 | 
|---|
| 297 | } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
 | 
|---|
| 298 | 
 | 
|---|
| 299 | typedef struct _DISK_PARTITION_INFO {
 | 
|---|
| 300 |   ULONG  SizeOfPartitionInfo;
 | 
|---|
| 301 |   PARTITION_STYLE  PartitionStyle;
 | 
|---|
| 302 |   _ANONYMOUS_UNION union {
 | 
|---|
| 303 |     struct {
 | 
|---|
| 304 |       ULONG  Signature;
 | 
|---|
| 305 |       ULONG  CheckSum;
 | 
|---|
| 306 |     } Mbr;
 | 
|---|
| 307 |     struct {
 | 
|---|
| 308 |       GUID  DiskId;
 | 
|---|
| 309 |     } Gpt;
 | 
|---|
| 310 |   } DUMMYUNIONNAME;
 | 
|---|
| 311 | } DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
 | 
|---|
| 312 | 
 | 
|---|
| 313 | typedef struct _DISK_PERFORMANCE {
 | 
|---|
| 314 |   LARGE_INTEGER  BytesRead;
 | 
|---|
| 315 |   LARGE_INTEGER  BytesWritten;
 | 
|---|
| 316 |   LARGE_INTEGER  ReadTime;
 | 
|---|
| 317 |   LARGE_INTEGER  WriteTime;
 | 
|---|
| 318 |   LARGE_INTEGER  IdleTime;
 | 
|---|
| 319 |   ULONG  ReadCount;
 | 
|---|
| 320 |   ULONG  WriteCount;
 | 
|---|
| 321 |   ULONG  QueueDepth;
 | 
|---|
| 322 |   ULONG  SplitCount;
 | 
|---|
| 323 |   LARGE_INTEGER  QueryTime;
 | 
|---|
| 324 |   ULONG  StorageDeviceNumber;
 | 
|---|
| 325 |   WCHAR  StorageManagerName[8];
 | 
|---|
| 326 | } DISK_PERFORMANCE, *PDISK_PERFORMANCE;
 | 
|---|
| 327 | 
 | 
|---|
| 328 | typedef struct _PARTITION_INFORMATION_EX {
 | 
|---|
| 329 |   PARTITION_STYLE  PartitionStyle;
 | 
|---|
| 330 |   LARGE_INTEGER  StartingOffset;
 | 
|---|
| 331 |   LARGE_INTEGER  PartitionLength;
 | 
|---|
| 332 |   ULONG  PartitionNumber;
 | 
|---|
| 333 |   BOOLEAN  RewritePartition;
 | 
|---|
| 334 |   _ANONYMOUS_UNION union {
 | 
|---|
| 335 |     PARTITION_INFORMATION_MBR  Mbr;
 | 
|---|
| 336 |     PARTITION_INFORMATION_GPT  Gpt;
 | 
|---|
| 337 |   } DUMMYUNIONNAME;
 | 
|---|
| 338 | } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
 | 
|---|
| 339 | 
 | 
|---|
| 340 | typedef struct _FORMAT_EX_PARAMETERS {
 | 
|---|
| 341 |   MEDIA_TYPE  MediaType;
 | 
|---|
| 342 |   ULONG  StartCylinderNumber;
 | 
|---|
| 343 |   ULONG  EndCylinderNumber;
 | 
|---|
| 344 |   ULONG  StartHeadNumber;
 | 
|---|
| 345 |   ULONG  EndHeadNumber;
 | 
|---|
| 346 |   USHORT  FormatGapLength;
 | 
|---|
| 347 |   USHORT  SectorsPerTrack;
 | 
|---|
| 348 |   USHORT  SectorNumber[1];
 | 
|---|
| 349 | } FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
 | 
|---|
| 350 | 
 | 
|---|
| 351 | typedef struct _FORMAT_PARAMETERS {
 | 
|---|
| 352 |   MEDIA_TYPE  MediaType;
 | 
|---|
| 353 |   ULONG  StartCylinderNumber;
 | 
|---|
| 354 |   ULONG  EndCylinderNumber;
 | 
|---|
| 355 |   ULONG  StartHeadNumber;
 | 
|---|
| 356 |   ULONG  EndHeadNumber;
 | 
|---|
| 357 | } FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
 | 
|---|
| 358 | 
 | 
|---|
| 359 | typedef struct _GET_LENGTH_INFORMATION {
 | 
|---|
| 360 |   LARGE_INTEGER  Length;
 | 
|---|
| 361 | } GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
 | 
|---|
| 362 | 
 | 
|---|
| 363 | typedef struct _REASSIGN_BLOCKS {
 | 
|---|
| 364 |   WORD  Reserved;
 | 
|---|
| 365 |   WORD  Count;
 | 
|---|
| 366 |   DWORD  BlockNumber[1];
 | 
|---|
| 367 | } REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
 | 
|---|
| 368 | 
 | 
|---|
| 369 | typedef struct _SET_PARTITION_INFORMATION {
 | 
|---|
| 370 |   UCHAR  PartitionType;
 | 
|---|
| 371 | } SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
 | 
|---|
| 372 | 
 | 
|---|
| 373 | typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
 | 
|---|
| 374 | typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
 | 
|---|
| 375 | 
 | 
|---|
| 376 | typedef struct _SET_PARTITION_INFORMATION_EX {
 | 
|---|
| 377 |   PARTITION_STYLE  PartitionStyle;
 | 
|---|
| 378 |   _ANONYMOUS_UNION union {
 | 
|---|
| 379 |     SET_PARTITION_INFORMATION_MBR  Mbr;
 | 
|---|
| 380 |     SET_PARTITION_INFORMATION_GPT  Gpt;
 | 
|---|
| 381 |   } DUMMYUNIONNAME;
 | 
|---|
| 382 | } SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
 | 
|---|
| 383 | 
 | 
|---|
| 384 | typedef struct _VERIFY_INFORMATION {
 | 
|---|
| 385 |   LARGE_INTEGER  StartingOffset;
 | 
|---|
| 386 |   DWORD  Length;
 | 
|---|
| 387 | } VERIFY_INFORMATION, *PVERIFY_INFORMATION;
 | 
|---|
| 388 | 
 | 
|---|
| 389 | typedef enum {
 | 
|---|
| 390 |         EqualPriority,
 | 
|---|
| 391 |         KeepPrefetchedData,
 | 
|---|
| 392 |         KeepReadData
 | 
|---|
| 393 | } DISK_CACHE_RETENTION_PRIORITY;
 | 
|---|
| 394 | 
 | 
|---|
| 395 | typedef struct _DISK_CACHE_INFORMATION {
 | 
|---|
| 396 |         BOOLEAN  ParametersSavable;
 | 
|---|
| 397 |         BOOLEAN  ReadCacheEnabled;
 | 
|---|
| 398 |         BOOLEAN  WriteCacheEnabled;
 | 
|---|
| 399 |         DISK_CACHE_RETENTION_PRIORITY  ReadRetentionPriority;
 | 
|---|
| 400 |         DISK_CACHE_RETENTION_PRIORITY  WriteRetentionPriority;
 | 
|---|
| 401 |         USHORT  DisablePrefetchTransferLength;
 | 
|---|
| 402 |         BOOLEAN  PrefetchScalar;
 | 
|---|
| 403 |         _ANONYMOUS_UNION union {
 | 
|---|
| 404 |                 struct {
 | 
|---|
| 405 |                         USHORT  Minimum;
 | 
|---|
| 406 |                         USHORT  Maximum;
 | 
|---|
| 407 |                         USHORT  MaximumBlocks;
 | 
|---|
| 408 |                 } ScalarPrefetch;
 | 
|---|
| 409 |                 struct {
 | 
|---|
| 410 |                         USHORT  Minimum;
 | 
|---|
| 411 |                         USHORT  Maximum;
 | 
|---|
| 412 |                 } BlockPrefetch;
 | 
|---|
| 413 |         } DUMMYUNIONNAME;
 | 
|---|
| 414 | } DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
 | 
|---|
| 415 | 
 | 
|---|
| 416 | typedef struct _DISK_GROW_PARTITION {
 | 
|---|
| 417 |   ULONG  PartitionNumber;
 | 
|---|
| 418 |   LARGE_INTEGER  BytesToGrow;
 | 
|---|
| 419 | } DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
 | 
|---|
| 420 | 
 | 
|---|
| 421 | /* GETVERSIONINPARAMS.fCapabilities constants */
 | 
|---|
| 422 | #define CAP_ATA_ID_CMD                    1
 | 
|---|
| 423 | #define CAP_ATAPI_ID_CMD                  2
 | 
|---|
| 424 | #define CAP_SMART_CMD                     4
 | 
|---|
| 425 | 
 | 
|---|
| 426 | typedef struct _GETVERSIONINPARAMS {
 | 
|---|
| 427 |         UCHAR  bVersion;
 | 
|---|
| 428 |         UCHAR  bRevision;
 | 
|---|
| 429 |         UCHAR  bReserved;
 | 
|---|
| 430 |         UCHAR  bIDEDeviceMap;
 | 
|---|
| 431 |         ULONG  fCapabilities;
 | 
|---|
| 432 |         ULONG  dwReserved[4];
 | 
|---|
| 433 | } GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
 | 
|---|
| 434 | 
 | 
|---|
| 435 | /* IDEREGS.bCommandReg constants */
 | 
|---|
| 436 | #define ATAPI_ID_CMD                      0xA1
 | 
|---|
| 437 | #define ID_CMD                            0xEC
 | 
|---|
| 438 | #define SMART_CMD                         0xB0
 | 
|---|
| 439 | 
 | 
|---|
| 440 | #define SMART_CYL_LOW                     0x4F
 | 
|---|
| 441 | #define SMART_CYL_HI                      0xC2
 | 
|---|
| 442 | 
 | 
|---|
| 443 | typedef struct _IDEREGS {
 | 
|---|
| 444 |         UCHAR  bFeaturesReg;
 | 
|---|
| 445 |         UCHAR  bSectorCountReg;
 | 
|---|
| 446 |         UCHAR  bSectorNumberReg;
 | 
|---|
| 447 |         UCHAR  bCylLowReg;
 | 
|---|
| 448 |         UCHAR  bCylHighReg;
 | 
|---|
| 449 |         UCHAR  bDriveHeadReg;
 | 
|---|
| 450 |         UCHAR  bCommandReg;
 | 
|---|
| 451 |         UCHAR  bReserved;
 | 
|---|
| 452 | } IDEREGS, *PIDEREGS, *LPIDEREGS;
 | 
|---|
| 453 | 
 | 
|---|
| 454 | #include <pshpack1.h>
 | 
|---|
| 455 | typedef struct _SENDCMDINPARAMS {
 | 
|---|
| 456 |         ULONG  cBufferSize;
 | 
|---|
| 457 |         IDEREGS  irDriveRegs;
 | 
|---|
| 458 |         UCHAR  bDriveNumber;
 | 
|---|
| 459 |         UCHAR  bReserved[3];
 | 
|---|
| 460 |         ULONG  dwReserved[4];
 | 
|---|
| 461 |         UCHAR  bBuffer[1];
 | 
|---|
| 462 | } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
 | 
|---|
| 463 | #include <poppack.h>
 | 
|---|
| 464 | 
 | 
|---|
| 465 | /* DRIVERSTATUS.bDriverError constants */
 | 
|---|
| 466 | #define SMART_NO_ERROR                    0
 | 
|---|
| 467 | #define SMART_IDE_ERROR                   1
 | 
|---|
| 468 | #define SMART_INVALID_FLAG                2
 | 
|---|
| 469 | #define SMART_INVALID_COMMAND             3
 | 
|---|
| 470 | #define SMART_INVALID_BUFFER              4
 | 
|---|
| 471 | #define SMART_INVALID_DRIVE               5
 | 
|---|
| 472 | #define SMART_INVALID_IOCTL               6
 | 
|---|
| 473 | #define SMART_ERROR_NO_MEM                7
 | 
|---|
| 474 | #define SMART_INVALID_REGISTER            8
 | 
|---|
| 475 | #define SMART_NOT_SUPPORTED               9
 | 
|---|
| 476 | #define SMART_NO_IDE_DEVICE               10
 | 
|---|
| 477 | 
 | 
|---|
| 478 | #define SMART_OFFLINE_ROUTINE_OFFLINE     0
 | 
|---|
| 479 | #define SMART_SHORT_SELFTEST_OFFLINE      1
 | 
|---|
| 480 | #define SMART_EXTENDED_SELFTEST_OFFLINE   2
 | 
|---|
| 481 | #define SMART_ABORT_OFFLINE_SELFTEST      127
 | 
|---|
| 482 | #define SMART_SHORT_SELFTEST_CAPTIVE      129
 | 
|---|
| 483 | #define SMART_EXTENDED_SELFTEST_CAPTIVE   130
 | 
|---|
| 484 | 
 | 
|---|
| 485 | typedef struct _DRIVERSTATUS {
 | 
|---|
| 486 |         UCHAR  bDriverError;
 | 
|---|
| 487 |         UCHAR  bIDEError;
 | 
|---|
| 488 |         UCHAR  bReserved[2];
 | 
|---|
| 489 |         ULONG  dwReserved[2];
 | 
|---|
| 490 | } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
 | 
|---|
| 491 | 
 | 
|---|
| 492 | #define READ_ATTRIBUTE_BUFFER_SIZE        512
 | 
|---|
| 493 | #define IDENTIFY_BUFFER_SIZE              512
 | 
|---|
| 494 | #define READ_THRESHOLD_BUFFER_SIZE        512
 | 
|---|
| 495 | #define SMART_LOG_SECTOR_SIZE             512
 | 
|---|
| 496 | 
 | 
|---|
| 497 | #include <pshpack1.h>
 | 
|---|
| 498 | typedef struct _SENDCMDOUTPARAMS {
 | 
|---|
| 499 |         ULONG  cBufferSize;
 | 
|---|
| 500 |         DRIVERSTATUS  DriverStatus;
 | 
|---|
| 501 |         UCHAR  bBuffer[1];
 | 
|---|
| 502 | } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
 | 
|---|
| 503 | #include <poppack.h>
 | 
|---|
| 504 | 
 | 
|---|
| 505 | #define READ_ATTRIBUTES                   0xD0
 | 
|---|
| 506 | #define READ_THRESHOLDS                   0xD1
 | 
|---|
| 507 | #define ENABLE_DISABLE_AUTOSAVE           0xD2
 | 
|---|
| 508 | #define SAVE_ATTRIBUTE_VALUES             0xD3
 | 
|---|
| 509 | #define EXECUTE_OFFLINE_DIAGS             0xD4
 | 
|---|
| 510 | #define SMART_READ_LOG                    0xD5
 | 
|---|
| 511 | #define SMART_WRITE_LOG                   0xd6
 | 
|---|
| 512 | #define ENABLE_SMART                      0xD8
 | 
|---|
| 513 | #define DISABLE_SMART                     0xD9
 | 
|---|
| 514 | #define RETURN_SMART_STATUS               0xDA
 | 
|---|
| 515 | #define ENABLE_DISABLE_AUTO_OFFLINE       0xDB
 | 
|---|
| 516 | 
 | 
|---|
| 517 | #ifdef __cplusplus
 | 
|---|
| 518 | }
 | 
|---|
| 519 | #endif
 | 
|---|
| 520 | 
 | 
|---|
| 521 | #endif /* __NTDDDISK_H */
 | 
|---|