Reactos
at master 969 lines 30 kB view raw
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 38extern "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_ARE_VOLUMES_READY \ 47 CTL_CODE(IOCTL_DISK_BASE, 0x0087, METHOD_BUFFERED, FILE_READ_ACCESS) 48 49#define IOCTL_DISK_CHECK_VERIFY \ 50 CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) 51 52#define IOCTL_DISK_CONTROLLER_NUMBER \ 53 CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS) 54 55#define IOCTL_DISK_CREATE_DISK \ 56 CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 57 58#define IOCTL_DISK_DELETE_DRIVE_LAYOUT \ 59 CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 60 61#define IOCTL_DISK_FIND_NEW_DEVICES \ 62 CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) 63 64#define IOCTL_DISK_FORMAT_DRIVE \ 65 CTL_CODE(IOCTL_DISK_BASE, 0x00f3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 66 67#define IOCTL_DISK_FORMAT_TRACKS \ 68 CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 69 70#define IOCTL_DISK_FORMAT_TRACKS_EX \ 71 CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 72 73#define IOCTL_DISK_GET_CACHE_INFORMATION \ 74 CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS) 75 76#define IOCTL_DISK_GET_CACHE_SETTING \ 77 CTL_CODE(IOCTL_DISK_BASE, 0x0038, METHOD_BUFFERED, FILE_READ_ACCESS) 78 79#define IOCTL_DISK_GET_CLUSTER_INFO \ 80 CTL_CODE(IOCTL_DISK_BASE, 0x0085, METHOD_BUFFERED, FILE_ANY_ACCESS) 81 82#define IOCTL_DISK_GET_DISK_ATTRIBUTES \ 83 CTL_CODE(IOCTL_DISK_BASE, 0x003c, METHOD_BUFFERED, FILE_ANY_ACCESS) 84 85#define IOCTL_DISK_GET_DRIVE_GEOMETRY \ 86 CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS) 87 88#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX \ 89 CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS) 90 91#define IOCTL_DISK_GET_DRIVE_LAYOUT \ 92 CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) 93 94#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX \ 95 CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS) 96 97#define IOCTL_DISK_GET_MEDIA_TYPES \ 98 CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) 99 100#define IOCTL_DISK_GET_LENGTH_INFO \ 101 CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS) 102 103#define IOCTL_DISK_GET_PARTITION_ATTRIBUTES \ 104 CTL_CODE(IOCTL_DISK_BASE, 0x003a, METHOD_BUFFERED, FILE_ANY_ACCESS) 105 106#define IOCTL_DISK_GET_PARTITION_INFO \ 107 CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) 108 109#define IOCTL_DISK_GET_PARTITION_INFO_EX \ 110 CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS) 111 112#define IOCTL_DISK_GET_PERFORMANCE_INFO \ 113 CTL_CODE(IOCTL_DISK_BASE, 0x0089, METHOD_BUFFERED, FILE_ANY_ACCESS) 114 115#define IOCTL_DISK_GET_SAN_SETTINGS \ 116 CTL_CODE(IOCTL_DISK_BASE, 0x0080, METHOD_BUFFERED, FILE_READ_ACCESS) 117 118#define IOCTL_DISK_GET_SNAPSHOT_INFO \ 119 CTL_CODE(IOCTL_DISK_BASE, 0x0082, METHOD_BUFFERED, FILE_READ_ACCESS) 120 121#define IOCTL_DISK_GROW_PARTITION \ 122 CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 123 124#define IOCTL_DISK_HISTOGRAM_STRUCTURE \ 125 CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS) 126 127#define IOCTL_DISK_HISTOGRAM_DATA \ 128 CTL_CODE(IOCTL_DISK_BASE, 0x000d, METHOD_BUFFERED, FILE_ANY_ACCESS) 129 130#define IOCTL_DISK_HISTOGRAM_RESET \ 131 CTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS) 132 133#define IOCTL_DISK_INTERNAL_CLEAR_VERIFY \ 134 CTL_CODE(IOCTL_DISK_BASE, 0x0101, METHOD_NEITHER, FILE_ANY_ACCESS) 135 136#define IOCTL_DISK_INTERNAL_SET_VERIFY \ 137 CTL_CODE(IOCTL_DISK_BASE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS) 138 139#define IOCTL_DISK_INTERNAL_SET_NOTIFY \ 140 CTL_CODE(IOCTL_DISK_BASE, 0x0102, METHOD_BUFFERED, FILE_ANY_ACCESS) 141 142#define IOCTL_DISK_IS_CLUSTERED \ 143 CTL_CODE(IOCTL_DISK_BASE, 0x003e, METHOD_BUFFERED, FILE_ANY_ACCESS) 144 145#define IOCTL_DISK_IS_WRITABLE \ 146 CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS) 147 148#define IOCTL_DISK_LOGGING \ 149 CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS) 150 151#define IOCTL_DISK_PERFORMANCE \ 152 CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS) 153 154#define IOCTL_DISK_PERFORMANCE_OFF \ 155 CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS) 156 157#define IOCTL_DISK_REASSIGN_BLOCKS \ 158 CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 159 160#define IOCTL_DISK_REQUEST_DATA \ 161 CTL_CODE(IOCTL_DISK_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS) 162 163#define IOCTL_DISK_REQUEST_STRUCTURE \ 164 CTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS) 165 166#define IOCTL_DISK_RESET_SNAPSHOT_INFO \ 167 CTL_CODE(IOCTL_DISK_BASE, 0x0084, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 168 169#define IOCTL_DISK_MEDIA_REMOVAL \ 170 CTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) 171 172#define IOCTL_DISK_EJECT_MEDIA \ 173 CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) 174 175#define IOCTL_DISK_LOAD_MEDIA \ 176 CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) 177 178#define IOCTL_DISK_REASSIGN_BLOCKS_EX \ 179 CTL_CODE(IOCTL_DISK_BASE, 0x0029, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 180 181#define IOCTL_DISK_RESERVE \ 182 CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) 183 184#define IOCTL_DISK_RELEASE \ 185 CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) 186 187#define IOCTL_DISK_FIND_NEW_DEVICES \ 188 CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) 189 190#define IOCTL_DISK_SENSE_DEVICE \ 191 CTL_CODE(IOCTL_DISK_BASE, 0x00f8, METHOD_BUFFERED, FILE_ANY_ACCESS) 192 193#define IOCTL_DISK_SET_CACHE_INFORMATION \ 194 CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 195 196#define IOCTL_DISK_SET_CACHE_SETTING \ 197 CTL_CODE(IOCTL_DISK_BASE, 0x0039, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 198 199#define IOCTL_DISK_SET_CLUSTER_INFO \ 200 CTL_CODE(IOCTL_DISK_BASE, 0x0086, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 201 202#define IOCTL_DISK_SET_DISK_ATTRIBUTES \ 203 CTL_CODE(IOCTL_DISK_BASE, 0x003d, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 204 205#define IOCTL_DISK_SET_DRIVE_LAYOUT \ 206 CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 207 208#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX \ 209 CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 210 211#define IOCTL_DISK_SET_PARTITION_ATTRIBUTES \ 212 CTL_CODE(IOCTL_DISK_BASE, 0x003b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 213 214#define IOCTL_DISK_SET_PARTITION_INFO \ 215 CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 216 217#define IOCTL_DISK_SET_PARTITION_INFO_EX \ 218 CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 219 220#define IOCTL_DISK_SET_SAN_SETTINGS \ 221 CTL_CODE(IOCTL_DISK_BASE, 0x0081, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 222 223#define IOCTL_DISK_SET_SNAPSHOT_INFO \ 224 CTL_CODE(IOCTL_DISK_BASE, 0x0083, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 225 226// 227// NTDDI_WIN2003 was an older define used in the early beta builds, which 228// Microsoft forgot to fix in a few headers. 229// NTDDI_WS03 is the correct term. 230// 231#if (NTDDI_VERSION < NTDDI_WS03) 232#define IOCTL_DISK_GET_WRITE_CACHE_STATE \ 233 CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS) 234#else 235#define OBSOLETE_DISK_GET_WRITE_CACHE_STATE \ 236 CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS) 237#endif 238 239#define IOCTL_DISK_UPDATE_DRIVE_SIZE \ 240 CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 241 242#define IOCTL_DISK_UPDATE_PROPERTIES \ 243 CTL_CODE(IOCTL_DISK_BASE, 0x0050, METHOD_BUFFERED, FILE_ANY_ACCESS) 244 245#define IOCTL_DISK_VERIFY \ 246 CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS) 247 248#define IOCTL_DISK_VOLUMES_ARE_READY \ 249 CTL_CODE(IOCTL_DISK_BASE, 0x0088, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 250 251#define IOCTL_DISK_COPY_DATA \ 252 CTL_CODE(IOCTL_DISK_BASE, 0x0019, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 253 254#define IOCTL_DISK_SIMBAD \ 255 CTL_CODE(IOCTL_DISK_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 256 257#define SMART_GET_VERSION \ 258 CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS) 259 260#define SMART_RCV_DRIVE_DATA \ 261 CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 262 263#define SMART_SEND_DRIVE_COMMAND \ 264 CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 265 266#define PARTITION_ENTRY_UNUSED 0x00 267#define PARTITION_FAT_12 0x01 268#define PARTITION_XENIX_1 0x02 269#define PARTITION_XENIX_2 0x03 270#define PARTITION_FAT_16 0x04 271#define PARTITION_EXTENDED 0x05 272#define PARTITION_HUGE 0x06 273#define PARTITION_IFS 0x07 274#define PARTITION_OS2BOOTMGR 0x0A 275#define PARTITION_FAT32 0x0B 276#define PARTITION_FAT32_XINT13 0x0C 277#define PARTITION_XINT13 0x0E 278#define PARTITION_XINT13_EXTENDED 0x0F 279#define PARTITION_MSFT_RECOVERY 0x27 280#define PARTITION_MAIN_OS 0x28 281#define PARTIITON_OS_DATA 0x29 282#define PARTITION_PRE_INSTALLED 0x2a 283#define PARTITION_BSP 0x2b 284#define PARTITION_DPP 0x2c 285#define PARTITION_WINDOWS_SYSTEM 0x2d 286#define PARTITION_PREP 0x41 287#define PARTITION_LDM 0x42 288#define PARTITION_DM 0x54 289#define PARTITION_EZDRIVE 0x55 290#define PARTITION_UNIX 0x63 291#define PARTITION_SPACES_DATA 0xD7 292#define PARTITION_SPACES 0xE7 293#define PARTITION_GPT 0xEE 294#define PARTITION_SYSTEM 0xEF 295 296#define VALID_NTFT 0xC0 297#define PARTITION_NTFT 0x80 298 299#ifdef __REACTOS__ 300#define PARTITION_OLD_LINUX 0x43 301#define PARTITION_LINUX 0x83 302#define PARTITION_ISO9660 0x96 303#define PARTITION_FREEBSD 0xA5 304#define PARTITION_OPENBSD 0xA6 305#define PARTITION_NETBSD 0xA9 306#endif 307 308/* 309 * NOTE: Support for partition types removed from IsFTPartition() and 310 * IsRecognizedPartition() because they conflict with 3rd-party types: 311 * PARTITION_NTFT | PARTITION_FAT_12 : Conflict with 0x81 "Linux or MINIX" 312 * PARTITION_NTFT | PARTITION_FAT_16 : Conflict with 0x84 "Hibernation" 313 * PARTITION_NTFT | PARTITION_XINT13 : Conflict with 0x8E "Linux LVM" 314 */ 315#define IsFTPartition(PartitionType) \ 316 ( ((PartitionType) & PARTITION_NTFT) && ((((PartitionType) & ~VALID_NTFT) == PARTITION_HUGE) || \ 317 (((PartitionType) & ~VALID_NTFT) == PARTITION_IFS) || \ 318 (((PartitionType) & ~VALID_NTFT) == PARTITION_FAT32) || \ 319 (((PartitionType) & ~VALID_NTFT) == PARTITION_FAT32_XINT13)) ) 320 321#define IsContainerPartition(PartitionType) \ 322 ( ((PartitionType) == PARTITION_EXTENDED) || \ 323 ((PartitionType) == PARTITION_XINT13_EXTENDED) ) 324 325#ifdef __REACTOS__ 326#define IsRecognizedPartition(PartitionType) \ 327 ( IsFTPartition(PartitionType) || \ 328 ((PartitionType) == PARTITION_FAT_12) || \ 329 ((PartitionType) == PARTITION_FAT_16) || \ 330 ((PartitionType) == PARTITION_HUGE) || \ 331 ((PartitionType) == PARTITION_IFS) || \ 332 ((PartitionType) == PARTITION_FAT32) || \ 333 ((PartitionType) == PARTITION_FAT32_XINT13) || \ 334 ((PartitionType) == PARTITION_XINT13) || \ 335 ((PartitionType) == PARTITION_LINUX) || \ 336 ((PartitionType) == PARTITION_OLD_LINUX) || \ 337 ((PartitionType) == PARTITION_ISO9660) || \ 338 ((PartitionType) == PARTITION_FREEBSD) || \ 339 ((PartitionType) == PARTITION_OPENBSD) || \ 340 ((PartitionType) == PARTITION_NETBSD) ) 341#else 342#define IsRecognizedPartition(PartitionType) \ 343 ( IsFTPartition(PartitionType) || \ 344 ((PartitionType) == PARTITION_FAT_12) || \ 345 ((PartitionType) == PARTITION_FAT_16) || \ 346 ((PartitionType) == PARTITION_HUGE) || \ 347 ((PartitionType) == PARTITION_IFS) || \ 348 ((PartitionType) == PARTITION_FAT32) || \ 349 ((PartitionType) == PARTITION_FAT32_XINT13) || \ 350 ((PartitionType) == PARTITION_XINT13) ) 351#endif 352 353#if (_WIN32_WINNT >= 0x0500) 354/* Actually it should be > 0x0500, since this is not present in Windows 2000; 355 * however we keep >= 0x0500 for compatibility with MS PSDK. */ 356 357#define GPT_ATTRIBUTE_PLATFORM_REQUIRED 0x00000001 358#define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY 0x10000000 359#define GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY 0x20000000 360#define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN 0x40000000 361#define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000 362#endif 363 364#define WMI_DISK_GEOMETRY_GUID \ 365 {0x25007f51, 0x57c2, 0x11d1, {0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10}} 366 367typedef USHORT BAD_TRACK_NUMBER; 368typedef USHORT *PBAD_TRACK_NUMBER; 369 370typedef enum _MEDIA_TYPE { 371 Unknown, 372 F5_1Pt2_512, 373 F3_1Pt44_512, 374 F3_2Pt88_512, 375 F3_20Pt8_512, 376 F3_720_512, 377 F5_360_512, 378 F5_320_512, 379 F5_320_1024, 380 F5_180_512, 381 F5_160_512, 382 RemovableMedia, 383 FixedMedia, 384 F3_120M_512, 385 F3_640_512, 386 F5_640_512, 387 F5_720_512, 388 F3_1Pt2_512, 389 F3_1Pt23_1024, 390 F5_1Pt23_1024, 391 F3_128Mb_512, 392 F3_230Mb_512, 393 F8_256_128, 394 F3_200Mb_512, 395 F3_240M_512, 396 F3_32M_512 397} MEDIA_TYPE, *PMEDIA_TYPE; 398 399typedef struct _DISK_GEOMETRY { 400 LARGE_INTEGER Cylinders; 401 MEDIA_TYPE MediaType; 402 ULONG TracksPerCylinder; 403 ULONG SectorsPerTrack; 404 ULONG BytesPerSector; 405} DISK_GEOMETRY, *PDISK_GEOMETRY; 406 407typedef struct _PARTITION_INFORMATION { 408 LARGE_INTEGER StartingOffset; 409 LARGE_INTEGER PartitionLength; 410 ULONG HiddenSectors; 411 ULONG PartitionNumber; 412 UCHAR PartitionType; 413 BOOLEAN BootIndicator; 414 BOOLEAN RecognizedPartition; 415 BOOLEAN RewritePartition; 416} PARTITION_INFORMATION, *PPARTITION_INFORMATION; 417 418typedef struct _DRIVE_LAYOUT_INFORMATION { 419 ULONG PartitionCount; 420 ULONG Signature; 421 PARTITION_INFORMATION PartitionEntry[1]; 422} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION; 423 424typedef struct _SET_PARTITION_INFORMATION { 425 UCHAR PartitionType; 426} SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION; 427 428#if (_WIN32_WINNT >= 0x0500) 429/* Actually it should be > 0x0500, since this is not present in Windows 2000; 430 * however we keep >= 0x0500 for compatibility with MS PSDK. */ 431 432typedef enum _PARTITION_STYLE { 433 PARTITION_STYLE_MBR, 434 PARTITION_STYLE_GPT, 435 PARTITION_STYLE_RAW, 436#ifdef __REACTOS__ 437 /* ReactOS custom partition handlers */ 438 PARTITION_STYLE_BRFR = 128 /* Xbox-BRFR partitioning scheme */ 439#endif 440} PARTITION_STYLE; 441 442typedef struct _CREATE_DISK_GPT 443{ 444 GUID DiskId; 445 ULONG MaxPartitionCount; 446} CREATE_DISK_GPT, *PCREATE_DISK_GPT; 447 448typedef struct _CREATE_DISK_MBR 449{ 450 ULONG Signature; 451} CREATE_DISK_MBR, *PCREATE_DISK_MBR; 452 453typedef struct _CREATE_DISK 454{ 455 PARTITION_STYLE PartitionStyle; 456 union { 457 CREATE_DISK_MBR Mbr; 458 CREATE_DISK_GPT Gpt; 459 }; 460} CREATE_DISK, *PCREATE_DISK; 461 462typedef enum _DETECTION_TYPE { 463 DetectNone, 464 DetectInt13, 465 DetectExInt13 466} DETECTION_TYPE; 467 468typedef struct _DISK_INT13_INFO { 469 USHORT DriveSelect; 470 ULONG MaxCylinders; 471 USHORT SectorsPerTrack; 472 USHORT MaxHeads; 473 USHORT NumberDrives; 474} DISK_INT13_INFO, *PDISK_INT13_INFO; 475 476typedef struct _DISK_EX_INT13_INFO { 477 USHORT ExBufferSize; 478 USHORT ExFlags; 479 ULONG ExCylinders; 480 ULONG ExHeads; 481 ULONG ExSectorsPerTrack; 482 ULONG64 ExSectorsPerDrive; 483 USHORT ExSectorSize; 484 USHORT ExReserved; 485} DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO; 486 487typedef struct _DISK_DETECTION_INFO { 488 ULONG SizeOfDetectInfo; 489 DETECTION_TYPE DetectionType; 490 _ANONYMOUS_UNION union { 491 _ANONYMOUS_STRUCT struct { 492 DISK_INT13_INFO Int13; 493 DISK_EX_INT13_INFO ExInt13; 494 } DUMMYSTRUCTNAME; 495 } DUMMYUNIONNAME; 496} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO; 497 498typedef struct _DISK_PARTITION_INFO { 499 ULONG SizeOfPartitionInfo; 500 PARTITION_STYLE PartitionStyle; 501 _ANONYMOUS_UNION union { 502 struct { 503 ULONG Signature; 504 ULONG CheckSum; 505 } Mbr; 506 struct { 507 GUID DiskId; 508 } Gpt; 509 } DUMMYUNIONNAME; 510} DISK_PARTITION_INFO, *PDISK_PARTITION_INFO; 511 512typedef struct _DISK_GEOMETRY_EX { 513 DISK_GEOMETRY Geometry; 514 LARGE_INTEGER DiskSize; 515 UCHAR Data[1]; 516} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX; 517 518#if (NTDDI_VERSION < NTDDI_WS03) 519#define DiskGeometryGetPartition(Geometry) \ 520 ((PDISK_PARTITION_INFO)((Geometry) + 1)) 521 522#define DiskGeometryGetDetect(Geometry)\ 523 ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \ 524 DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo))) 525#else 526#define DiskGeometryGetPartition(Geometry) \ 527 ((PDISK_PARTITION_INFO)((Geometry)->Data)) 528 529#define DiskGeometryGetDetect(Geometry)\ 530 ((PDISK_DETECTION_INFO)(((ULONG_PTR)DiskGeometryGetPartition(Geometry) + \ 531 DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo))) 532#endif 533 534typedef struct _PARTITION_INFORMATION_GPT { 535 GUID PartitionType; 536 GUID PartitionId; 537 ULONG64 Attributes; 538 WCHAR Name [36]; 539} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT; 540 541typedef struct _PARTITION_INFORMATION_MBR { 542 UCHAR PartitionType; 543 BOOLEAN BootIndicator; 544 BOOLEAN RecognizedPartition; 545 ULONG HiddenSectors; 546} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR; 547 548typedef struct _PARTITION_INFORMATION_EX { 549 PARTITION_STYLE PartitionStyle; 550 LARGE_INTEGER StartingOffset; 551 LARGE_INTEGER PartitionLength; 552 ULONG PartitionNumber; 553 BOOLEAN RewritePartition; 554#if (NTDDI_VERSION >= NTDDI_WIN10_RS3) 555 BOOLEAN IsServicePartition; 556#endif 557 _ANONYMOUS_UNION union { 558 PARTITION_INFORMATION_MBR Mbr; 559 PARTITION_INFORMATION_GPT Gpt; 560 } DUMMYUNIONNAME; 561} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX; 562 563typedef struct _DRIVE_LAYOUT_INFORMATION_GPT { 564 GUID DiskId; 565 LARGE_INTEGER StartingUsableOffset; 566 LARGE_INTEGER UsableLength; 567 ULONG MaxPartitionCount; 568} DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT; 569 570typedef struct _DRIVE_LAYOUT_INFORMATION_MBR { 571 ULONG Signature; 572#if (NTDDI_VERSION >= NTDDI_WIN10_RS1) 573 ULONG CheckSum; 574#endif 575} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR; 576 577typedef struct _DRIVE_LAYOUT_INFORMATION_EX { 578 ULONG PartitionStyle; 579 ULONG PartitionCount; 580 __GNU_EXTENSION union { 581 DRIVE_LAYOUT_INFORMATION_MBR Mbr; 582 DRIVE_LAYOUT_INFORMATION_GPT Gpt; 583 }; 584 PARTITION_INFORMATION_EX PartitionEntry[1]; 585} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX; 586 587typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR; 588typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT; 589 590typedef struct _SET_PARTITION_INFORMATION_EX { 591 PARTITION_STYLE PartitionStyle; 592 _ANONYMOUS_UNION union { 593 SET_PARTITION_INFORMATION_MBR Mbr; 594 SET_PARTITION_INFORMATION_GPT Gpt; 595 } DUMMYUNIONNAME; 596} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX; 597 598#endif // (_WIN32_WINNT >= 0x0500) 599 600typedef struct _DISK_PERFORMANCE { 601 LARGE_INTEGER BytesRead; 602 LARGE_INTEGER BytesWritten; 603 LARGE_INTEGER ReadTime; 604 LARGE_INTEGER WriteTime; 605 LARGE_INTEGER IdleTime; 606 ULONG ReadCount; 607 ULONG WriteCount; 608 ULONG QueueDepth; 609 ULONG SplitCount; 610 LARGE_INTEGER QueryTime; 611 ULONG StorageDeviceNumber; 612 WCHAR StorageManagerName[8]; 613} DISK_PERFORMANCE, *PDISK_PERFORMANCE; 614 615typedef struct _FORMAT_EX_PARAMETERS { 616 MEDIA_TYPE MediaType; 617 ULONG StartCylinderNumber; 618 ULONG EndCylinderNumber; 619 ULONG StartHeadNumber; 620 ULONG EndHeadNumber; 621 USHORT FormatGapLength; 622 USHORT SectorsPerTrack; 623 USHORT SectorNumber[1]; 624} FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS; 625 626typedef struct _FORMAT_PARAMETERS { 627 MEDIA_TYPE MediaType; 628 ULONG StartCylinderNumber; 629 ULONG EndCylinderNumber; 630 ULONG StartHeadNumber; 631 ULONG EndHeadNumber; 632} FORMAT_PARAMETERS, *PFORMAT_PARAMETERS; 633 634typedef struct _GET_LENGTH_INFORMATION { 635 LARGE_INTEGER Length; 636} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION; 637 638typedef struct _REASSIGN_BLOCKS { 639 USHORT Reserved; 640 USHORT Count; 641 ULONG BlockNumber[1]; 642} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS; 643 644typedef struct _REASSIGN_BLOCKS_EX { 645 USHORT Reserved; 646 USHORT Count; 647 LARGE_INTEGER BlockNumber[1]; 648} REASSIGN_BLOCKS_EX, *PREASSIGN_BLOCKS_EX; 649 650typedef struct _VERIFY_INFORMATION { 651 LARGE_INTEGER StartingOffset; 652 ULONG Length; 653} VERIFY_INFORMATION, *PVERIFY_INFORMATION; 654 655/* GETVERSIONINPARAMS.fCapabilities constants */ 656#define CAP_ATA_ID_CMD 1 657#define CAP_ATAPI_ID_CMD 2 658#define CAP_SMART_CMD 4 659 660typedef struct _GETVERSIONINPARAMS { 661 UCHAR bVersion; 662 UCHAR bRevision; 663 UCHAR bReserved; 664 UCHAR bIDEDeviceMap; 665 ULONG fCapabilities; 666 ULONG dwReserved[4]; 667} GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS; 668 669/* IDEREGS.bCommandReg constants */ 670#define ATAPI_ID_CMD 0xA1 671#define ID_CMD 0xEC 672#define SMART_CMD 0xB0 673 674#define SMART_CYL_LOW 0x4F 675#define SMART_CYL_HI 0xC2 676 677typedef struct _IDEREGS { 678 UCHAR bFeaturesReg; 679 UCHAR bSectorCountReg; 680 UCHAR bSectorNumberReg; 681 UCHAR bCylLowReg; 682 UCHAR bCylHighReg; 683 UCHAR bDriveHeadReg; 684 UCHAR bCommandReg; 685 UCHAR bReserved; 686} IDEREGS, *PIDEREGS, *LPIDEREGS; 687 688#include <pshpack1.h> 689typedef struct _SENDCMDINPARAMS { 690 ULONG cBufferSize; 691 IDEREGS irDriveRegs; 692 UCHAR bDriveNumber; 693 UCHAR bReserved[3]; 694 ULONG dwReserved[4]; 695 UCHAR bBuffer[1]; 696} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; 697#include <poppack.h> 698 699/* DRIVERSTATUS.bDriverError constants */ 700#define SMART_NO_ERROR 0 701#define SMART_IDE_ERROR 1 702#define SMART_INVALID_FLAG 2 703#define SMART_INVALID_COMMAND 3 704#define SMART_INVALID_BUFFER 4 705#define SMART_INVALID_DRIVE 5 706#define SMART_INVALID_IOCTL 6 707#define SMART_ERROR_NO_MEM 7 708#define SMART_INVALID_REGISTER 8 709#define SMART_NOT_SUPPORTED 9 710#define SMART_NO_IDE_DEVICE 10 711 712#define SMART_OFFLINE_ROUTINE_OFFLINE 0 713#define SMART_SHORT_SELFTEST_OFFLINE 1 714#define SMART_EXTENDED_SELFTEST_OFFLINE 2 715#define SMART_ABORT_OFFLINE_SELFTEST 127 716#define SMART_SHORT_SELFTEST_CAPTIVE 129 717#define SMART_EXTENDED_SELFTEST_CAPTIVE 130 718 719typedef struct _DRIVERSTATUS { 720 UCHAR bDriverError; 721 UCHAR bIDEError; 722 UCHAR bReserved[2]; 723 ULONG dwReserved[2]; 724} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS; 725 726#define READ_ATTRIBUTE_BUFFER_SIZE 512 727#define IDENTIFY_BUFFER_SIZE 512 728#define READ_THRESHOLD_BUFFER_SIZE 512 729#define SMART_LOG_SECTOR_SIZE 512 730 731#include <pshpack1.h> 732typedef struct _SENDCMDOUTPARAMS { 733 ULONG cBufferSize; 734 DRIVERSTATUS DriverStatus; 735 UCHAR bBuffer[1]; 736} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; 737#include <poppack.h> 738 739#define READ_ATTRIBUTES 0xD0 740#define READ_THRESHOLDS 0xD1 741#define ENABLE_DISABLE_AUTOSAVE 0xD2 742#define SAVE_ATTRIBUTE_VALUES 0xD3 743#define EXECUTE_OFFLINE_DIAGS 0xD4 744#define SMART_READ_LOG 0xD5 745#define SMART_WRITE_LOG 0xd6 746#define ENABLE_SMART 0xD8 747#define DISABLE_SMART 0xD9 748#define RETURN_SMART_STATUS 0xDA 749#define ENABLE_DISABLE_AUTO_OFFLINE 0xDB 750 751typedef struct _MAPPED_ADDRESS { 752 struct _MAPPED_ADDRESS *NextMappedAddress; 753 PVOID MappedAddress; 754 ULONG NumberOfBytes; 755 LARGE_INTEGER IoAddress; 756 ULONG BusNumber; 757} MAPPED_ADDRESS, *PMAPPED_ADDRESS; 758 759 760#if (_WIN32_WINNT >= 0x0500) 761 762typedef enum { 763 EqualPriority, 764 KeepPrefetchedData, 765 KeepReadData 766} DISK_CACHE_RETENTION_PRIORITY; 767 768typedef enum _DISK_WRITE_CACHE_STATE { 769 DiskWriteCacheNormal, 770 DiskWriteCacheForceDisable, 771 DiskWriteCacheDisableNotSupported 772} DISK_WRITE_CACHE_STATE, *PDISK_WRITE_CACHE_STATE; 773 774 775typedef struct _DISK_CACHE_INFORMATION 776{ 777 BOOLEAN ParametersSavable; 778 BOOLEAN ReadCacheEnabled; 779 BOOLEAN WriteCacheEnabled; 780 DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; 781 DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; 782 USHORT DisablePrefetchTransferLength; 783 BOOLEAN PrefetchScalar; 784 union { 785 struct { 786 USHORT Minimum; 787 USHORT Maximum; 788 USHORT MaximumBlocks; 789 } ScalarPrefetch; 790 791 struct { 792 USHORT Minimum; 793 USHORT Maximum; 794 } BlockPrefetch; 795 }; 796 797} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION; 798 799typedef struct _DISK_GROW_PARTITION { 800 ULONG PartitionNumber; 801 LARGE_INTEGER BytesToGrow; 802} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION; 803#endif 804 805// for IOCTL_DISK_CONTROLLER_NUMBER 806 807typedef struct _DISK_CONTROLLER_NUMBER { 808 ULONG ControllerNumber; 809 ULONG DiskNumber; 810} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER; 811 812// for IOCTL_DISK_COPY_DATA 813 814typedef struct _DISK_COPY_DATA_PARAMETERS { 815 LARGE_INTEGER SourceOffset; 816 LARGE_INTEGER DestinationOffset; 817 LARGE_INTEGER CopyLength; 818 ULONGLONG Reserved; 819} DISK_COPY_DATA_PARAMETERS, *PDISK_COPY_DATA_PARAMETERS; 820 821// for IOCTL_DISK_GET_CACHE_SETTING and IOCTL_DISK_SET_CACHE_SETTING 822 823typedef enum _DISK_CACHE_STATE { 824 DiskCacheNormal, 825 DiskCacheWriteThroughNotSupported, 826 DiskCacheModifyUnsuccessful 827} DISK_CACHE_STATE, *PDISK_CACHE_STATE; 828 829typedef struct _DISK_CACHE_SETTING { 830 ULONG Version; 831 DISK_CACHE_STATE State; 832 BOOLEAN IsPowerProtected; 833} DISK_CACHE_SETTING, *PDISK_CACHE_SETTING; 834 835#if (NTDDI_VERSION >= NTDDI_VISTA) 836 837// for IOCTL_DISK_GET_PARTITION_ATTRIBUTES and IOCTL_DISK_SET_PARTITION_ATTRIBUTES 838 839typedef struct _GET_PARTITION_ATTRIBUTES { 840 ULONG Version; 841 ULONG Reserved1; 842 ULONGLONG Attributes; 843} GET_PARTITION_ATTRIBUTES, *PGET_PARTITION_ATTRIBUTES; 844 845typedef struct _SET_PARTITION_ATTRIBUTES { 846 ULONG Version; 847 BOOLEAN Persist; 848 BOOLEAN Reserved1[3]; 849 ULONGLONG Attributes; 850 ULONGLONG AttributesMask; 851} SET_PARTITION_ATTRIBUTES, *PSET_PARTITION_ATTRIBUTES; 852 853// for IOCTL_DISK_GET_DISK_ATTRIBUTES and IOCTL_DISK_SET_DISK_ATTRIBUTES 854 855#define DISK_ATTRIBUTE_OFFLINE 0x0000000000000001 856#define DISK_ATTRIBUTE_READ_ONLY 0x0000000000000002 857#define DISK_ATTRIBUTE_HIDDEN 0x0000000000000004 858#define DISK_ATTRIBUTE_MAINTENANCE 0x0000000000000008 859#define DISK_ATTRIBUTE_SPACES_BYPASS 0x0000000000000010 860 861typedef struct _GET_DISK_ATTRIBUTES { 862 ULONG Version; 863 ULONG Reserved1; 864 ULONGLONG Attributes; 865} GET_DISK_ATTRIBUTES, *PGET_DISK_ATTRIBUTES; 866 867typedef struct _SET_DISK_ATTRIBUTES { 868 ULONG Version; 869 BOOLEAN Persist; 870 BOOLEAN RelinquishOwnership; 871 BOOLEAN Reserved1[2]; 872 ULONGLONG Attributes; 873 ULONGLONG AttributesMask; 874 GUID Owner; 875} SET_DISK_ATTRIBUTES, *PSET_DISK_ATTRIBUTES; 876 877 878// for IOCTL_DISK_GET_SAN_SETTINGS and IOCTL_DISK_SET_SAN_SETTINGS 879 880typedef enum _DISK_SAN_POLICY { 881 DiskSanPolicyUnknown, 882 DiskSanPolicyOnline, 883 DiskSanPolicyOfflineShared, 884 DiskSanPolicyOffline, 885 DiskSanPolicyOfflineInternal, 886 DiskSanPolicyMax 887} DISK_SAN_POLICY, *PDISK_SAN_POLICY; 888 889typedef struct _DISK_SAN_SETTINGS { 890 ULONG Version; 891 DISK_SAN_POLICY SanPolicy; 892} DISK_SAN_SETTINGS, *PDISK_SAN_SETTINGS; 893 894// for IOCTL_DISK_GET_SNAPSHOT_INFO and IOCTL_DISK_SET_SNAPSHOT_INFO 895typedef enum _DISK_SNAPSHOT_STATE { 896 DiskSnapshotNormalDisk, 897 DiskSnapshotSnapshotCheckRequired, 898 DiskSnapshotPreSnapshot, 899 DiskSnapshotSnapshotDisk 900} DISK_SNAPSHOT_STATE, *PDISK_SNAPSHOT_STATE; 901 902typedef struct _DISK_SNAPSHOT_INFO { 903 ULONG Version; 904 DISK_SNAPSHOT_STATE State; 905 GUID SnapshotSetId; 906 GUID SnapshotId; 907 GUID LunId; 908 LARGE_INTEGER CreationTimeStamp; 909 ULONG ImportCount; 910 ULONG Flags; 911 ULONG AdditionalDataSize; 912 UCHAR AdditionalData[ANYSIZE_ARRAY]; 913} DISK_SNAPSHOT_INFO, *PDISK_SNAPSHOT_INFO; 914#endif /* NTDDI_VERSION >= NTDDI_VISTA */ 915 916#if (NTDDI_VERSION >= NTDDI_WIN8) 917 918// for IOCTL_DISK_GET_CLUSTER_INFO and IOCTL_DISK_SET_CLUSTER_INFO 919 920#define DISK_CLUSTER_FLAG_ENABLED 0x0000000000000001 921#define DISK_CLUSTER_FLAG_CSV 0x0000000000000002 922#define DISK_CLUSTER_FLAG_IN_MAINTENANCE 0x0000000000000004 923#define DISK_CLUSTER_FLAG_PNP_ARRIVAL_COMPLETE 0x0000000000000008 924 925typedef struct _DISK_CLUSTER_INFO { 926 ULONG Version; 927 ULONGLONG Flags; 928 ULONGLONG FlagsMask; 929 BOOLEAN Notify; 930} DISK_CLUSTER_INFO, *PDISK_CLUSTER_INFO; 931 932// for IOCTL_DISK_GET_PERFORMANCE_INFO 933 934typedef enum _DISK_PERFORMANCE_TYPE { 935 DiskPerformanceTypeAllPriority, 936 DiskPerformanceTypeNonLowPriority, 937 DiskPerformanceTypeMax 938} DISK_PERFORMANCE_TYPE, *PDISK_PERFORMANCE_TYPE; 939 940typedef struct _DISK_PERFORMANCE_PARAMETERS { 941 ULONG Version; 942 DISK_PERFORMANCE_TYPE Type; 943} DISK_PERFORMANCE_PARAMETERS, *PDISK_PERFORMANCE_PARAMETERS; 944 945typedef struct _DISK_PERFORMANCE_INFO { 946 ULONG Version; 947 DISK_PERFORMANCE_TYPE Type; 948 LARGE_INTEGER QueryTime; 949 LARGE_INTEGER BytesRead; 950 LARGE_INTEGER BytesWritten; 951 LARGE_INTEGER ReadTime; 952 LARGE_INTEGER WriteTime; 953 LARGE_INTEGER FlushTime; 954 LARGE_INTEGER IdleTime; 955 ULONG ReadCount; 956 ULONG WriteCount; 957 ULONG FlushCount; 958 ULONG QueueDepth; 959 ULONG SplitCount; 960} DISK_PERFORMANCE_INFO, *PDISK_PERFORMANCE_INFO; 961 962#endif /* NTDDI_VERSION >= NTDDI_WIN8 */ 963 964 965#ifdef __cplusplus 966} 967#endif 968 969#endif /* _NTDDDISK_H_ */