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 /* Helper macro to enable gcc's extension. */ 27 #ifndef __GNU_EXTENSION 28 #ifdef __GNUC__ 29 #define __GNU_EXTENSION __extension__ 30 #else 31 #define __GNU_EXTENSION 32 #endif 33 #endif 34 35 #include "ntddstor.h" 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 #define DD_DISK_DEVICE_NAME "\\Device\\UNKNOWN" 42 #define DD_DISK_DEVICE_NAME_U L"\\Device\\UNKNOWN" 43 44 #define IOCTL_DISK_BASE FILE_DEVICE_DISK 45 46 #define IOCTL_DISK_CHECK_VERIFY \ 47 CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) 48 49 #define IOCTL_DISK_CONTROLLER_NUMBER \ 50 CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS) 51 52 #define IOCTL_DISK_CREATE_DISK \ 53 CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 54 55 #define IOCTL_DISK_DELETE_DRIVE_LAYOUT \ 56 CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 57 58 #define IOCTL_DISK_FIND_NEW_DEVICES \ 59 CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) 60 61 #define IOCTL_DISK_FORMAT_TRACKS \ 62 CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 63 64 #define IOCTL_DISK_FORMAT_TRACKS_EX \ 65 CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 66 67 #define IOCTL_DISK_GET_CACHE_INFORMATION \ 68 CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS) 69 70 #define IOCTL_DISK_GET_DRIVE_GEOMETRY \ 71 CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS) 72 73 #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX \ 74 CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS) 75 76 #define IOCTL_DISK_GET_DRIVE_LAYOUT \ 77 CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) 78 79 #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX \ 80 CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS) 81 82 #define IOCTL_DISK_GET_MEDIA_TYPES \ 83 CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) 84 85 #define IOCTL_DISK_GET_LENGTH_INFO \ 86 CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS) 87 88 #define IOCTL_DISK_GET_PARTITION_INFO \ 89 CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) 90 91 #define IOCTL_DISK_GET_PARTITION_INFO_EX \ 92 CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS) 93 94 #define IOCTL_DISK_GROW_PARTITION \ 95 CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 96 97 #define IOCTL_DISK_HISTOGRAM_STRUCTURE \ 98 CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS) 99 100 #define IOCTL_DISK_HISTOGRAM_DATA \ 101 CTL_CODE(IOCTL_DISK_BASE, 0x000d, METHOD_BUFFERED, FILE_ANY_ACCESS) 102 103 #define IOCTL_DISK_HISTOGRAM_RESET \ 104 CTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS) 105 106 #define IOCTL_DISK_INTERNAL_CLEAR_VERIFY \ 107 CTL_CODE(IOCTL_DISK_BASE, 0x0101, METHOD_NEITHER, FILE_ANY_ACCESS) 108 109 #define IOCTL_DISK_INTERNAL_SET_VERIFY \ 110 CTL_CODE(IOCTL_DISK_BASE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS) 111 112 #define IOCTL_DISK_INTERNAL_SET_NOTIFY \ 113 CTL_CODE(IOCTL_DISK_BASE, 0x0102, METHOD_BUFFERED, FILE_ANY_ACCESS) 114 115 #define IOCTL_DISK_IS_WRITABLE \ 116 CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS) 117 118 #define IOCTL_DISK_LOGGING \ 119 CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS) 120 121 #define IOCTL_DISK_PERFORMANCE \ 122 CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS) 123 124 #define IOCTL_DISK_PERFORMANCE_OFF \ 125 CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS) 126 127 #define IOCTL_DISK_REASSIGN_BLOCKS \ 128 CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 129 130 #define IOCTL_DISK_REQUEST_DATA \ 131 CTL_CODE(IOCTL_DISK_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS) 132 133 #define IOCTL_DISK_REQUEST_STRUCTURE \ 134 CTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS) 135 136 #define IOCTL_DISK_MEDIA_REMOVAL \ 137 CTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) 138 139 #define IOCTL_DISK_EJECT_MEDIA \ 140 CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) 141 142 #define IOCTL_DISK_LOAD_MEDIA \ 143 CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) 144 145 #define IOCTL_DISK_RESERVE \ 146 CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) 147 148 #define IOCTL_DISK_RELEASE \ 149 CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) 150 151 #define IOCTL_DISK_FIND_NEW_DEVICES \ 152 CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) 153 154 #define IOCTL_DISK_SET_CACHE_INFORMATION \ 155 CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 156 157 // 158 // NTDDI_WIN2003 was an older define used in the early beta builds, which 159 // Microsoft forgot to fix in a few headers. 160 // NTDDI_WS03 is the correct term. 161 // 162 #if (NTDDI_VERSION < NTDDI_WS03) 163 #define IOCTL_DISK_GET_WRITE_CACHE_STATE \ 164 CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS) 165 #else 166 #define OBSOLETE_DISK_GET_WRITE_CACHE_STATE \ 167 CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS) 168 #endif 169 170 #define IOCTL_DISK_SET_DRIVE_LAYOUT \ 171 CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 172 173 #define IOCTL_DISK_SET_DRIVE_LAYOUT_EX \ 174 CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 175 176 #define IOCTL_DISK_SET_PARTITION_INFO \ 177 CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 178 179 #define IOCTL_DISK_SET_PARTITION_INFO_EX \ 180 CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 181 182 #define IOCTL_DISK_UPDATE_DRIVE_SIZE \ 183 CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 184 185 #define IOCTL_DISK_VERIFY \ 186 CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS) 187 188 #define IOCTL_DISK_COPY_DATA \ 189 CTL_CODE(IOCTL_DISK_BASE, 0x0019, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 190 191 #define IOCTL_DISK_SIMBAD \ 192 CTL_CODE(IOCTL_DISK_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 193 194 #define SMART_GET_VERSION \ 195 CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS) 196 197 #define SMART_RCV_DRIVE_DATA \ 198 CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 199 200 #define SMART_SEND_DRIVE_COMMAND \ 201 CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 202 203 #if(_WIN32_WINNT >= 0x0500) 204 #define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 205 #define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 206 #define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS) 207 #define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 208 #define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 209 #define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE, 0x0050, METHOD_BUFFERED, FILE_ANY_ACCESS) 210 #define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE, 0x00f3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 211 #define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE, 0x00f8, METHOD_BUFFERED, FILE_ANY_ACCESS) 212 #endif 213 214 #define PARTITION_ENTRY_UNUSED 0x00 215 #define PARTITION_FAT_12 0x01 216 #define PARTITION_XENIX_1 0x02 217 #define PARTITION_XENIX_2 0x03 218 #define PARTITION_FAT_16 0x04 219 #define PARTITION_EXTENDED 0x05 220 #define PARTITION_HUGE 0x06 221 #define PARTITION_IFS 0x07 222 #define PARTITION_OS2BOOTMGR 0x0A 223 #define PARTITION_FAT32 0x0B 224 #define PARTITION_FAT32_XINT13 0x0C 225 #define PARTITION_XINT13 0x0E 226 #define PARTITION_XINT13_EXTENDED 0x0F 227 #define PARTITION_PREP 0x41 228 #define PARTITION_LDM 0x42 229 #define PARTITION_UNIX 0x63 230 #define VALID_NTFT 0xC0 231 #define PARTITION_NTFT 0x80 232 #ifdef __REACTOS__ 233 #define PARTITION_OLD_LINUX 0x43 234 #define PARTITION_LINUX 0x83 235 #define PARTITION_ISO9660 0x96 236 #define PARTITION_FREEBSD 0xA5 237 #define PARTITION_OPENBSD 0xA6 238 #define PARTITION_NETBSD 0xA9 239 #endif 240 241 #define IsFTPartition( PartitionType ) \ 242 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \ 243 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \ 244 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \ 245 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \ 246 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \ 247 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) 248 249 250 #define IsContainerPartition(PartitionType) \ 251 (((PartitionType) == PARTITION_EXTENDED) || \ 252 ((PartitionType) == PARTITION_XINT13_EXTENDED)) 253 254 #ifdef __REACTOS__ 255 #define IsRecognizedPartition(PartitionType) ( \ 256 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \ 257 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \ 258 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \ 259 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \ 260 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \ 261 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) || \ 262 ((PartitionType) == PARTITION_FAT_12) || \ 263 ((PartitionType) == PARTITION_FAT_16) || \ 264 ((PartitionType) == PARTITION_HUGE) || \ 265 ((PartitionType) == PARTITION_IFS) || \ 266 ((PartitionType) == PARTITION_FAT32) || \ 267 ((PartitionType) == PARTITION_FAT32_XINT13) || \ 268 ((PartitionType) == PARTITION_XINT13) || \ 269 ((PartitionType) == PARTITION_LINUX) || \ 270 ((PartitionType) == PARTITION_OLD_LINUX) || \ 271 ((PartitionType) == PARTITION_ISO9660) || \ 272 ((PartitionType) == PARTITION_FREEBSD) || \ 273 ((PartitionType) == PARTITION_OPENBSD) || \ 274 ((PartitionType) == PARTITION_NETBSD)) 275 #else 276 #define IsRecognizedPartition(PartitionType) ( \ 277 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \ 278 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \ 279 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \ 280 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \ 281 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \ 282 (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) || \ 283 ((PartitionType) == PARTITION_FAT_12) || \ 284 ((PartitionType) == PARTITION_FAT_16) || \ 285 ((PartitionType) == PARTITION_HUGE) || \ 286 ((PartitionType) == PARTITION_IFS) || \ 287 ((PartitionType) == PARTITION_FAT32) || \ 288 ((PartitionType) == PARTITION_FAT32_XINT13) || \ 289 ((PartitionType) == PARTITION_XINT13)) 290 #endif 291 292 #if(_WIN32_WINNT >= 0x0500) 293 #define GPT_ATTRIBUTE_PLATFORM_REQUIRED 0x00000001 294 #define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY 0x10000000 295 #define GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY 0x20000000 296 #define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN 0x40000000 297 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000 298 #endif 299 300 #define WMI_DISK_GEOMETRY_GUID \ 301 {0x25007f51, 0x57c2, 0x11d1, {0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10}} 302 303 typedef USHORT BAD_TRACK_NUMBER; 304 typedef USHORT *PBAD_TRACK_NUMBER; 305 306 typedef enum _MEDIA_TYPE { 307 Unknown, 308 F5_1Pt2_512, 309 F3_1Pt44_512, 310 F3_2Pt88_512, 311 F3_20Pt8_512, 312 F3_720_512, 313 F5_360_512, 314 F5_320_512, 315 F5_320_1024, 316 F5_180_512, 317 F5_160_512, 318 RemovableMedia, 319 FixedMedia, 320 F3_120M_512, 321 F3_640_512, 322 F5_640_512, 323 F5_720_512, 324 F3_1Pt2_512, 325 F3_1Pt23_1024, 326 F5_1Pt23_1024, 327 F3_128Mb_512, 328 F3_230Mb_512, 329 F8_256_128, 330 F3_200Mb_512, 331 F3_240M_512, 332 F3_32M_512 333 } MEDIA_TYPE, *PMEDIA_TYPE; 334 335 typedef enum _DETECTION_TYPE { 336 DetectNone, 337 DetectInt13, 338 DetectExInt13 339 } DETECTION_TYPE; 340 341 typedef struct _DISK_CONTROLLER_NUMBER { 342 ULONG ControllerNumber; 343 ULONG DiskNumber; 344 } DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER; 345 346 typedef struct _DISK_INT13_INFO { 347 USHORT DriveSelect; 348 ULONG MaxCylinders; 349 USHORT SectorsPerTrack; 350 USHORT MaxHeads; 351 USHORT NumberDrives; 352 } DISK_INT13_INFO, *PDISK_INT13_INFO; 353 354 typedef struct _DISK_EX_INT13_INFO { 355 USHORT ExBufferSize; 356 USHORT ExFlags; 357 ULONG ExCylinders; 358 ULONG ExHeads; 359 ULONG ExSectorsPerTrack; 360 ULONG64 ExSectorsPerDrive; 361 USHORT ExSectorSize; 362 USHORT ExReserved; 363 } DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO; 364 365 typedef struct _DISK_DETECTION_INFO { 366 ULONG SizeOfDetectInfo; 367 DETECTION_TYPE DetectionType; 368 _ANONYMOUS_UNION union { 369 _ANONYMOUS_STRUCT struct { 370 DISK_INT13_INFO Int13; 371 DISK_EX_INT13_INFO ExInt13; 372 } DUMMYSTRUCTNAME; 373 } DUMMYUNIONNAME; 374 } DISK_DETECTION_INFO, *PDISK_DETECTION_INFO; 375 376 typedef struct _DISK_GEOMETRY { 377 LARGE_INTEGER Cylinders; 378 MEDIA_TYPE MediaType; 379 ULONG TracksPerCylinder; 380 ULONG SectorsPerTrack; 381 ULONG BytesPerSector; 382 } DISK_GEOMETRY, *PDISK_GEOMETRY; 383 384 typedef struct _DISK_GEOMETRY_EX { 385 DISK_GEOMETRY Geometry; 386 LARGE_INTEGER DiskSize; 387 UCHAR Data[1]; 388 } DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX; 389 390 #if (NTDDI_VERSION < NTDDI_WS03) 391 #define DiskGeometryGetPartition(Geometry) \ 392 ((PDISK_PARTITION_INFO)((Geometry) + 1)) 393 394 #define DiskGeometryGetDetect(Geometry)\ 395 ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \ 396 DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo))) 397 #else 398 #define DiskGeometryGetPartition(Geometry) \ 399 ((PDISK_PARTITION_INFO)((Geometry)->Data)) 400 401 #define DiskGeometryGetDetect(Geometry)\ 402 ((PDISK_DETECTION_INFO)(((ULONG_PTR)DiskGeometryGetPartition(Geometry) + \ 403 DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo))) 404 #endif 405 406 typedef struct _PARTITION_INFORMATION { 407 LARGE_INTEGER StartingOffset; 408 LARGE_INTEGER PartitionLength; 409 ULONG HiddenSectors; 410 ULONG PartitionNumber; 411 UCHAR PartitionType; 412 BOOLEAN BootIndicator; 413 BOOLEAN RecognizedPartition; 414 BOOLEAN RewritePartition; 415 } PARTITION_INFORMATION, *PPARTITION_INFORMATION; 416 417 typedef struct _PARTITION_INFORMATION_GPT { 418 GUID PartitionType; 419 GUID PartitionId; 420 ULONG64 Attributes; 421 WCHAR Name [36]; 422 } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT; 423 424 typedef enum _PARTITION_STYLE { 425 PARTITION_STYLE_MBR, 426 PARTITION_STYLE_GPT, 427 PARTITION_STYLE_RAW, 428 #ifdef __REACTOS__ 429 /* ReactOS custom partition handlers */ 430 PARTITION_STYLE_BRFR = 128 /* Xbox-BRFR partitioning scheme */ 431 #endif 432 } PARTITION_STYLE; 433 434 typedef struct _DISK_PARTITION_INFO { 435 ULONG SizeOfPartitionInfo; 436 PARTITION_STYLE PartitionStyle; 437 _ANONYMOUS_UNION union { 438 struct { 439 ULONG Signature; 440 ULONG CheckSum; 441 } Mbr; 442 struct { 443 GUID DiskId; 444 } Gpt; 445 } DUMMYUNIONNAME; 446 } DISK_PARTITION_INFO, *PDISK_PARTITION_INFO; 447 448 typedef struct _DISK_PERFORMANCE { 449 LARGE_INTEGER BytesRead; 450 LARGE_INTEGER BytesWritten; 451 LARGE_INTEGER ReadTime; 452 LARGE_INTEGER WriteTime; 453 LARGE_INTEGER IdleTime; 454 ULONG ReadCount; 455 ULONG WriteCount; 456 ULONG QueueDepth; 457 ULONG SplitCount; 458 LARGE_INTEGER QueryTime; 459 ULONG StorageDeviceNumber; 460 WCHAR StorageManagerName[8]; 461 } DISK_PERFORMANCE, *PDISK_PERFORMANCE; 462 463 typedef struct _PARTITION_INFORMATION_MBR { 464 UCHAR PartitionType; 465 BOOLEAN BootIndicator; 466 BOOLEAN RecognizedPartition; 467 ULONG HiddenSectors; 468 } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR; 469 470 typedef struct _PARTITION_INFORMATION_EX { 471 PARTITION_STYLE PartitionStyle; 472 LARGE_INTEGER StartingOffset; 473 LARGE_INTEGER PartitionLength; 474 ULONG PartitionNumber; 475 BOOLEAN RewritePartition; 476 #if (NTDDI_VERSION >= NTDDI_WIN10_RS3) 477 BOOLEAN IsServicePartition; 478 #endif 479 _ANONYMOUS_UNION union { 480 PARTITION_INFORMATION_MBR Mbr; 481 PARTITION_INFORMATION_GPT Gpt; 482 } DUMMYUNIONNAME; 483 } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX; 484 485 typedef struct _DRIVE_LAYOUT_INFORMATION { 486 ULONG PartitionCount; 487 ULONG Signature; 488 PARTITION_INFORMATION PartitionEntry[1]; 489 } DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION; 490 491 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR { 492 ULONG Signature; 493 } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR; 494 495 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT { 496 GUID DiskId; 497 LARGE_INTEGER StartingUsableOffset; 498 LARGE_INTEGER UsableLength; 499 ULONG MaxPartitionCount; 500 } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT; 501 502 typedef struct _DRIVE_LAYOUT_INFORMATION_EX { 503 ULONG PartitionStyle; 504 ULONG PartitionCount; 505 __GNU_EXTENSION union { 506 DRIVE_LAYOUT_INFORMATION_MBR Mbr; 507 DRIVE_LAYOUT_INFORMATION_GPT Gpt; 508 }; 509 PARTITION_INFORMATION_EX PartitionEntry[1]; 510 } DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX; 511 512 typedef struct _FORMAT_EX_PARAMETERS { 513 MEDIA_TYPE MediaType; 514 ULONG StartCylinderNumber; 515 ULONG EndCylinderNumber; 516 ULONG StartHeadNumber; 517 ULONG EndHeadNumber; 518 USHORT FormatGapLength; 519 USHORT SectorsPerTrack; 520 USHORT SectorNumber[1]; 521 } FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS; 522 523 typedef struct _FORMAT_PARAMETERS { 524 MEDIA_TYPE MediaType; 525 ULONG StartCylinderNumber; 526 ULONG EndCylinderNumber; 527 ULONG StartHeadNumber; 528 ULONG EndHeadNumber; 529 } FORMAT_PARAMETERS, *PFORMAT_PARAMETERS; 530 531 typedef struct _GET_LENGTH_INFORMATION { 532 LARGE_INTEGER Length; 533 } GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION; 534 535 typedef struct _REASSIGN_BLOCKS { 536 USHORT Reserved; 537 USHORT Count; 538 ULONG BlockNumber[1]; 539 } REASSIGN_BLOCKS, *PREASSIGN_BLOCKS; 540 541 typedef struct _SET_PARTITION_INFORMATION { 542 UCHAR PartitionType; 543 } SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION; 544 545 typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR; 546 typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT; 547 548 typedef struct _SET_PARTITION_INFORMATION_EX { 549 PARTITION_STYLE PartitionStyle; 550 _ANONYMOUS_UNION union { 551 SET_PARTITION_INFORMATION_MBR Mbr; 552 SET_PARTITION_INFORMATION_GPT Gpt; 553 } DUMMYUNIONNAME; 554 } SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX; 555 556 typedef struct _VERIFY_INFORMATION { 557 LARGE_INTEGER StartingOffset; 558 ULONG Length; 559 } VERIFY_INFORMATION, *PVERIFY_INFORMATION; 560 561 /* GETVERSIONINPARAMS.fCapabilities constants */ 562 #define CAP_ATA_ID_CMD 1 563 #define CAP_ATAPI_ID_CMD 2 564 #define CAP_SMART_CMD 4 565 566 typedef struct _GETVERSIONINPARAMS { 567 UCHAR bVersion; 568 UCHAR bRevision; 569 UCHAR bReserved; 570 UCHAR bIDEDeviceMap; 571 ULONG fCapabilities; 572 ULONG dwReserved[4]; 573 } GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS; 574 575 /* IDEREGS.bCommandReg constants */ 576 #define ATAPI_ID_CMD 0xA1 577 #define ID_CMD 0xEC 578 #define SMART_CMD 0xB0 579 580 #define SMART_CYL_LOW 0x4F 581 #define SMART_CYL_HI 0xC2 582 583 typedef struct _IDEREGS { 584 UCHAR bFeaturesReg; 585 UCHAR bSectorCountReg; 586 UCHAR bSectorNumberReg; 587 UCHAR bCylLowReg; 588 UCHAR bCylHighReg; 589 UCHAR bDriveHeadReg; 590 UCHAR bCommandReg; 591 UCHAR bReserved; 592 } IDEREGS, *PIDEREGS, *LPIDEREGS; 593 594 #include <pshpack1.h> 595 typedef struct _SENDCMDINPARAMS { 596 ULONG cBufferSize; 597 IDEREGS irDriveRegs; 598 UCHAR bDriveNumber; 599 UCHAR bReserved[3]; 600 ULONG dwReserved[4]; 601 UCHAR bBuffer[1]; 602 } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; 603 #include <poppack.h> 604 605 /* DRIVERSTATUS.bDriverError constants */ 606 #define SMART_NO_ERROR 0 607 #define SMART_IDE_ERROR 1 608 #define SMART_INVALID_FLAG 2 609 #define SMART_INVALID_COMMAND 3 610 #define SMART_INVALID_BUFFER 4 611 #define SMART_INVALID_DRIVE 5 612 #define SMART_INVALID_IOCTL 6 613 #define SMART_ERROR_NO_MEM 7 614 #define SMART_INVALID_REGISTER 8 615 #define SMART_NOT_SUPPORTED 9 616 #define SMART_NO_IDE_DEVICE 10 617 618 #define SMART_OFFLINE_ROUTINE_OFFLINE 0 619 #define SMART_SHORT_SELFTEST_OFFLINE 1 620 #define SMART_EXTENDED_SELFTEST_OFFLINE 2 621 #define SMART_ABORT_OFFLINE_SELFTEST 127 622 #define SMART_SHORT_SELFTEST_CAPTIVE 129 623 #define SMART_EXTENDED_SELFTEST_CAPTIVE 130 624 625 typedef struct _DRIVERSTATUS { 626 UCHAR bDriverError; 627 UCHAR bIDEError; 628 UCHAR bReserved[2]; 629 ULONG dwReserved[2]; 630 } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS; 631 632 #define READ_ATTRIBUTE_BUFFER_SIZE 512 633 #define IDENTIFY_BUFFER_SIZE 512 634 #define READ_THRESHOLD_BUFFER_SIZE 512 635 #define SMART_LOG_SECTOR_SIZE 512 636 637 #include <pshpack1.h> 638 typedef struct _SENDCMDOUTPARAMS { 639 ULONG cBufferSize; 640 DRIVERSTATUS DriverStatus; 641 UCHAR bBuffer[1]; 642 } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; 643 #include <poppack.h> 644 645 #define READ_ATTRIBUTES 0xD0 646 #define READ_THRESHOLDS 0xD1 647 #define ENABLE_DISABLE_AUTOSAVE 0xD2 648 #define SAVE_ATTRIBUTE_VALUES 0xD3 649 #define EXECUTE_OFFLINE_DIAGS 0xD4 650 #define SMART_READ_LOG 0xD5 651 #define SMART_WRITE_LOG 0xd6 652 #define ENABLE_SMART 0xD8 653 #define DISABLE_SMART 0xD9 654 #define RETURN_SMART_STATUS 0xDA 655 #define ENABLE_DISABLE_AUTO_OFFLINE 0xDB 656 657 typedef struct _MAPPED_ADDRESS { 658 struct _MAPPED_ADDRESS *NextMappedAddress; 659 PVOID MappedAddress; 660 ULONG NumberOfBytes; 661 LARGE_INTEGER IoAddress; 662 ULONG BusNumber; 663 } MAPPED_ADDRESS, *PMAPPED_ADDRESS; 664 665 666 667 #if(_WIN32_WINNT >= 0x0500) 668 669 typedef struct _CREATE_DISK_GPT 670 { 671 GUID DiskId; 672 ULONG MaxPartitionCount; 673 } CREATE_DISK_GPT, *PCREATE_DISK_GPT; 674 675 typedef struct _CREATE_DISK_MBR 676 { 677 ULONG Signature; 678 } CREATE_DISK_MBR, *PCREATE_DISK_MBR; 679 680 681 typedef struct _CREATE_DISK 682 { 683 PARTITION_STYLE PartitionStyle; 684 union { 685 CREATE_DISK_MBR Mbr; 686 CREATE_DISK_GPT Gpt; 687 }; 688 } CREATE_DISK, *PCREATE_DISK; 689 690 691 typedef enum { 692 EqualPriority, 693 KeepPrefetchedData, 694 KeepReadData 695 } DISK_CACHE_RETENTION_PRIORITY; 696 697 typedef enum _DISK_WRITE_CACHE_STATE { 698 DiskWriteCacheNormal, 699 DiskWriteCacheForceDisable, 700 DiskWriteCacheDisableNotSupported 701 } DISK_WRITE_CACHE_STATE, *PDISK_WRITE_CACHE_STATE; 702 703 704 typedef struct _DISK_CACHE_INFORMATION 705 { 706 BOOLEAN ParametersSavable; 707 BOOLEAN ReadCacheEnabled; 708 BOOLEAN WriteCacheEnabled; 709 DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; 710 DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; 711 USHORT DisablePrefetchTransferLength; 712 BOOLEAN PrefetchScalar; 713 union { 714 struct { 715 USHORT Minimum; 716 USHORT Maximum; 717 USHORT MaximumBlocks; 718 } ScalarPrefetch; 719 720 struct { 721 USHORT Minimum; 722 USHORT Maximum; 723 } BlockPrefetch; 724 }; 725 726 } DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION; 727 728 typedef struct _DISK_GROW_PARTITION { 729 ULONG PartitionNumber; 730 LARGE_INTEGER BytesToGrow; 731 } DISK_GROW_PARTITION, *PDISK_GROW_PARTITION; 732 #endif 733 734 735 #ifdef __cplusplus 736 } 737 #endif 738 739 #endif /* _NTDDDISK_H_ */ 740