Home | History | Annotate | Download | only in include
      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifdef DEFINE_GUID
      7 
      8 #ifndef FAR
      9 #define FAR
     10 #endif
     11 
     12 DEFINE_GUID(GUID_DEVINTERFACE_DISK,0x53f56307,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     13 DEFINE_GUID(GUID_DEVINTERFACE_CDROM,0x53f56308,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     14 DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,0x53f5630a,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     15 DEFINE_GUID(GUID_DEVINTERFACE_TAPE,0x53f5630b,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     16 DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,0x53f5630c,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     17 DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,0x53f5630d,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     18 DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,0x53f56310,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     19 DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,0x53f56311,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     20 DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,0x53f56312,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     21 DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,0x2accfe60,0xc130,0x11d2,0xb0,0x82,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
     22 DEFINE_GUID(GUID_DEVINTERFACE_COMPORT,0x86e0d1e0,0x8089,0x11d0,0x9c,0xe4,0x08,0x00,0x3e,0x30,0x1f,0x73);
     23 DEFINE_GUID(GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR,0x4D36E978,0xE325,0x11CE,0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18);
     24 
     25 #define DiskClassGuid GUID_DEVINTERFACE_DISK
     26 #define CdRomClassGuid GUID_DEVINTERFACE_CDROM
     27 #define PartitionClassGuid GUID_DEVINTERFACE_PARTITION
     28 #define TapeClassGuid GUID_DEVINTERFACE_TAPE
     29 #define WriteOnceDiskClassGuid GUID_DEVINTERFACE_WRITEONCEDISK
     30 #define VolumeClassGuid GUID_DEVINTERFACE_VOLUME
     31 #define MediumChangerClassGuid GUID_DEVINTERFACE_MEDIUMCHANGER
     32 #define FloppyClassGuid GUID_DEVINTERFACE_FLOPPY
     33 #define CdChangerClassGuid GUID_DEVINTERFACE_CDCHANGER
     34 #define StoragePortClassGuid GUID_DEVINTERFACE_STORAGEPORT
     35 #define GUID_CLASS_COMPORT GUID_DEVINTERFACE_COMPORT
     36 #define GUID_SERENUM_BUS_ENUMERATOR GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR
     37 #endif /* DEFINE_GUID */
     38 
     39 #ifndef _WINIOCTL_
     40 #define _WINIOCTL_
     41 
     42 #ifndef _DEVIOCTL_
     43 #define _DEVIOCTL_
     44 
     45 #ifndef DEVICE_TYPE
     46 #define DEVICE_TYPE DWORD
     47 #endif
     48 
     49 #define FILE_DEVICE_BEEP 0x00000001
     50 #define FILE_DEVICE_CD_ROM 0x00000002
     51 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
     52 #define FILE_DEVICE_CONTROLLER 0x00000004
     53 #define FILE_DEVICE_DATALINK 0x00000005
     54 #define FILE_DEVICE_DFS 0x00000006
     55 #define FILE_DEVICE_DISK 0x00000007
     56 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
     57 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
     58 #define FILE_DEVICE_INPORT_PORT 0x0000000a
     59 #define FILE_DEVICE_KEYBOARD 0x0000000b
     60 #define FILE_DEVICE_MAILSLOT 0x0000000c
     61 #define FILE_DEVICE_MIDI_IN 0x0000000d
     62 #define FILE_DEVICE_MIDI_OUT 0x0000000e
     63 #define FILE_DEVICE_MOUSE 0x0000000f
     64 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
     65 #define FILE_DEVICE_NAMED_PIPE 0x00000011
     66 #define FILE_DEVICE_NETWORK 0x00000012
     67 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
     68 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
     69 #define FILE_DEVICE_NULL 0x00000015
     70 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
     71 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
     72 #define FILE_DEVICE_PRINTER 0x00000018
     73 #define FILE_DEVICE_SCANNER 0x00000019
     74 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
     75 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
     76 #define FILE_DEVICE_SCREEN 0x0000001c
     77 #define FILE_DEVICE_SOUND 0x0000001d
     78 #define FILE_DEVICE_STREAMS 0x0000001e
     79 #define FILE_DEVICE_TAPE 0x0000001f
     80 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
     81 #define FILE_DEVICE_TRANSPORT 0x00000021
     82 #define FILE_DEVICE_UNKNOWN 0x00000022
     83 #define FILE_DEVICE_VIDEO 0x00000023
     84 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
     85 #define FILE_DEVICE_WAVE_IN 0x00000025
     86 #define FILE_DEVICE_WAVE_OUT 0x00000026
     87 #define FILE_DEVICE_8042_PORT 0x00000027
     88 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
     89 #define FILE_DEVICE_BATTERY 0x00000029
     90 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
     91 #define FILE_DEVICE_MODEM 0x0000002b
     92 #define FILE_DEVICE_VDM 0x0000002c
     93 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
     94 #define FILE_DEVICE_SMB 0x0000002e
     95 #define FILE_DEVICE_KS 0x0000002f
     96 #define FILE_DEVICE_CHANGER 0x00000030
     97 #define FILE_DEVICE_SMARTCARD 0x00000031
     98 #define FILE_DEVICE_ACPI 0x00000032
     99 #define FILE_DEVICE_DVD 0x00000033
    100 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
    101 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
    102 #define FILE_DEVICE_DFS_VOLUME 0x00000036
    103 #define FILE_DEVICE_SERENUM 0x00000037
    104 #define FILE_DEVICE_TERMSRV 0x00000038
    105 #define FILE_DEVICE_KSEC 0x00000039
    106 #define FILE_DEVICE_FIPS 0x0000003A
    107 #define FILE_DEVICE_INFINIBAND 0x0000003B
    108 
    109 #define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
    110 
    111 #define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((DWORD)(ctrlCode & 0xffff0000)) >> 16)
    112 
    113 #define METHOD_BUFFERED 0
    114 #define METHOD_IN_DIRECT 1
    115 #define METHOD_OUT_DIRECT 2
    116 #define METHOD_NEITHER 3
    117 
    118 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
    119 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
    120 
    121 #define FILE_ANY_ACCESS 0
    122 #define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS)
    123 #define FILE_READ_ACCESS (0x0001)
    124 #define FILE_WRITE_ACCESS (0x0002)
    125 
    126 #endif /* _DEVIOCTL_ */
    127 
    128 
    129 #ifndef _NTDDSTOR_H_
    130 #define _NTDDSTOR_H_
    131 
    132 #ifdef __cplusplus
    133 extern "C" {
    134 #endif
    135 
    136 #define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
    137 
    138 #define IOCTL_STORAGE_CHECK_VERIFY CTL_CODE(IOCTL_STORAGE_BASE,0x0200,METHOD_BUFFERED,FILE_READ_ACCESS)
    139 #define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE,0x0200,METHOD_BUFFERED,FILE_ANY_ACCESS)
    140 #define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE,0x0201,METHOD_BUFFERED,FILE_READ_ACCESS)
    141 #define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE,0x0202,METHOD_BUFFERED,FILE_READ_ACCESS)
    142 #define IOCTL_STORAGE_LOAD_MEDIA CTL_CODE(IOCTL_STORAGE_BASE,0x0203,METHOD_BUFFERED,FILE_READ_ACCESS)
    143 #define IOCTL_STORAGE_LOAD_MEDIA2 CTL_CODE(IOCTL_STORAGE_BASE,0x0203,METHOD_BUFFERED,FILE_ANY_ACCESS)
    144 #define IOCTL_STORAGE_RESERVE CTL_CODE(IOCTL_STORAGE_BASE,0x0204,METHOD_BUFFERED,FILE_READ_ACCESS)
    145 #define IOCTL_STORAGE_RELEASE CTL_CODE(IOCTL_STORAGE_BASE,0x0205,METHOD_BUFFERED,FILE_READ_ACCESS)
    146 #define IOCTL_STORAGE_FIND_NEW_DEVICES CTL_CODE(IOCTL_STORAGE_BASE,0x0206,METHOD_BUFFERED,FILE_READ_ACCESS)
    147 
    148 #define IOCTL_STORAGE_EJECTION_CONTROL CTL_CODE(IOCTL_STORAGE_BASE,0x0250,METHOD_BUFFERED,FILE_ANY_ACCESS)
    149 #define IOCTL_STORAGE_MCN_CONTROL CTL_CODE(IOCTL_STORAGE_BASE,0x0251,METHOD_BUFFERED,FILE_ANY_ACCESS)
    150 
    151 #define IOCTL_STORAGE_GET_MEDIA_TYPES CTL_CODE(IOCTL_STORAGE_BASE,0x0300,METHOD_BUFFERED,FILE_ANY_ACCESS)
    152 #define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE,0x0301,METHOD_BUFFERED,FILE_ANY_ACCESS)
    153 #define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE,0x0304,METHOD_BUFFERED,FILE_ANY_ACCESS)
    154 #define IOCTL_STORAGE_GET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE,0x0305,METHOD_BUFFERED,FILE_ANY_ACCESS)
    155 #define IOCTL_STORAGE_SET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE,0x0306,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    156 
    157 #define IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE,0x0400,METHOD_BUFFERED,FILE_READ_ACCESS)
    158 #define IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS)
    159 #define IOCTL_STORAGE_BREAK_RESERVATION CTL_CODE(IOCTL_STORAGE_BASE,0x0405,METHOD_BUFFERED,FILE_READ_ACCESS)
    160 
    161 #define IOCTL_STORAGE_GET_DEVICE_NUMBER CTL_CODE(IOCTL_STORAGE_BASE,0x0420,METHOD_BUFFERED,FILE_ANY_ACCESS)
    162 #define IOCTL_STORAGE_PREDICT_FAILURE CTL_CODE(IOCTL_STORAGE_BASE,0x0440,METHOD_BUFFERED,FILE_ANY_ACCESS)
    163 #define IOCTL_STORAGE_READ_CAPACITY CTL_CODE(IOCTL_STORAGE_BASE,0x0450,METHOD_BUFFERED,FILE_READ_ACCESS)
    164 
    165 #define OBSOLETE_IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE,0x0400,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    166 #define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    167 
    168 #if (_WIN32_WINNT >= 0x0601)
    169 #define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES CTL_CODE(IOCTL_STORAGE_BASE, 0x0501, METHOD_BUFFERED, FILE_WRITE_ACCESS)
    170 #define DeviceDsmActionFlag_NonDestructive 0x80000000
    171 #define DeviceDsmAction_None 0
    172 #define DeviceDsmAction_Trim 1
    173 #define DeviceDsmAction_Notification (2 | DeviceDsmActionFlag_NonDestructive)
    174 
    175 #define IsDsmActionNonDestructive(x) ((BOOLEAN)(!!((x) & DeviceDsmActionFlag_NonDestructive)))
    176 
    177 #define DEVICE_DSM_FLAG_ENTIRE_DATA_SET_RANGE __MSABI_LONG(0x00000001)
    178 
    179 typedef DWORD DEVICE_DATA_MANAGEMENT_SET_ACTION;
    180 typedef struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES {
    181   DWORD                             Size;
    182   DEVICE_DATA_MANAGEMENT_SET_ACTION Action;
    183   DWORD                             Flags;
    184   DWORD                             ParameterBlockOffset;
    185   DWORD                             ParameterBlockLength;
    186   DWORD                             DataSetRangesOffset;
    187   DWORD                             DataSetRangesLength;
    188 } DEVICE_MANAGE_DATA_SET_ATTRIBUTES, *PDEVICE_MANAGE_DATA_SET_ATTRIBUTES;
    189 
    190 typedef struct _DEVICE_DATA_SET_RANGE {
    191   LONGLONG  StartingOffset;
    192   DWORDLONG LengthInBytes;
    193 } DEVICE_DATA_SET_RANGE, *PDEVICE_DATA_SET_RANGE;
    194 
    195 #endif /*(_WIN32_WINNT >= 0x0601)*/
    196 
    197   typedef struct _STORAGE_HOTPLUG_INFO {
    198     DWORD Size;
    199     BOOLEAN MediaRemovable;
    200     BOOLEAN MediaHotplug;
    201     BOOLEAN DeviceHotplug;
    202     BOOLEAN WriteCacheEnableOverride;
    203   } STORAGE_HOTPLUG_INFO,*PSTORAGE_HOTPLUG_INFO;
    204 
    205   typedef struct _STORAGE_DEVICE_NUMBER {
    206     DEVICE_TYPE DeviceType;
    207     DWORD DeviceNumber;
    208     DWORD PartitionNumber;
    209   } STORAGE_DEVICE_NUMBER,*PSTORAGE_DEVICE_NUMBER;
    210 
    211   typedef struct _STORAGE_BUS_RESET_REQUEST {
    212     BYTE PathId;
    213   } STORAGE_BUS_RESET_REQUEST,*PSTORAGE_BUS_RESET_REQUEST;
    214 
    215   typedef struct STORAGE_BREAK_RESERVATION_REQUEST {
    216     DWORD Length;
    217     BYTE _unused;
    218     BYTE PathId;
    219     BYTE TargetId;
    220     BYTE Lun;
    221   } STORAGE_BREAK_RESERVATION_REQUEST,*PSTORAGE_BREAK_RESERVATION_REQUEST;
    222 
    223   typedef struct _PREVENT_MEDIA_REMOVAL {
    224     BOOLEAN PreventMediaRemoval;
    225   } PREVENT_MEDIA_REMOVAL,*PPREVENT_MEDIA_REMOVAL;
    226 
    227   typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
    228     DWORD MediaChangeCount;
    229     DWORD NewState;
    230   } CLASS_MEDIA_CHANGE_CONTEXT,*PCLASS_MEDIA_CHANGE_CONTEXT;
    231 
    232   typedef struct _TAPE_STATISTICS {
    233     DWORD Version;
    234     DWORD Flags;
    235     LARGE_INTEGER RecoveredWrites;
    236     LARGE_INTEGER UnrecoveredWrites;
    237     LARGE_INTEGER RecoveredReads;
    238     LARGE_INTEGER UnrecoveredReads;
    239     BYTE CompressionRatioReads;
    240     BYTE CompressionRatioWrites;
    241   } TAPE_STATISTICS,*PTAPE_STATISTICS;
    242 
    243 #define RECOVERED_WRITES_VALID 0x00000001
    244 #define UNRECOVERED_WRITES_VALID 0x00000002
    245 #define RECOVERED_READS_VALID 0x00000004
    246 #define UNRECOVERED_READS_VALID 0x00000008
    247 #define WRITE_COMPRESSION_INFO_VALID 0x00000010
    248 #define READ_COMPRESSION_INFO_VALID 0x00000020
    249 
    250   typedef struct _TAPE_GET_STATISTICS {
    251     DWORD Operation;
    252   } TAPE_GET_STATISTICS,*PTAPE_GET_STATISTICS;
    253 
    254 #define TAPE_RETURN_STATISTICS __MSABI_LONG(0)
    255 #define TAPE_RETURN_ENV_INFO __MSABI_LONG(1)
    256 #define TAPE_RESET_STATISTICS __MSABI_LONG(2)
    257 
    258   typedef enum _STORAGE_MEDIA_TYPE {
    259     DDS_4mm	= 0x20,
    260     MiniQic,
    261     Travan,
    262     QIC,
    263     MP_8mm,
    264     AME_8mm,
    265     AIT1_8mm,
    266     DLT,
    267     NCTP,
    268     IBM_3480,
    269     IBM_3490E,
    270     IBM_Magstar_3590,
    271     IBM_Magstar_MP,
    272     STK_DATA_D3,
    273     SONY_DTF,
    274     DV_6mm,
    275     DMI,
    276     SONY_D2,
    277     CLEANER_CARTRIDGE,
    278     CD_ROM,
    279     CD_R,
    280     CD_RW,
    281     DVD_ROM,
    282     DVD_R,
    283     DVD_RW,
    284     MO_3_RW,
    285     MO_5_WO,
    286     MO_5_RW,
    287     MO_5_LIMDOW,
    288     PC_5_WO,
    289     PC_5_RW,
    290     PD_5_RW,
    291     ABL_5_WO,
    292     PINNACLE_APEX_5_RW,
    293     SONY_12_WO,
    294     PHILIPS_12_WO,
    295     HITACHI_12_WO,
    296     CYGNET_12_WO,
    297     KODAK_14_WO,
    298     MO_NFR_525,
    299     NIKON_12_RW,
    300     IOMEGA_ZIP,
    301     IOMEGA_JAZ,
    302     SYQUEST_EZ135,
    303     SYQUEST_EZFLYER,
    304     SYQUEST_SYJET,
    305     AVATAR_F2,
    306     MP2_8mm,
    307     DST_S,
    308     DST_M,
    309     DST_L,
    310     VXATape_1,
    311     VXATape_2,
    312     STK_9840,
    313     LTO_Ultrium,
    314     LTO_Accelis,
    315     DVD_RAM,
    316     AIT_8mm,
    317     ADR_1,
    318     ADR_2,
    319     STK_9940,
    320     SAIT,
    321     VXATape
    322   } STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
    323 
    324 #define MEDIA_ERASEABLE 0x00000001
    325 #define MEDIA_WRITE_ONCE 0x00000002
    326 #define MEDIA_READ_ONLY 0x00000004
    327 #define MEDIA_READ_WRITE 0x00000008
    328 
    329 #define MEDIA_WRITE_PROTECTED 0x00000100
    330 #define MEDIA_CURRENTLY_MOUNTED 0x80000000
    331 
    332   typedef enum _STORAGE_BUS_TYPE {
    333     BusTypeUnknown             = 0x00,
    334     BusTypeScsi                = 0x1,
    335     BusTypeAtapi               = 0x2,
    336     BusTypeAta                 = 0x3,
    337     BusType1394                = 0x4,
    338     BusTypeSsa                 = 0x5,
    339     BusTypeFibre               = 0x6,
    340     BusTypeUsb                 = 0x7,
    341     BusTypeRAID                = 0x8,
    342 #if (_WIN32_WINNT >= 0x0600)
    343     BusTypeiScsi               = 0x9,
    344     BusTypeSas                 = 0xA,
    345     BusTypeSata                = 0xB,
    346     BusTypeSd                  = 0xC,
    347     BusTypeMmc                 = 0xD,
    348 #endif /*(_WIN32_WINNT >= 0x0600)*/
    349 #if (_WIN32_WINNT >= 0x0601)
    350     BusTypeVirtual             = 0xE,
    351     BusTypeFileBackedVirtual   = 0xF,
    352 #endif /*(_WIN32_WINNT >= 0x0601)*/
    353     BusTypeMax,
    354     BusTypeMaxReserved         = 0x7F
    355   } STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
    356 
    357   typedef struct _DEVICE_MEDIA_INFO {
    358     union {
    359       struct {
    360 	LARGE_INTEGER Cylinders;
    361 	STORAGE_MEDIA_TYPE MediaType;
    362 	DWORD TracksPerCylinder;
    363 	DWORD SectorsPerTrack;
    364 	DWORD BytesPerSector;
    365 	DWORD NumberMediaSides;
    366 	DWORD MediaCharacteristics;
    367       } DiskInfo;
    368       struct {
    369 	LARGE_INTEGER Cylinders;
    370 	STORAGE_MEDIA_TYPE MediaType;
    371 	DWORD TracksPerCylinder;
    372 	DWORD SectorsPerTrack;
    373 	DWORD BytesPerSector;
    374 	DWORD NumberMediaSides;
    375 	DWORD MediaCharacteristics;
    376       } RemovableDiskInfo;
    377       struct {
    378 	STORAGE_MEDIA_TYPE MediaType;
    379 	DWORD MediaCharacteristics;
    380 	DWORD CurrentBlockSize;
    381 	STORAGE_BUS_TYPE BusType;
    382 	union {
    383 	  struct {
    384 	    BYTE MediumType;
    385 	    BYTE DensityCode;
    386 	  } ScsiInformation;
    387 	} BusSpecificData;
    388       } TapeInfo;
    389     } DeviceSpecific;
    390   } DEVICE_MEDIA_INFO,*PDEVICE_MEDIA_INFO;
    391 
    392   typedef struct _GET_MEDIA_TYPES {
    393     DWORD DeviceType;
    394     DWORD MediaInfoCount;
    395     DEVICE_MEDIA_INFO MediaInfo[1];
    396   } GET_MEDIA_TYPES,*PGET_MEDIA_TYPES;
    397 
    398   typedef struct _STORAGE_PREDICT_FAILURE {
    399     DWORD PredictFailure;
    400     BYTE VendorSpecific[512];
    401   } STORAGE_PREDICT_FAILURE,*PSTORAGE_PREDICT_FAILURE;
    402 
    403 #ifdef __cplusplus
    404 }
    405 #endif
    406 #endif /* _NTDDSTOR_H_ */
    407 
    408 
    409 #ifndef _NTDDDISK_H_
    410 #define _NTDDDISK_H_
    411 
    412 #define IOCTL_DISK_BASE FILE_DEVICE_DISK
    413 #define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE,0x0000,METHOD_BUFFERED,FILE_ANY_ACCESS)
    414 #define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,0x0001,METHOD_BUFFERED,FILE_READ_ACCESS)
    415 #define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,0x0002,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    416 #define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0003,METHOD_BUFFERED,FILE_READ_ACCESS)
    417 #define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0004,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    418 #define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x0005,METHOD_BUFFERED,FILE_ANY_ACCESS)
    419 #define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE,0x0006,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    420 #define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE,0x0007,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    421 #define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE,0x0008,METHOD_BUFFERED,FILE_ANY_ACCESS)
    422 #define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE,0x0009,METHOD_BUFFERED,FILE_ANY_ACCESS)
    423 #define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE,0x000a,METHOD_BUFFERED,FILE_ANY_ACCESS)
    424 #define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE,0x000b,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    425 #define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,0x000c,METHOD_BUFFERED,FILE_ANY_ACCESS)
    426 #define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE,0x000d,METHOD_BUFFERED,FILE_ANY_ACCESS)
    427 #define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE,0x000e,METHOD_BUFFERED,FILE_ANY_ACCESS)
    428 #define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,0x000f,METHOD_BUFFERED,FILE_ANY_ACCESS)
    429 #define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE,0x0010,METHOD_BUFFERED,FILE_ANY_ACCESS)
    430 #define IOCTL_DISK_PERFORMANCE_OFF CTL_CODE(IOCTL_DISK_BASE,0x0018,METHOD_BUFFERED,FILE_ANY_ACCESS)
    431 #define IOCTL_DISK_CONTROLLER_NUMBER CTL_CODE(IOCTL_DISK_BASE,0x0011,METHOD_BUFFERED,FILE_ANY_ACCESS)
    432 
    433 #define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE,0x0020,METHOD_BUFFERED,FILE_READ_ACCESS)
    434 #define SMART_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE,0x0021,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    435 #define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE,0x0022,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    436 
    437 #define IOCTL_DISK_GET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x0012,METHOD_BUFFERED,FILE_ANY_ACCESS)
    438 #define IOCTL_DISK_SET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x0013,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    439 #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x0014,METHOD_BUFFERED,FILE_ANY_ACCESS)
    440 #define IOCTL_DISK_SET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x0015,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    441 #define IOCTL_DISK_CREATE_DISK CTL_CODE(IOCTL_DISK_BASE,0x0016,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    442 #define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE,0x0017,METHOD_BUFFERED,FILE_READ_ACCESS)
    443 #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE,0x0028,METHOD_BUFFERED,FILE_ANY_ACCESS)
    444 
    445 #define IOCTL_DISK_REASSIGN_BLOCKS_EX CTL_CODE(IOCTL_DISK_BASE,0x0029,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    446 #define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE,0x0032,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    447 #define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE,0x0034,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    448 #define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x0035,METHOD_BUFFERED,FILE_READ_ACCESS)
    449 #define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x0036,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    450 #define OBSOLETE_DISK_GET_WRITE_CACHE_STATE CTL_CODE(IOCTL_DISK_BASE,0x0037,METHOD_BUFFERED,FILE_READ_ACCESS)
    451 #define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0040,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    452 #define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE,0x0050,METHOD_BUFFERED,FILE_ANY_ACCESS)
    453 #define IOCTL_DISK_RESET_SNAPSHOT_INFO CTL_CODE(IOCTL_DISK_BASE,0x0084,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    454 #define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE,0x00f3,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    455 #define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE,0x00f8,METHOD_BUFFERED,FILE_ANY_ACCESS)
    456 #define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x0200,METHOD_BUFFERED,FILE_READ_ACCESS)
    457 #define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE,0x0201,METHOD_BUFFERED,FILE_READ_ACCESS)
    458 #define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x0202,METHOD_BUFFERED,FILE_READ_ACCESS)
    459 #define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x0203,METHOD_BUFFERED,FILE_READ_ACCESS)
    460 #define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE,0x0204,METHOD_BUFFERED,FILE_READ_ACCESS)
    461 #define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE,0x0205,METHOD_BUFFERED,FILE_READ_ACCESS)
    462 #define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE,0x0206,METHOD_BUFFERED,FILE_READ_ACCESS)
    463 #define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE,0x0300,METHOD_BUFFERED,FILE_ANY_ACCESS)
    464 #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
    465 
    466 #define PARTITION_ENTRY_UNUSED 0x00
    467 #define PARTITION_FAT_12 0x01
    468 #define PARTITION_XENIX_1 0x02
    469 #define PARTITION_XENIX_2 0x03
    470 #define PARTITION_FAT_16 0x04
    471 #define PARTITION_EXTENDED 0x05
    472 #define PARTITION_HUGE 0x06
    473 #define PARTITION_IFS 0x07
    474 #define PARTITION_OS2BOOTMGR 0x0A
    475 #define PARTITION_FAT32 0x0B
    476 #define PARTITION_FAT32_XINT13 0x0C
    477 #define PARTITION_XINT13 0x0E
    478 #define PARTITION_XINT13_EXTENDED 0x0F
    479 #define PARTITION_PREP 0x41
    480 #define PARTITION_LDM 0x42
    481 #define PARTITION_UNIX 0x63
    482 
    483 #define VALID_NTFT 0xC0
    484 
    485 #define PARTITION_NTFT 0x80
    486 
    487 #define IsRecognizedPartition(PartitionType) (((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_FAT_12)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_IFS)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_HUGE)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_FAT32)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_FAT32_XINT13)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_XINT13)) || ((PartitionType)==PARTITION_FAT_12) || ((PartitionType)==PARTITION_FAT_16) || ((PartitionType)==PARTITION_IFS) || ((PartitionType)==PARTITION_HUGE) || ((PartitionType)==PARTITION_FAT32) || ((PartitionType)==PARTITION_FAT32_XINT13) || ((PartitionType)==PARTITION_XINT13))
    488 #define IsContainerPartition(PartitionType) ((PartitionType==PARTITION_EXTENDED) || (PartitionType==PARTITION_XINT13_EXTENDED))
    489 #define IsFTPartition(PartitionType) (((PartitionType)&PARTITION_NTFT) && IsRecognizedPartition(PartitionType))
    490 
    491 typedef enum _MEDIA_TYPE {
    492   Unknown,F5_1Pt2_512,F3_1Pt44_512,F3_2Pt88_512,F3_20Pt8_512,F3_720_512,F5_360_512,F5_320_512,F5_320_1024,F5_180_512,F5_160_512,
    493   RemovableMedia,FixedMedia,F3_120M_512,F3_640_512,F5_640_512,F5_720_512,F3_1Pt2_512,F3_1Pt23_1024,F5_1Pt23_1024,F3_128Mb_512,
    494   F3_230Mb_512,F8_256_128,F3_200Mb_512,F3_240M_512,F3_32M_512
    495 } MEDIA_TYPE,*PMEDIA_TYPE;
    496 
    497 typedef struct _FORMAT_PARAMETERS {
    498   MEDIA_TYPE MediaType;
    499   DWORD StartCylinderNumber;
    500   DWORD EndCylinderNumber;
    501   DWORD StartHeadNumber;
    502   DWORD EndHeadNumber;
    503 } FORMAT_PARAMETERS,*PFORMAT_PARAMETERS;
    504 
    505 typedef WORD BAD_TRACK_NUMBER;
    506 typedef WORD *PBAD_TRACK_NUMBER;
    507 
    508 typedef struct _FORMAT_EX_PARAMETERS {
    509   MEDIA_TYPE MediaType;
    510   DWORD StartCylinderNumber;
    511   DWORD EndCylinderNumber;
    512   DWORD StartHeadNumber;
    513   DWORD EndHeadNumber;
    514   WORD FormatGapLength;
    515   WORD SectorsPerTrack;
    516   WORD SectorNumber[1];
    517 } FORMAT_EX_PARAMETERS,*PFORMAT_EX_PARAMETERS;
    518 
    519 typedef struct _DISK_GEOMETRY {
    520   LARGE_INTEGER Cylinders;
    521   MEDIA_TYPE MediaType;
    522   DWORD TracksPerCylinder;
    523   DWORD SectorsPerTrack;
    524   DWORD BytesPerSector;
    525 } DISK_GEOMETRY,*PDISK_GEOMETRY;
    526 
    527 #define WMI_DISK_GEOMETRY_GUID { 0x25007f51,0x57c2,0x11d1,{ 0xa5,0x28,0x0,0xa0,0xc9,0x6,0x29,0x10 } }
    528 
    529 typedef struct _PARTITION_INFORMATION {
    530   LARGE_INTEGER StartingOffset;
    531   LARGE_INTEGER PartitionLength;
    532   DWORD HiddenSectors;
    533   DWORD PartitionNumber;
    534   BYTE PartitionType;
    535   BOOLEAN BootIndicator;
    536   BOOLEAN RecognizedPartition;
    537   BOOLEAN RewritePartition;
    538 } PARTITION_INFORMATION,*PPARTITION_INFORMATION;
    539 
    540 typedef struct _SET_PARTITION_INFORMATION {
    541   BYTE PartitionType;
    542 } SET_PARTITION_INFORMATION,*PSET_PARTITION_INFORMATION;
    543 
    544 typedef struct _DRIVE_LAYOUT_INFORMATION {
    545   DWORD PartitionCount;
    546   DWORD Signature;
    547   PARTITION_INFORMATION PartitionEntry[1];
    548 } DRIVE_LAYOUT_INFORMATION,*PDRIVE_LAYOUT_INFORMATION;
    549 
    550 typedef struct _VERIFY_INFORMATION {
    551   LARGE_INTEGER StartingOffset;
    552   DWORD Length;
    553 } VERIFY_INFORMATION,*PVERIFY_INFORMATION;
    554 
    555 typedef struct _REASSIGN_BLOCKS {
    556   WORD Reserved;
    557   WORD Count;
    558   DWORD BlockNumber[1];
    559 } REASSIGN_BLOCKS,*PREASSIGN_BLOCKS;
    560 
    561 #include <pshpack1.h>
    562 typedef struct _REASSIGN_BLOCKS_EX {
    563   WORD Reserved;
    564   WORD Count;
    565   LARGE_INTEGER BlockNumber[1];
    566 } REASSIGN_BLOCKS_EX,*PREASSIGN_BLOCKS_EX;
    567 #include <poppack.h>
    568 
    569 typedef enum _PARTITION_STYLE {
    570   PARTITION_STYLE_MBR,PARTITION_STYLE_GPT,PARTITION_STYLE_RAW
    571 } PARTITION_STYLE;
    572 
    573 typedef struct _PARTITION_INFORMATION_GPT {
    574   GUID PartitionType;
    575   GUID PartitionId;
    576   DWORD64 Attributes;
    577   WCHAR Name [36];
    578 } PARTITION_INFORMATION_GPT,*PPARTITION_INFORMATION_GPT;
    579 
    580 #define GPT_ATTRIBUTE_PLATFORM_REQUIRED (0x0000000000000001)
    581 
    582 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER (0x8000000000000000)
    583 #define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN (0x4000000000000000)
    584 #define GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY (0x2000000000000000)
    585 #define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY (0x1000000000000000)
    586 
    587 typedef struct _PARTITION_INFORMATION_MBR {
    588   BYTE PartitionType;
    589   BOOLEAN BootIndicator;
    590   BOOLEAN RecognizedPartition;
    591   DWORD HiddenSectors;
    592 } PARTITION_INFORMATION_MBR,*PPARTITION_INFORMATION_MBR;
    593 
    594 typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
    595 typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
    596 
    597 typedef struct _SET_PARTITION_INFORMATION_EX {
    598   PARTITION_STYLE PartitionStyle;
    599   __C89_NAMELESS union {
    600     SET_PARTITION_INFORMATION_MBR Mbr;
    601     SET_PARTITION_INFORMATION_GPT Gpt;
    602   } DUMMYUNIONNAME;
    603 } SET_PARTITION_INFORMATION_EX,*PSET_PARTITION_INFORMATION_EX;
    604 
    605 typedef struct _CREATE_DISK_GPT {
    606   GUID DiskId;
    607   DWORD MaxPartitionCount;
    608 } CREATE_DISK_GPT,*PCREATE_DISK_GPT;
    609 
    610 typedef struct _CREATE_DISK_MBR {
    611   DWORD Signature;
    612 } CREATE_DISK_MBR,*PCREATE_DISK_MBR;
    613 
    614 typedef struct _CREATE_DISK {
    615   PARTITION_STYLE PartitionStyle;
    616   __C89_NAMELESS union {
    617     CREATE_DISK_MBR Mbr;
    618     CREATE_DISK_GPT Gpt;
    619   } DUMMYUNIONNAME;
    620 } CREATE_DISK,*PCREATE_DISK;
    621 
    622 typedef struct _GET_LENGTH_INFORMATION {
    623   LARGE_INTEGER Length;
    624 } GET_LENGTH_INFORMATION,*PGET_LENGTH_INFORMATION;
    625 
    626 typedef struct _PARTITION_INFORMATION_EX {
    627   PARTITION_STYLE PartitionStyle;
    628   LARGE_INTEGER StartingOffset;
    629   LARGE_INTEGER PartitionLength;
    630   DWORD PartitionNumber;
    631   BOOLEAN RewritePartition;
    632   __C89_NAMELESS union {
    633     PARTITION_INFORMATION_MBR Mbr;
    634     PARTITION_INFORMATION_GPT Gpt;
    635   } DUMMYUNIONNAME;
    636 } PARTITION_INFORMATION_EX,*PPARTITION_INFORMATION_EX;
    637 
    638 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
    639   GUID DiskId;
    640   LARGE_INTEGER StartingUsableOffset;
    641   LARGE_INTEGER UsableLength;
    642   DWORD MaxPartitionCount;
    643 } DRIVE_LAYOUT_INFORMATION_GPT,*PDRIVE_LAYOUT_INFORMATION_GPT;
    644 
    645 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
    646   DWORD Signature;
    647 } DRIVE_LAYOUT_INFORMATION_MBR,*PDRIVE_LAYOUT_INFORMATION_MBR;
    648 
    649 typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
    650   DWORD PartitionStyle;
    651   DWORD PartitionCount;
    652   __C89_NAMELESS union {
    653     DRIVE_LAYOUT_INFORMATION_MBR Mbr;
    654     DRIVE_LAYOUT_INFORMATION_GPT Gpt;
    655   } DUMMYUNIONNAME;
    656   PARTITION_INFORMATION_EX PartitionEntry[1];
    657 } DRIVE_LAYOUT_INFORMATION_EX,*PDRIVE_LAYOUT_INFORMATION_EX;
    658 
    659 typedef enum _DETECTION_TYPE {
    660   DetectNone,DetectInt13,DetectExInt13
    661 } DETECTION_TYPE;
    662 
    663 typedef struct _DISK_INT13_INFO {
    664   WORD DriveSelect;
    665   DWORD MaxCylinders;
    666   WORD SectorsPerTrack;
    667   WORD MaxHeads;
    668   WORD NumberDrives;
    669 } DISK_INT13_INFO,*PDISK_INT13_INFO;
    670 
    671 typedef struct _DISK_EX_INT13_INFO {
    672   WORD ExBufferSize;
    673   WORD ExFlags;
    674   DWORD ExCylinders;
    675   DWORD ExHeads;
    676   DWORD ExSectorsPerTrack;
    677   DWORD64 ExSectorsPerDrive;
    678   WORD ExSectorSize;
    679   WORD ExReserved;
    680 } DISK_EX_INT13_INFO,*PDISK_EX_INT13_INFO;
    681 
    682 typedef struct _DISK_DETECTION_INFO {
    683   DWORD SizeOfDetectInfo;
    684   DETECTION_TYPE DetectionType;
    685   __C89_NAMELESS union {
    686     __C89_NAMELESS struct {
    687       DISK_INT13_INFO Int13;
    688       DISK_EX_INT13_INFO ExInt13;
    689     } DUMMYSTRUCTNAME;
    690   } DUMMYUNIONNAME;
    691 } DISK_DETECTION_INFO,*PDISK_DETECTION_INFO;
    692 
    693 typedef struct _DISK_PARTITION_INFO {
    694   DWORD SizeOfPartitionInfo;
    695   PARTITION_STYLE PartitionStyle;
    696   __C89_NAMELESS union {
    697     struct {
    698       DWORD Signature;
    699       DWORD CheckSum;
    700     } Mbr;
    701     struct {
    702       GUID DiskId;
    703     } Gpt;
    704   } DUMMYUNIONNAME;
    705 } DISK_PARTITION_INFO,*PDISK_PARTITION_INFO;
    706 
    707 #define DiskGeometryGetPartition(Geometry) ((PDISK_PARTITION_INFO)((Geometry)->Data))
    708 #define DiskGeometryGetDetect(Geometry) ((PDISK_DETECTION_INFO)(((DWORD_PTR)DiskGeometryGetPartition(Geometry)+ DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
    709 
    710 typedef struct _DISK_GEOMETRY_EX {
    711   DISK_GEOMETRY Geometry;
    712   LARGE_INTEGER DiskSize;
    713   BYTE Data[1];
    714 } DISK_GEOMETRY_EX,*PDISK_GEOMETRY_EX;
    715 
    716 typedef struct _DISK_CONTROLLER_NUMBER {
    717   DWORD ControllerNumber;
    718   DWORD DiskNumber;
    719 } DISK_CONTROLLER_NUMBER,*PDISK_CONTROLLER_NUMBER;
    720 
    721 typedef enum {
    722   EqualPriority,KeepPrefetchedData,KeepReadData
    723 } DISK_CACHE_RETENTION_PRIORITY;
    724 
    725 typedef struct _DISK_CACHE_INFORMATION {
    726   BOOLEAN ParametersSavable;
    727   BOOLEAN ReadCacheEnabled;
    728   BOOLEAN WriteCacheEnabled;
    729   DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
    730   DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
    731   WORD DisablePrefetchTransferLength;
    732   BOOLEAN PrefetchScalar;
    733   __C89_NAMELESS union {
    734     struct {
    735       WORD Minimum;
    736       WORD Maximum;
    737       WORD MaximumBlocks;
    738     } ScalarPrefetch;
    739     struct {
    740       WORD Minimum;
    741       WORD Maximum;
    742     } BlockPrefetch;
    743   } DUMMYUNIONNAME;
    744 } DISK_CACHE_INFORMATION,*PDISK_CACHE_INFORMATION;
    745 
    746 typedef struct _DISK_GROW_PARTITION {
    747   DWORD PartitionNumber;
    748   LARGE_INTEGER BytesToGrow;
    749 } DISK_GROW_PARTITION,*PDISK_GROW_PARTITION;
    750 
    751 #define HIST_NO_OF_BUCKETS 24
    752 
    753 typedef struct _HISTOGRAM_BUCKET {
    754   DWORD Reads;
    755   DWORD Writes;
    756 } HISTOGRAM_BUCKET,*PHISTOGRAM_BUCKET;
    757 
    758 #define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET)
    759 
    760 typedef struct _DISK_HISTOGRAM {
    761   LARGE_INTEGER DiskSize;
    762   LARGE_INTEGER Start;
    763   LARGE_INTEGER End;
    764   LARGE_INTEGER Average;
    765   LARGE_INTEGER AverageRead;
    766   LARGE_INTEGER AverageWrite;
    767   DWORD Granularity;
    768   DWORD Size;
    769   DWORD ReadCount;
    770   DWORD WriteCount;
    771   PHISTOGRAM_BUCKET Histogram;
    772 } DISK_HISTOGRAM,*PDISK_HISTOGRAM;
    773 
    774 #define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM)
    775 
    776 typedef struct _DISK_PERFORMANCE {
    777   LARGE_INTEGER BytesRead;
    778   LARGE_INTEGER BytesWritten;
    779   LARGE_INTEGER ReadTime;
    780   LARGE_INTEGER WriteTime;
    781   LARGE_INTEGER IdleTime;
    782   DWORD ReadCount;
    783   DWORD WriteCount;
    784   DWORD QueueDepth;
    785   DWORD SplitCount;
    786   LARGE_INTEGER QueryTime;
    787   DWORD StorageDeviceNumber;
    788   WCHAR StorageManagerName[8];
    789 } DISK_PERFORMANCE,*PDISK_PERFORMANCE;
    790 
    791 typedef struct _DISK_RECORD {
    792   LARGE_INTEGER ByteOffset;
    793   LARGE_INTEGER StartTime;
    794   LARGE_INTEGER EndTime;
    795   PVOID VirtualAddress;
    796   DWORD NumberOfBytes;
    797   BYTE DeviceNumber;
    798   BOOLEAN ReadRequest;
    799 } DISK_RECORD,*PDISK_RECORD;
    800 
    801 typedef struct _DISK_LOGGING {
    802   BYTE Function;
    803   PVOID BufferAddress;
    804   DWORD BufferSize;
    805 } DISK_LOGGING,*PDISK_LOGGING;
    806 
    807 #define DISK_LOGGING_START 0
    808 #define DISK_LOGGING_STOP 1
    809 #define DISK_LOGGING_DUMP 2
    810 #define DISK_BINNING 3
    811 
    812 typedef enum _BIN_TYPES {
    813   RequestSize,RequestLocation
    814 } BIN_TYPES;
    815 
    816 typedef struct _BIN_RANGE {
    817   LARGE_INTEGER StartValue;
    818   LARGE_INTEGER Length;
    819 } BIN_RANGE,*PBIN_RANGE;
    820 
    821 typedef struct _PERF_BIN {
    822   DWORD NumberOfBins;
    823   DWORD TypeOfBin;
    824   BIN_RANGE BinsRanges[1];
    825 } PERF_BIN,*PPERF_BIN;
    826 
    827 typedef struct _BIN_COUNT {
    828   BIN_RANGE BinRange;
    829   DWORD BinCount;
    830 } BIN_COUNT,*PBIN_COUNT;
    831 
    832 typedef struct _BIN_RESULTS {
    833   DWORD NumberOfBins;
    834   BIN_COUNT BinCounts[1];
    835 } BIN_RESULTS,*PBIN_RESULTS;
    836 
    837 #include <pshpack1.h>
    838 typedef struct _GETVERSIONINPARAMS {
    839   BYTE bVersion;
    840   BYTE bRevision;
    841   BYTE bReserved;
    842   BYTE bIDEDeviceMap;
    843   DWORD fCapabilities;
    844   DWORD dwReserved[4];
    845 } GETVERSIONINPARAMS,*PGETVERSIONINPARAMS,*LPGETVERSIONINPARAMS;
    846 #include <poppack.h>
    847 
    848 #define CAP_ATA_ID_CMD 1
    849 #define CAP_ATAPI_ID_CMD 2
    850 #define CAP_SMART_CMD 4
    851 
    852 #include <pshpack1.h>
    853 typedef struct _IDEREGS {
    854   BYTE bFeaturesReg;
    855   BYTE bSectorCountReg;
    856   BYTE bSectorNumberReg;
    857   BYTE bCylLowReg;
    858   BYTE bCylHighReg;
    859   BYTE bDriveHeadReg;
    860   BYTE bCommandReg;
    861   BYTE bReserved;
    862 } IDEREGS,*PIDEREGS,*LPIDEREGS;
    863 #include <poppack.h>
    864 
    865 #define ATAPI_ID_CMD 0xA1
    866 #define ID_CMD 0xEC
    867 #define SMART_CMD 0xB0
    868 
    869 #define SMART_CYL_LOW 0x4F
    870 #define SMART_CYL_HI 0xC2
    871 
    872 #include <pshpack1.h>
    873 typedef struct _SENDCMDINPARAMS {
    874   DWORD cBufferSize;
    875   IDEREGS irDriveRegs;
    876   BYTE bDriveNumber;
    877   BYTE bReserved[3];
    878   DWORD dwReserved[4];
    879   BYTE bBuffer[1];
    880 } SENDCMDINPARAMS,*PSENDCMDINPARAMS,*LPSENDCMDINPARAMS;
    881 #include <poppack.h>
    882 
    883 #include <pshpack1.h>
    884 typedef struct _DRIVERSTATUS {
    885   BYTE bDriverError;
    886   BYTE bIDEError;
    887   BYTE bReserved[2];
    888   DWORD dwReserved[2];
    889 } DRIVERSTATUS,*PDRIVERSTATUS,*LPDRIVERSTATUS;
    890 #include <poppack.h>
    891 
    892 #define SMART_NO_ERROR 0
    893 #define SMART_IDE_ERROR 1
    894 #define SMART_INVALID_FLAG 2
    895 #define SMART_INVALID_COMMAND 3
    896 #define SMART_INVALID_BUFFER 4
    897 #define SMART_INVALID_DRIVE 5
    898 #define SMART_INVALID_IOCTL 6
    899 #define SMART_ERROR_NO_MEM 7
    900 #define SMART_INVALID_REGISTER 8
    901 #define SMART_NOT_SUPPORTED 9
    902 #define SMART_NO_IDE_DEVICE 10
    903 
    904 #define SMART_OFFLINE_ROUTINE_OFFLINE 0
    905 #define SMART_SHORT_SELFTEST_OFFLINE 1
    906 #define SMART_EXTENDED_SELFTEST_OFFLINE 2
    907 #define SMART_ABORT_OFFLINE_SELFTEST 127
    908 #define SMART_SHORT_SELFTEST_CAPTIVE 129
    909 #define SMART_EXTENDED_SELFTEST_CAPTIVE 130
    910 
    911 #include <pshpack1.h>
    912 typedef struct _SENDCMDOUTPARAMS {
    913   DWORD cBufferSize;
    914   DRIVERSTATUS DriverStatus;
    915   BYTE bBuffer[1];
    916 } SENDCMDOUTPARAMS,*PSENDCMDOUTPARAMS,*LPSENDCMDOUTPARAMS;
    917 #include <poppack.h>
    918 
    919 #define READ_ATTRIBUTE_BUFFER_SIZE 512
    920 #define IDENTIFY_BUFFER_SIZE 512
    921 #define READ_THRESHOLD_BUFFER_SIZE 512
    922 #define SMART_LOG_SECTOR_SIZE 512
    923 
    924 #define READ_ATTRIBUTES 0xD0
    925 #define READ_THRESHOLDS 0xD1
    926 #define ENABLE_DISABLE_AUTOSAVE 0xD2
    927 #define SAVE_ATTRIBUTE_VALUES 0xD3
    928 #define EXECUTE_OFFLINE_DIAGS 0xD4
    929 #define SMART_READ_LOG 0xD5
    930 #define SMART_WRITE_LOG 0xd6
    931 #define ENABLE_SMART 0xD8
    932 #define DISABLE_SMART 0xD9
    933 #define RETURN_SMART_STATUS 0xDA
    934 #define ENABLE_DISABLE_AUTO_OFFLINE 0xDB
    935 
    936 #endif /* _NTDDDISK_H_ */
    937 
    938 
    939 #define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER
    940 #define IOCTL_CHANGER_GET_PARAMETERS CTL_CODE(IOCTL_CHANGER_BASE,0x0000,METHOD_BUFFERED,FILE_READ_ACCESS)
    941 #define IOCTL_CHANGER_GET_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0001,METHOD_BUFFERED,FILE_READ_ACCESS)
    942 #define IOCTL_CHANGER_GET_PRODUCT_DATA CTL_CODE(IOCTL_CHANGER_BASE,0x0002,METHOD_BUFFERED,FILE_READ_ACCESS)
    943 #define IOCTL_CHANGER_SET_ACCESS CTL_CODE(IOCTL_CHANGER_BASE,0x0004,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    944 #define IOCTL_CHANGER_GET_ELEMENT_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0005,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    945 #define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0006,METHOD_BUFFERED,FILE_READ_ACCESS)
    946 #define IOCTL_CHANGER_SET_POSITION CTL_CODE(IOCTL_CHANGER_BASE,0x0007,METHOD_BUFFERED,FILE_READ_ACCESS)
    947 #define IOCTL_CHANGER_EXCHANGE_MEDIUM CTL_CODE(IOCTL_CHANGER_BASE,0x0008,METHOD_BUFFERED,FILE_READ_ACCESS)
    948 #define IOCTL_CHANGER_MOVE_MEDIUM CTL_CODE(IOCTL_CHANGER_BASE,0x0009,METHOD_BUFFERED,FILE_READ_ACCESS)
    949 #define IOCTL_CHANGER_REINITIALIZE_TRANSPORT CTL_CODE(IOCTL_CHANGER_BASE,0x000A,METHOD_BUFFERED,FILE_READ_ACCESS)
    950 #define IOCTL_CHANGER_QUERY_VOLUME_TAGS CTL_CODE(IOCTL_CHANGER_BASE,0x000B,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    951 
    952 #define MAX_VOLUME_ID_SIZE 36
    953 #define MAX_VOLUME_TEMPLATE_SIZE 40
    954 
    955 #define VENDOR_ID_LENGTH 8
    956 #define PRODUCT_ID_LENGTH 16
    957 #define REVISION_LENGTH 4
    958 #define SERIAL_NUMBER_LENGTH 32
    959 
    960 typedef enum _ELEMENT_TYPE {
    961   AllElements,ChangerTransport,ChangerSlot,ChangerIEPort,ChangerDrive,ChangerDoor,ChangerKeypad,ChangerMaxElement
    962 } ELEMENT_TYPE,*PELEMENT_TYPE;
    963 
    964 typedef struct _CHANGER_ELEMENT {
    965   ELEMENT_TYPE ElementType;
    966   DWORD ElementAddress;
    967 } CHANGER_ELEMENT,*PCHANGER_ELEMENT;
    968 
    969 typedef struct _CHANGER_ELEMENT_LIST {
    970   CHANGER_ELEMENT Element;
    971   DWORD NumberOfElements;
    972 } CHANGER_ELEMENT_LIST ,*PCHANGER_ELEMENT_LIST;
    973 
    974 #define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001
    975 #define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002
    976 #define CHANGER_CLOSE_IEPORT 0x00000004
    977 #define CHANGER_OPEN_IEPORT 0x00000008
    978 
    979 #define CHANGER_STATUS_NON_VOLATILE 0x00000010
    980 #define CHANGER_EXCHANGE_MEDIA 0x00000020
    981 #define CHANGER_CLEANER_SLOT 0x00000040
    982 #define CHANGER_LOCK_UNLOCK 0x00000080
    983 
    984 #define CHANGER_CARTRIDGE_MAGAZINE 0x00000100
    985 #define CHANGER_MEDIUM_FLIP 0x00000200
    986 #define CHANGER_POSITION_TO_ELEMENT 0x00000400
    987 #define CHANGER_REPORT_IEPORT_STATE 0x00000800
    988 
    989 #define CHANGER_STORAGE_DRIVE 0x00001000
    990 #define CHANGER_STORAGE_IEPORT 0x00002000
    991 #define CHANGER_STORAGE_SLOT 0x00004000
    992 #define CHANGER_STORAGE_TRANSPORT 0x00008000
    993 
    994 #define CHANGER_DRIVE_CLEANING_REQUIRED 0x00010000
    995 
    996 #define CHANGER_PREDISMOUNT_EJECT_REQUIRED 0x00020000
    997 
    998 #define CHANGER_CLEANER_ACCESS_NOT_VALID 0x00040000
    999 #define CHANGER_PREMOUNT_EJECT_REQUIRED 0x00080000
   1000 
   1001 #define CHANGER_VOLUME_IDENTIFICATION 0x00100000
   1002 #define CHANGER_VOLUME_SEARCH 0x00200000
   1003 #define CHANGER_VOLUME_ASSERT 0x00400000
   1004 #define CHANGER_VOLUME_REPLACE 0x00800000
   1005 #define CHANGER_VOLUME_UNDEFINE 0x01000000
   1006 
   1007 #define CHANGER_SERIAL_NUMBER_VALID 0x04000000
   1008 
   1009 #define CHANGER_DEVICE_REINITIALIZE_CAPABLE 0x08000000
   1010 #define CHANGER_KEYPAD_ENABLE_DISABLE 0x10000000
   1011 #define CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS 0x20000000
   1012 
   1013 #define CHANGER_RESERVED_BIT 0x80000000
   1014 
   1015 #define CHANGER_PREDISMOUNT_ALIGN_TO_SLOT 0x80000001
   1016 #define CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE 0x80000002
   1017 #define CHANGER_CLEANER_AUTODISMOUNT 0x80000004
   1018 #define CHANGER_TRUE_EXCHANGE_CAPABLE 0x80000008
   1019 #define CHANGER_SLOTS_USE_TRAYS 0x80000010
   1020 #define CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR 0x80000020
   1021 #define CHANGER_CLEANER_OPS_NOT_SUPPORTED 0x80000040
   1022 #define CHANGER_IEPORT_USER_CONTROL_OPEN 0x80000080
   1023 #define CHANGER_IEPORT_USER_CONTROL_CLOSE 0x80000100
   1024 #define CHANGER_MOVE_EXTENDS_IEPORT 0x80000200
   1025 #define CHANGER_MOVE_RETRACTS_IEPORT 0x80000400
   1026 
   1027 #define CHANGER_TO_TRANSPORT 0x01
   1028 #define CHANGER_TO_SLOT 0x02
   1029 #define CHANGER_TO_IEPORT 0x04
   1030 #define CHANGER_TO_DRIVE 0x08
   1031 
   1032 #define LOCK_UNLOCK_IEPORT 0x01
   1033 #define LOCK_UNLOCK_DOOR 0x02
   1034 #define LOCK_UNLOCK_KEYPAD 0x04
   1035 
   1036 typedef struct _GET_CHANGER_PARAMETERS {
   1037   DWORD Size;
   1038   WORD NumberTransportElements;
   1039   WORD NumberStorageElements;
   1040   WORD NumberCleanerSlots;
   1041   WORD NumberIEElements;
   1042   WORD NumberDataTransferElements;
   1043   WORD NumberOfDoors;
   1044   WORD FirstSlotNumber;
   1045   WORD FirstDriveNumber;
   1046   WORD FirstTransportNumber;
   1047   WORD FirstIEPortNumber;
   1048   WORD FirstCleanerSlotAddress;
   1049   WORD MagazineSize;
   1050   DWORD DriveCleanTimeout;
   1051   DWORD Features0;
   1052   DWORD Features1;
   1053   BYTE MoveFromTransport;
   1054   BYTE MoveFromSlot;
   1055   BYTE MoveFromIePort;
   1056   BYTE MoveFromDrive;
   1057   BYTE ExchangeFromTransport;
   1058   BYTE ExchangeFromSlot;
   1059   BYTE ExchangeFromIePort;
   1060   BYTE ExchangeFromDrive;
   1061   BYTE LockUnlockCapabilities;
   1062   BYTE PositionCapabilities;
   1063   BYTE Reserved1[2];
   1064   DWORD Reserved2[2];
   1065 } GET_CHANGER_PARAMETERS,*PGET_CHANGER_PARAMETERS;
   1066 
   1067 typedef struct _CHANGER_PRODUCT_DATA {
   1068   BYTE VendorId[VENDOR_ID_LENGTH];
   1069   BYTE ProductId[PRODUCT_ID_LENGTH];
   1070   BYTE Revision[REVISION_LENGTH];
   1071   BYTE SerialNumber[SERIAL_NUMBER_LENGTH];
   1072   BYTE DeviceType;
   1073 } CHANGER_PRODUCT_DATA,*PCHANGER_PRODUCT_DATA;
   1074 
   1075 #define LOCK_ELEMENT 0
   1076 #define UNLOCK_ELEMENT 1
   1077 #define EXTEND_IEPORT 2
   1078 #define RETRACT_IEPORT 3
   1079 
   1080 typedef struct _CHANGER_SET_ACCESS {
   1081   CHANGER_ELEMENT Element;
   1082   DWORD Control;
   1083 } CHANGER_SET_ACCESS,*PCHANGER_SET_ACCESS;
   1084 
   1085 typedef struct _CHANGER_READ_ELEMENT_STATUS {
   1086   CHANGER_ELEMENT_LIST ElementList;
   1087   BOOLEAN VolumeTagInfo;
   1088 } CHANGER_READ_ELEMENT_STATUS,*PCHANGER_READ_ELEMENT_STATUS;
   1089 
   1090 typedef struct _CHANGER_ELEMENT_STATUS {
   1091   CHANGER_ELEMENT Element;
   1092   CHANGER_ELEMENT SrcElementAddress;
   1093   DWORD Flags;
   1094   DWORD ExceptionCode;
   1095   BYTE TargetId;
   1096   BYTE Lun;
   1097   WORD Reserved;
   1098   BYTE PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
   1099   BYTE AlternateVolumeID[MAX_VOLUME_ID_SIZE];
   1100 } CHANGER_ELEMENT_STATUS,*PCHANGER_ELEMENT_STATUS;
   1101 
   1102 typedef struct _CHANGER_ELEMENT_STATUS_EX {
   1103   CHANGER_ELEMENT Element;
   1104   CHANGER_ELEMENT SrcElementAddress;
   1105   DWORD Flags;
   1106   DWORD ExceptionCode;
   1107   BYTE TargetId;
   1108   BYTE Lun;
   1109   WORD Reserved;
   1110   BYTE PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
   1111   BYTE AlternateVolumeID[MAX_VOLUME_ID_SIZE];
   1112   BYTE VendorIdentification[VENDOR_ID_LENGTH];
   1113   BYTE ProductIdentification[PRODUCT_ID_LENGTH];
   1114   BYTE SerialNumber[SERIAL_NUMBER_LENGTH];
   1115 } CHANGER_ELEMENT_STATUS_EX,*PCHANGER_ELEMENT_STATUS_EX;
   1116 
   1117 #define ELEMENT_STATUS_FULL 0x00000001
   1118 #define ELEMENT_STATUS_IMPEXP 0x00000002
   1119 #define ELEMENT_STATUS_EXCEPT 0x00000004
   1120 #define ELEMENT_STATUS_ACCESS 0x00000008
   1121 #define ELEMENT_STATUS_EXENAB 0x00000010
   1122 #define ELEMENT_STATUS_INENAB 0x00000020
   1123 
   1124 #define ELEMENT_STATUS_PRODUCT_DATA 0x00000040
   1125 
   1126 #define ELEMENT_STATUS_LUN_VALID 0x00001000
   1127 #define ELEMENT_STATUS_ID_VALID 0x00002000
   1128 #define ELEMENT_STATUS_NOT_BUS 0x00008000
   1129 #define ELEMENT_STATUS_INVERT 0x00400000
   1130 #define ELEMENT_STATUS_SVALID 0x00800000
   1131 
   1132 #define ELEMENT_STATUS_PVOLTAG 0x10000000
   1133 #define ELEMENT_STATUS_AVOLTAG 0x20000000
   1134 
   1135 #define ERROR_LABEL_UNREADABLE 0x00000001
   1136 #define ERROR_LABEL_QUESTIONABLE 0x00000002
   1137 #define ERROR_SLOT_NOT_PRESENT 0x00000004
   1138 #define ERROR_DRIVE_NOT_INSTALLED 0x00000008
   1139 #define ERROR_TRAY_MALFUNCTION 0x00000010
   1140 #define ERROR_INIT_STATUS_NEEDED 0x00000011
   1141 #define ERROR_UNHANDLED_ERROR 0xFFFFFFFF
   1142 
   1143 typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
   1144   CHANGER_ELEMENT_LIST ElementList;
   1145   BOOLEAN BarCodeScan;
   1146 } CHANGER_INITIALIZE_ELEMENT_STATUS,*PCHANGER_INITIALIZE_ELEMENT_STATUS;
   1147 
   1148 typedef struct _CHANGER_SET_POSITION {
   1149   CHANGER_ELEMENT Transport;
   1150   CHANGER_ELEMENT Destination;
   1151   BOOLEAN Flip;
   1152 } CHANGER_SET_POSITION,*PCHANGER_SET_POSITION;
   1153 
   1154 typedef struct _CHANGER_EXCHANGE_MEDIUM {
   1155   CHANGER_ELEMENT Transport;
   1156   CHANGER_ELEMENT Source;
   1157   CHANGER_ELEMENT Destination1;
   1158   CHANGER_ELEMENT Destination2;
   1159   BOOLEAN Flip1;
   1160   BOOLEAN Flip2;
   1161 } CHANGER_EXCHANGE_MEDIUM,*PCHANGER_EXCHANGE_MEDIUM;
   1162 
   1163 typedef struct _CHANGER_MOVE_MEDIUM {
   1164   CHANGER_ELEMENT Transport;
   1165   CHANGER_ELEMENT Source;
   1166   CHANGER_ELEMENT Destination;
   1167   BOOLEAN Flip;
   1168 } CHANGER_MOVE_MEDIUM,*PCHANGER_MOVE_MEDIUM;
   1169 
   1170 typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
   1171   CHANGER_ELEMENT StartingElement;
   1172   DWORD ActionCode;
   1173   BYTE VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE];
   1174 } CHANGER_SEND_VOLUME_TAG_INFORMATION,*PCHANGER_SEND_VOLUME_TAG_INFORMATION;
   1175 
   1176 typedef struct _READ_ELEMENT_ADDRESS_INFO {
   1177   DWORD NumberOfElements;
   1178   CHANGER_ELEMENT_STATUS ElementStatus[1];
   1179 } READ_ELEMENT_ADDRESS_INFO,*PREAD_ELEMENT_ADDRESS_INFO;
   1180 
   1181 #define SEARCH_ALL 0x0
   1182 #define SEARCH_PRIMARY 0x1
   1183 #define SEARCH_ALTERNATE 0x2
   1184 #define SEARCH_ALL_NO_SEQ 0x4
   1185 #define SEARCH_PRI_NO_SEQ 0x5
   1186 #define SEARCH_ALT_NO_SEQ 0x6
   1187 
   1188 #define ASSERT_PRIMARY 0x8
   1189 #define ASSERT_ALTERNATE 0x9
   1190 
   1191 #define REPLACE_PRIMARY 0xA
   1192 #define REPLACE_ALTERNATE 0xB
   1193 
   1194 #define UNDEFINE_PRIMARY 0xC
   1195 #define UNDEFINE_ALTERNATE 0xD
   1196 
   1197 typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
   1198   DeviceProblemNone,DeviceProblemHardware,DeviceProblemCHMError,DeviceProblemDoorOpen,DeviceProblemCalibrationError,DeviceProblemTargetFailure,
   1199   DeviceProblemCHMMoveError,DeviceProblemCHMZeroError,DeviceProblemCartridgeInsertError,DeviceProblemPositionError,DeviceProblemSensorError,
   1200   DeviceProblemCartridgeEjectError,DeviceProblemGripperError,DeviceProblemDriveError
   1201 } CHANGER_DEVICE_PROBLEM_TYPE,*PCHANGER_DEVICE_PROBLEM_TYPE;
   1202 
   1203 #define IOCTL_SERIAL_LSRMST_INSERT CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1204 
   1205 #define IOCTL_SERENUM_EXPOSE_HARDWARE CTL_CODE(FILE_DEVICE_SERENUM,128,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1206 #define IOCTL_SERENUM_REMOVE_HARDWARE CTL_CODE(FILE_DEVICE_SERENUM,129,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1207 #define IOCTL_SERENUM_PORT_DESC CTL_CODE(FILE_DEVICE_SERENUM,130,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1208 #define IOCTL_SERENUM_GET_PORT_NAME CTL_CODE(FILE_DEVICE_SERENUM,131,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1209 
   1210 #define SERIAL_LSRMST_ESCAPE ((BYTE)0x00)
   1211 
   1212 #define SERIAL_LSRMST_LSR_DATA ((BYTE)0x01)
   1213 
   1214 #define SERIAL_LSRMST_LSR_NODATA ((BYTE)0x02)
   1215 
   1216 #define SERIAL_LSRMST_MST ((BYTE)0x03)
   1217 
   1218 #define SERIAL_IOC_FCR_FIFO_ENABLE ((DWORD)0x00000001)
   1219 #define SERIAL_IOC_FCR_RCVR_RESET ((DWORD)0x00000002)
   1220 #define SERIAL_IOC_FCR_XMIT_RESET ((DWORD)0x00000004)
   1221 #define SERIAL_IOC_FCR_DMA_MODE ((DWORD)0x00000008)
   1222 #define SERIAL_IOC_FCR_RES1 ((DWORD)0x00000010)
   1223 #define SERIAL_IOC_FCR_RES2 ((DWORD)0x00000020)
   1224 #define SERIAL_IOC_FCR_RCVR_TRIGGER_LSB ((DWORD)0x00000040)
   1225 #define SERIAL_IOC_FCR_RCVR_TRIGGER_MSB ((DWORD)0x00000080)
   1226 
   1227 #define SERIAL_IOC_MCR_DTR ((DWORD)0x00000001)
   1228 #define SERIAL_IOC_MCR_RTS ((DWORD)0x00000002)
   1229 #define SERIAL_IOC_MCR_OUT1 ((DWORD)0x00000004)
   1230 #define SERIAL_IOC_MCR_OUT2 ((DWORD)0x00000008)
   1231 #define SERIAL_IOC_MCR_LOOP ((DWORD)0x00000010)
   1232 
   1233 #ifndef _FILESYSTEMFSCTL_
   1234 #define _FILESYSTEMFSCTL_
   1235 
   1236 #define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1237 #define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,1,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1238 #define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,2,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1239 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,3,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1240 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,4,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1241 #define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,5,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1242 #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1243 #define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,7,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1244 #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,8,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1245 
   1246 #define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,10,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1247 #define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,11,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1248 #define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,12,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1249 
   1250 #define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,14,METHOD_NEITHER,FILE_ANY_ACCESS)
   1251 #define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,15,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1252 #define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,16,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
   1253 
   1254 #define FSCTL_MARK_AS_SYSTEM_HIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,19,METHOD_NEITHER,FILE_ANY_ACCESS)
   1255 #define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,20,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1256 #define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,21,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1257 #define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM,22,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1258 #define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,23,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1259 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,24,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1260 #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,25,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1261 #define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM,26,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1262 #define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM,27,METHOD_NEITHER,FILE_ANY_ACCESS)
   1263 #define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,28,METHOD_NEITHER,FILE_ANY_ACCESS)
   1264 #define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,29,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1265 #define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,30,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1266 #define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,32,METHOD_NEITHER,FILE_ANY_ACCESS)
   1267 #define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,35,METHOD_NEITHER,FILE_ANY_ACCESS)
   1268 #define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,38,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1269 #define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,39,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1270 #define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,40,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1271 #define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,41,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1272 #define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,42,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1273 #define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,43,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1274 #define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,44,METHOD_NEITHER,FILE_ANY_ACCESS)
   1275 #define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,45,METHOD_NEITHER,FILE_READ_DATA)
   1276 #define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,46,METHOD_NEITHER,FILE_ANY_ACCESS)
   1277 #define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,47,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1278 #define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,48,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1279 #define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,49,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1280 #define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,50,METHOD_BUFFERED,FILE_WRITE_DATA)
   1281 #define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,51,METHOD_NEITHER,FILE_READ_DATA)
   1282 #define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,53,METHOD_NEITHER,FILE_ANY_ACCESS)
   1283 #define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,54,METHOD_NEITHER,FILE_ANY_ACCESS)
   1284 #define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,55,METHOD_NEITHER,FILE_SPECIAL_ACCESS)
   1285 #define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,56,METHOD_NEITHER,FILE_SPECIAL_ACCESS)
   1286 #define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,57,METHOD_NEITHER,FILE_ANY_ACCESS)
   1287 #define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,58,METHOD_NEITHER,FILE_ANY_ACCESS)
   1288 #define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM,59,METHOD_NEITHER,FILE_ANY_ACCESS)
   1289 #define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1290 #define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,61,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1291 #define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,62,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1292 #define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,63,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1293 #define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,64,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1294 #define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,65,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
   1295 #define FSCTL_HSM_MSG CTL_CODE(FILE_DEVICE_FILE_SYSTEM,66,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
   1296 #define FSCTL_HSM_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,68,METHOD_NEITHER,FILE_READ_DATA | FILE_WRITE_DATA)
   1297 #define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,69,METHOD_NEITHER,FILE_ANY_ACCESS)
   1298 #define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM,71,METHOD_OUT_DIRECT,FILE_READ_DATA)
   1299 #define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM,72,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1300 
   1301 typedef struct _PATHNAME_BUFFER {
   1302   DWORD PathNameLength;
   1303   WCHAR Name[1];
   1304 } PATHNAME_BUFFER,*PPATHNAME_BUFFER;
   1305 
   1306 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
   1307   BYTE First0x24BytesOfBootSector[0x24];
   1308 } FSCTL_QUERY_FAT_BPB_BUFFER,*PFSCTL_QUERY_FAT_BPB_BUFFER;
   1309 
   1310 typedef struct {
   1311   LARGE_INTEGER VolumeSerialNumber;
   1312   LARGE_INTEGER NumberSectors;
   1313   LARGE_INTEGER TotalClusters;
   1314   LARGE_INTEGER FreeClusters;
   1315   LARGE_INTEGER TotalReserved;
   1316   DWORD BytesPerSector;
   1317   DWORD BytesPerCluster;
   1318   DWORD BytesPerFileRecordSegment;
   1319   DWORD ClustersPerFileRecordSegment;
   1320   LARGE_INTEGER MftValidDataLength;
   1321   LARGE_INTEGER MftStartLcn;
   1322   LARGE_INTEGER Mft2StartLcn;
   1323   LARGE_INTEGER MftZoneStart;
   1324   LARGE_INTEGER MftZoneEnd;
   1325 } NTFS_VOLUME_DATA_BUFFER,*PNTFS_VOLUME_DATA_BUFFER;
   1326 
   1327 typedef struct {
   1328   DWORD ByteCount;
   1329   WORD MajorVersion;
   1330   WORD MinorVersion;
   1331 } NTFS_EXTENDED_VOLUME_DATA,*PNTFS_EXTENDED_VOLUME_DATA;
   1332 
   1333 typedef struct {
   1334   LARGE_INTEGER StartingLcn;
   1335 } STARTING_LCN_INPUT_BUFFER,*PSTARTING_LCN_INPUT_BUFFER;
   1336 
   1337 typedef struct {
   1338   LARGE_INTEGER StartingLcn;
   1339   LARGE_INTEGER BitmapSize;
   1340   BYTE Buffer[1];
   1341 } VOLUME_BITMAP_BUFFER,*PVOLUME_BITMAP_BUFFER;
   1342 
   1343 typedef struct {
   1344   LARGE_INTEGER StartingVcn;
   1345 } STARTING_VCN_INPUT_BUFFER,*PSTARTING_VCN_INPUT_BUFFER;
   1346 
   1347 typedef struct RETRIEVAL_POINTERS_BUFFER {
   1348   DWORD ExtentCount;
   1349   LARGE_INTEGER StartingVcn;
   1350   struct {
   1351     LARGE_INTEGER NextVcn;
   1352     LARGE_INTEGER Lcn;
   1353   } Extents[1];
   1354 } RETRIEVAL_POINTERS_BUFFER,*PRETRIEVAL_POINTERS_BUFFER;
   1355 
   1356 typedef struct {
   1357   LARGE_INTEGER FileReferenceNumber;
   1358 } NTFS_FILE_RECORD_INPUT_BUFFER,*PNTFS_FILE_RECORD_INPUT_BUFFER;
   1359 
   1360 typedef struct {
   1361   LARGE_INTEGER FileReferenceNumber;
   1362   DWORD FileRecordLength;
   1363   BYTE FileRecordBuffer[1];
   1364 } NTFS_FILE_RECORD_OUTPUT_BUFFER,*PNTFS_FILE_RECORD_OUTPUT_BUFFER;
   1365 
   1366 typedef struct {
   1367   HANDLE FileHandle;
   1368   LARGE_INTEGER StartingVcn;
   1369   LARGE_INTEGER StartingLcn;
   1370   DWORD ClusterCount;
   1371 } MOVE_FILE_DATA,*PMOVE_FILE_DATA;
   1372 
   1373 #ifdef _WIN64
   1374 typedef struct _MOVE_FILE_DATA32 {
   1375   UINT32 FileHandle;
   1376   LARGE_INTEGER StartingVcn;
   1377   LARGE_INTEGER StartingLcn;
   1378   DWORD ClusterCount;
   1379 } MOVE_FILE_DATA32,*PMOVE_FILE_DATA32;
   1380 #endif
   1381 
   1382 typedef struct {
   1383   DWORD Restart;
   1384   SID Sid;
   1385 } FIND_BY_SID_DATA,*PFIND_BY_SID_DATA;
   1386 
   1387 typedef struct {
   1388   DWORD NextEntryOffset;
   1389   DWORD FileIndex;
   1390   DWORD FileNameLength;
   1391   WCHAR FileName[1];
   1392 } FIND_BY_SID_OUTPUT,*PFIND_BY_SID_OUTPUT;
   1393 
   1394 typedef struct {
   1395   DWORDLONG StartFileReferenceNumber;
   1396   USN LowUsn;
   1397   USN HighUsn;
   1398 } MFT_ENUM_DATA,*PMFT_ENUM_DATA;
   1399 
   1400 typedef struct {
   1401   DWORDLONG MaximumSize;
   1402   DWORDLONG AllocationDelta;
   1403 } CREATE_USN_JOURNAL_DATA,*PCREATE_USN_JOURNAL_DATA;
   1404 
   1405 typedef struct {
   1406   USN StartUsn;
   1407   DWORD ReasonMask;
   1408   DWORD ReturnOnlyOnClose;
   1409   DWORDLONG Timeout;
   1410   DWORDLONG BytesToWaitFor;
   1411   DWORDLONG UsnJournalID;
   1412 } READ_USN_JOURNAL_DATA,*PREAD_USN_JOURNAL_DATA;
   1413 
   1414 typedef struct {
   1415   DWORD RecordLength;
   1416   WORD MajorVersion;
   1417   WORD MinorVersion;
   1418   DWORDLONG FileReferenceNumber;
   1419   DWORDLONG ParentFileReferenceNumber;
   1420   USN Usn;
   1421   LARGE_INTEGER TimeStamp;
   1422   DWORD Reason;
   1423   DWORD SourceInfo;
   1424   DWORD SecurityId;
   1425   DWORD FileAttributes;
   1426   WORD FileNameLength;
   1427   WORD FileNameOffset;
   1428   WCHAR FileName[1];
   1429 } USN_RECORD,*PUSN_RECORD;
   1430 
   1431 #define USN_PAGE_SIZE (0x1000)
   1432 
   1433 #define USN_REASON_DATA_OVERWRITE (0x00000001)
   1434 #define USN_REASON_DATA_EXTEND (0x00000002)
   1435 #define USN_REASON_DATA_TRUNCATION (0x00000004)
   1436 #define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010)
   1437 #define USN_REASON_NAMED_DATA_EXTEND (0x00000020)
   1438 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
   1439 #define USN_REASON_FILE_CREATE (0x00000100)
   1440 #define USN_REASON_FILE_DELETE (0x00000200)
   1441 #define USN_REASON_EA_CHANGE (0x00000400)
   1442 #define USN_REASON_SECURITY_CHANGE (0x00000800)
   1443 #define USN_REASON_RENAME_OLD_NAME (0x00001000)
   1444 #define USN_REASON_RENAME_NEW_NAME (0x00002000)
   1445 #define USN_REASON_INDEXABLE_CHANGE (0x00004000)
   1446 #define USN_REASON_BASIC_INFO_CHANGE (0x00008000)
   1447 #define USN_REASON_HARD_LINK_CHANGE (0x00010000)
   1448 #define USN_REASON_COMPRESSION_CHANGE (0x00020000)
   1449 #define USN_REASON_ENCRYPTION_CHANGE (0x00040000)
   1450 #define USN_REASON_OBJECT_ID_CHANGE (0x00080000)
   1451 #define USN_REASON_REPARSE_POINT_CHANGE (0x00100000)
   1452 #define USN_REASON_STREAM_CHANGE (0x00200000)
   1453 
   1454 #define USN_REASON_CLOSE (0x80000000)
   1455 
   1456 typedef struct {
   1457   DWORDLONG UsnJournalID;
   1458   USN FirstUsn;
   1459   USN NextUsn;
   1460   USN LowestValidUsn;
   1461   USN MaxUsn;
   1462   DWORDLONG MaximumSize;
   1463   DWORDLONG AllocationDelta;
   1464 } USN_JOURNAL_DATA,*PUSN_JOURNAL_DATA;
   1465 
   1466 typedef struct {
   1467   DWORDLONG UsnJournalID;
   1468   DWORD DeleteFlags;
   1469 } DELETE_USN_JOURNAL_DATA,*PDELETE_USN_JOURNAL_DATA;
   1470 
   1471 #define USN_DELETE_FLAG_DELETE (0x00000001)
   1472 #define USN_DELETE_FLAG_NOTIFY (0x00000002)
   1473 
   1474 #define USN_DELETE_VALID_FLAGS (0x00000003)
   1475 
   1476 typedef struct {
   1477   DWORD UsnSourceInfo;
   1478   HANDLE VolumeHandle;
   1479   DWORD HandleInfo;
   1480 } MARK_HANDLE_INFO,*PMARK_HANDLE_INFO;
   1481 
   1482 #ifdef _WIN64
   1483 
   1484 typedef struct {
   1485   DWORD UsnSourceInfo;
   1486   UINT32 VolumeHandle;
   1487   DWORD HandleInfo;
   1488 
   1489 } MARK_HANDLE_INFO32,*PMARK_HANDLE_INFO32;
   1490 #endif
   1491 
   1492 #define USN_SOURCE_DATA_MANAGEMENT (0x00000001)
   1493 #define USN_SOURCE_AUXILIARY_DATA (0x00000002)
   1494 #define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004)
   1495 
   1496 #define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001)
   1497 #define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004)
   1498 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008)
   1499 #define MARK_HANDLE_REALTIME (0x00000020)
   1500 #define MARK_HANDLE_NOT_REALTIME (0x00000040)
   1501 
   1502 typedef struct {
   1503   ACCESS_MASK DesiredAccess;
   1504   DWORD SecurityIds[1];
   1505 } BULK_SECURITY_TEST_DATA,*PBULK_SECURITY_TEST_DATA;
   1506 
   1507 #define VOLUME_IS_DIRTY (0x00000001)
   1508 #define VOLUME_UPGRADE_SCHEDULED (0x00000002)
   1509 
   1510 typedef struct _FILE_PREFETCH {
   1511   DWORD Type;
   1512   DWORD Count;
   1513   DWORDLONG Prefetch[1];
   1514 } FILE_PREFETCH,*PFILE_PREFETCH;
   1515 
   1516 #define FILE_PREFETCH_TYPE_FOR_CREATE 0x1
   1517 
   1518 typedef struct _FILESYSTEM_STATISTICS {
   1519   WORD FileSystemType;
   1520   WORD Version;
   1521   DWORD SizeOfCompleteStructure;
   1522   DWORD UserFileReads;
   1523   DWORD UserFileReadBytes;
   1524   DWORD UserDiskReads;
   1525   DWORD UserFileWrites;
   1526   DWORD UserFileWriteBytes;
   1527   DWORD UserDiskWrites;
   1528   DWORD MetaDataReads;
   1529   DWORD MetaDataReadBytes;
   1530   DWORD MetaDataDiskReads;
   1531   DWORD MetaDataWrites;
   1532   DWORD MetaDataWriteBytes;
   1533   DWORD MetaDataDiskWrites;
   1534 } FILESYSTEM_STATISTICS,*PFILESYSTEM_STATISTICS;
   1535 
   1536 #define FILESYSTEM_STATISTICS_TYPE_NTFS 1
   1537 #define FILESYSTEM_STATISTICS_TYPE_FAT 2
   1538 
   1539 typedef struct _FAT_STATISTICS {
   1540   DWORD CreateHits;
   1541   DWORD SuccessfulCreates;
   1542   DWORD FailedCreates;
   1543   DWORD NonCachedReads;
   1544   DWORD NonCachedReadBytes;
   1545   DWORD NonCachedWrites;
   1546   DWORD NonCachedWriteBytes;
   1547   DWORD NonCachedDiskReads;
   1548   DWORD NonCachedDiskWrites;
   1549 } FAT_STATISTICS,*PFAT_STATISTICS;
   1550 
   1551 typedef struct _EXFAT_STATISTICS {
   1552   DWORD CreateHits;
   1553   DWORD SuccessfulCreates;
   1554   DWORD FailedCreates;
   1555   DWORD NonCachedReads;
   1556   DWORD NonCachedReadBytes;
   1557   DWORD NonCachedWrites;
   1558   DWORD NonCachedWriteBytes;
   1559   DWORD NonCachedDiskReads;
   1560   DWORD NonCachedDiskWrites;
   1561 } EXFAT_STATISTICS, *PEXFAT_STATISTICS;
   1562 
   1563 typedef struct _NTFS_STATISTICS {
   1564   DWORD LogFileFullExceptions;
   1565   DWORD OtherExceptions;
   1566   DWORD MftReads;
   1567   DWORD MftReadBytes;
   1568   DWORD MftWrites;
   1569   DWORD MftWriteBytes;
   1570   struct {
   1571     WORD Write;
   1572     WORD Create;
   1573     WORD SetInfo;
   1574     WORD Flush;
   1575   } MftWritesUserLevel;
   1576   WORD MftWritesFlushForLogFileFull;
   1577   WORD MftWritesLazyWriter;
   1578   WORD MftWritesUserRequest;
   1579   DWORD Mft2Writes;
   1580   DWORD Mft2WriteBytes;
   1581   struct {
   1582     WORD Write;
   1583     WORD Create;
   1584     WORD SetInfo;
   1585     WORD Flush;
   1586   } Mft2WritesUserLevel;
   1587   WORD Mft2WritesFlushForLogFileFull;
   1588   WORD Mft2WritesLazyWriter;
   1589   WORD Mft2WritesUserRequest;
   1590   DWORD RootIndexReads;
   1591   DWORD RootIndexReadBytes;
   1592   DWORD RootIndexWrites;
   1593   DWORD RootIndexWriteBytes;
   1594   DWORD BitmapReads;
   1595   DWORD BitmapReadBytes;
   1596   DWORD BitmapWrites;
   1597   DWORD BitmapWriteBytes;
   1598   WORD BitmapWritesFlushForLogFileFull;
   1599   WORD BitmapWritesLazyWriter;
   1600   WORD BitmapWritesUserRequest;
   1601   struct {
   1602     WORD Write;
   1603     WORD Create;
   1604     WORD SetInfo;
   1605   } BitmapWritesUserLevel;
   1606   DWORD MftBitmapReads;
   1607   DWORD MftBitmapReadBytes;
   1608   DWORD MftBitmapWrites;
   1609   DWORD MftBitmapWriteBytes;
   1610   WORD MftBitmapWritesFlushForLogFileFull;
   1611   WORD MftBitmapWritesLazyWriter;
   1612   WORD MftBitmapWritesUserRequest;
   1613   struct {
   1614     WORD Write;
   1615     WORD Create;
   1616     WORD SetInfo;
   1617     WORD Flush;
   1618   } MftBitmapWritesUserLevel;
   1619   DWORD UserIndexReads;
   1620   DWORD UserIndexReadBytes;
   1621   DWORD UserIndexWrites;
   1622   DWORD UserIndexWriteBytes;
   1623   DWORD LogFileReads;
   1624   DWORD LogFileReadBytes;
   1625   DWORD LogFileWrites;
   1626   DWORD LogFileWriteBytes;
   1627   struct {
   1628     DWORD Calls;
   1629     DWORD Clusters;
   1630     DWORD Hints;
   1631     DWORD RunsReturned;
   1632     DWORD HintsHonored;
   1633     DWORD HintsClusters;
   1634     DWORD Cache;
   1635     DWORD CacheClusters;
   1636     DWORD CacheMiss;
   1637     DWORD CacheMissClusters;
   1638   } Allocate;
   1639 } NTFS_STATISTICS,*PNTFS_STATISTICS;
   1640 
   1641 typedef struct _FILE_OBJECTID_BUFFER {
   1642   BYTE ObjectId[16];
   1643   __C89_NAMELESS union {
   1644     __C89_NAMELESS struct {
   1645       BYTE BirthVolumeId[16];
   1646       BYTE BirthObjectId[16];
   1647       BYTE DomainId[16];
   1648     } DUMMYSTRUCTNAME;
   1649     BYTE ExtendedInfo[48];
   1650   } DUMMYUNIONNAME;
   1651 } FILE_OBJECTID_BUFFER,*PFILE_OBJECTID_BUFFER;
   1652 
   1653 typedef struct _FILE_SET_SPARSE_BUFFER {
   1654   BOOLEAN SetSparse;
   1655 } FILE_SET_SPARSE_BUFFER,*PFILE_SET_SPARSE_BUFFER;
   1656 
   1657 typedef struct _FILE_ZERO_DATA_INFORMATION {
   1658   LARGE_INTEGER FileOffset;
   1659   LARGE_INTEGER BeyondFinalZero;
   1660 } FILE_ZERO_DATA_INFORMATION,*PFILE_ZERO_DATA_INFORMATION;
   1661 
   1662 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
   1663   LARGE_INTEGER FileOffset;
   1664   LARGE_INTEGER Length;
   1665 } FILE_ALLOCATED_RANGE_BUFFER,*PFILE_ALLOCATED_RANGE_BUFFER;
   1666 
   1667 typedef struct _ENCRYPTION_BUFFER {
   1668   DWORD EncryptionOperation;
   1669   BYTE Private[1];
   1670 } ENCRYPTION_BUFFER,*PENCRYPTION_BUFFER;
   1671 
   1672 #define FILE_SET_ENCRYPTION 0x00000001
   1673 #define FILE_CLEAR_ENCRYPTION 0x00000002
   1674 #define STREAM_SET_ENCRYPTION 0x00000003
   1675 #define STREAM_CLEAR_ENCRYPTION 0x00000004
   1676 
   1677 #define MAXIMUM_ENCRYPTION_VALUE 0x00000004
   1678 
   1679 typedef struct _DECRYPTION_STATUS_BUFFER {
   1680   BOOLEAN NoEncryptedStreams;
   1681 } DECRYPTION_STATUS_BUFFER,*PDECRYPTION_STATUS_BUFFER;
   1682 
   1683 #define ENCRYPTION_FORMAT_DEFAULT (0x01)
   1684 #define COMPRESSION_FORMAT_SPARSE (0x4000)
   1685 
   1686 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
   1687   LONGLONG FileOffset;
   1688   DWORD Length;
   1689 } REQUEST_RAW_ENCRYPTED_DATA,*PREQUEST_RAW_ENCRYPTED_DATA;
   1690 
   1691 typedef struct _ENCRYPTED_DATA_INFO {
   1692   DWORDLONG StartingFileOffset;
   1693   DWORD OutputBufferOffset;
   1694   DWORD BytesWithinFileSize;
   1695   DWORD BytesWithinValidDataLength;
   1696   WORD CompressionFormat;
   1697   BYTE DataUnitShift;
   1698   BYTE ChunkShift;
   1699   BYTE ClusterShift;
   1700   BYTE EncryptionFormat;
   1701   WORD NumberOfDataBlocks;
   1702   DWORD DataBlockSize[ANYSIZE_ARRAY];
   1703 } ENCRYPTED_DATA_INFO;
   1704 typedef ENCRYPTED_DATA_INFO *PENCRYPTED_DATA_INFO;
   1705 
   1706 typedef struct _PLEX_READ_DATA_REQUEST {
   1707   LARGE_INTEGER ByteOffset;
   1708   DWORD ByteLength;
   1709   DWORD PlexNumber;
   1710 } PLEX_READ_DATA_REQUEST,*PPLEX_READ_DATA_REQUEST;
   1711 
   1712 typedef struct _SI_COPYFILE {
   1713   DWORD SourceFileNameLength;
   1714   DWORD DestinationFileNameLength;
   1715   DWORD Flags;
   1716   WCHAR FileNameBuffer[1];
   1717 } SI_COPYFILE,*PSI_COPYFILE;
   1718 
   1719 #define COPYFILE_SIS_LINK 0x0001
   1720 #define COPYFILE_SIS_REPLACE 0x0002
   1721 #define COPYFILE_SIS_FLAGS 0x0003
   1722 
   1723 typedef struct _STORAGE_DESCRIPTOR_HEADER {
   1724   DWORD Version;
   1725   DWORD Size;
   1726 } STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
   1727 
   1728 typedef enum _STORAGE_PROPERTY_ID {
   1729   StorageDeviceProperty              = 0,
   1730   StorageAdapterProperty             = 1,
   1731   StorageDeviceIdProperty            = 2,
   1732   StorageDeviceUniqueIdProperty      = 3,
   1733   StorageDeviceWriteCacheProperty    = 4,
   1734   StorageMiniportProperty            = 5,
   1735   StorageAccessAlignmentProperty     = 6,
   1736   StorageDeviceSeekPenaltyProperty   = 7,
   1737   StorageDeviceTrimProperty          = 8
   1738 } STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
   1739 
   1740 typedef enum _STORAGE_QUERY_TYPE {
   1741   PropertyStandardQuery     = 0,
   1742   PropertyExistsQuery       = 1,
   1743   PropertyMaskQuery         = 2,
   1744   PropertyQueryMaxDefined   = 3
   1745 } STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
   1746 
   1747 typedef struct _STORAGE_PROPERTY_QUERY {
   1748   STORAGE_PROPERTY_ID PropertyId;
   1749   STORAGE_QUERY_TYPE  QueryType;
   1750   BYTE                AdditionalParameters[1];
   1751 } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
   1752 
   1753 typedef struct _STORAGE_DEVICE_DESCRIPTOR {
   1754   DWORD            Version;
   1755   DWORD            Size;
   1756   BYTE             DeviceType;
   1757   BYTE             DeviceTypeModifier;
   1758   BOOLEAN          RemovableMedia;
   1759   BOOLEAN          CommandQueueing;
   1760   DWORD            VendorIdOffset;
   1761   DWORD            ProductIdOffset;
   1762   DWORD            ProductRevisionOffset;
   1763   DWORD            SerialNumberOffset;
   1764   STORAGE_BUS_TYPE BusType;
   1765   DWORD            RawPropertiesLength;
   1766   BYTE             RawDeviceProperties[1];
   1767 } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
   1768 
   1769 typedef struct _STORAGE_ADAPTER_DESCRIPTOR {
   1770   DWORD   Version;
   1771   DWORD   Size;
   1772   DWORD   MaximumTransferLength;
   1773   DWORD   MaximumPhysicalPages;
   1774   DWORD   AlignmentMask;
   1775   BOOLEAN AdapterUsesPio;
   1776   BOOLEAN AdapterScansDown;
   1777   BOOLEAN CommandQueueing;
   1778   BOOLEAN AcceleratedTransfer;
   1779   BYTE    BusType;
   1780   WORD    BusMajorVersion;
   1781   WORD    BusMinorVersion;
   1782 } STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
   1783 
   1784 typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
   1785   DWORD Version;
   1786   DWORD Size;
   1787   DWORD NumberOfIdentifiers;
   1788   BYTE  Identifiers[1];
   1789 } STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
   1790 
   1791 typedef struct _VOLUME_GET_GPT_ATTRIBUTES_INFORMATION {
   1792   ULONGLONG GptAttributes;
   1793 } VOLUME_GET_GPT_ATTRIBUTES_INFORMATION, *PVOLUME_GET_GPT_ATTRIBUTES_INFORMATION;
   1794 
   1795 #if (_WIN32_WINNT >= 0x0600)
   1796 #define FSCTL_MAKE_MEDIA_COMPATIBLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
   1797 #define FSCTL_SET_DEFECT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
   1798 #define FSCTL_QUERY_SPARING_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1799 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1800 #define FSCTL_SET_VOLUME_COMPRESSION_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   1801 #define FSCTL_TXFS_MODIFY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,81, METHOD_BUFFERED, FILE_WRITE_DATA)
   1802 #define FSCTL_TXFS_QUERY_RM_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,82, METHOD_BUFFERED, FILE_READ_DATA)
   1803 #define FSCTL_TXFS_ROLLFORWARD_REDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,84, METHOD_BUFFERED, FILE_WRITE_DATA)
   1804 #define FSCTL_TXFS_ROLLFORWARD_UNDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,85, METHOD_BUFFERED, FILE_WRITE_DATA)
   1805 #define FSCTL_TXFS_START_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,86, METHOD_BUFFERED, FILE_WRITE_DATA)
   1806 #define FSCTL_TXFS_SHUTDOWN_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
   1807 #define FSCTL_TXFS_READ_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,88, METHOD_BUFFERED, FILE_READ_DATA)
   1808 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,89, METHOD_BUFFERED, FILE_WRITE_DATA)
   1809 #define FSCTL_TXFS_CREATE_SECONDARY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,90,METHOD_BUFFERED, FILE_WRITE_DATA)
   1810 #define FSCTL_TXFS_GET_METADATA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,91, METHOD_BUFFERED, FILE_READ_DATA)
   1811 #define FSCTL_TXFS_GET_TRANSACTED_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,92, METHOD_BUFFERED, FILE_READ_DATA)
   1812 #define FSCTL_TXFS_SAVEPOINT_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,94, METHOD_BUFFERED, FILE_WRITE_DATA)
   1813 #define FSCTL_TXFS_CREATE_MINIVERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
   1814 #define FSCTL_TXFS_TRANSACTION_ACTIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,99, METHOD_BUFFERED, FILE_READ_DATA)
   1815 #define FSCTL_SET_ZERO_ON_DEALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   1816 #define FSCTL_SET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1817 #define FSCTL_GET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1818 #define FSCTL_WAIT_FOR_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1819 #define FSCTL_INITIATE_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1820 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
   1821 #define FSCTL_SHRINK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   1822 #define FSCTL_SET_SHORT_NAME_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1823 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1824 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
   1825 #define FSCTL_TXFS_LIST_TRANSACTIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
   1826 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1827 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1828 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
   1829 
   1830 #define SET_REPAIR_ENABLED 0x00000001
   1831 #define SET_REPAIR_VOLUME_BITMAP_SCAN 0x00000002
   1832 #define SET_REPAIR_DELETE_CROSSLINK 0x00000004
   1833 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS 0x00000008
   1834 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT 0x00000010
   1835 
   1836 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
   1837   BOOLEAN CloseDisc;
   1838 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
   1839 
   1840 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
   1841   BOOLEAN Disable;
   1842 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
   1843 
   1844 typedef struct _FILE_QUERY_SPARING_BUFFER {
   1845   ULONG   SparingUnitBytes;
   1846   BOOLEAN SoftwareSparing;
   1847   ULONG   TotalSpareBlocks;
   1848   ULONG   FreeSpareBlocks;
   1849 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
   1850 
   1851 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
   1852   LARGE_INTEGER DirectoryCount;
   1853   LARGE_INTEGER FileCount;
   1854   WORD          FsFormatMajVersion;
   1855   WORD          FsFormatMinVersion;
   1856   WCHAR         FsFormatName[12];
   1857   LARGE_INTEGER FormatTime;
   1858   LARGE_INTEGER LastUpdateTime;
   1859   WCHAR         CopyrightInfo[34];
   1860   WCHAR         AbstractInfo[34];
   1861   WCHAR         FormattingImplementationInfo[34];
   1862   WCHAR         LastModifyingImplementationInfo[34];
   1863 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
   1864 
   1865 #define SET_REPAIR_ENABLED                          0x00000001
   1866 #define SET_REPAIR_VOLUME_BITMAP_SCAN               0x00000002
   1867 #define SET_REPAIR_DELETE_CROSSLINK                 0x00000004
   1868 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS             0x00000008
   1869 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT 0x00000010
   1870 #define SET_REPAIR_VALID_MASK                       0x0000001F
   1871 
   1872 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
   1873   ShrinkPrepare,
   1874   ShrinkCommit,
   1875   ShrinkAbort
   1876 } SHRINK_VOLUME_REQUEST_TYPES;
   1877 
   1878 typedef struct _SHRINK_VOLUME_INFORMATION {
   1879   SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
   1880   DWORDLONG                   Flags;
   1881   LONGLONG                    NewNumberOfSectors;
   1882 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
   1883 
   1884 #define TXFS_RM_FLAG_LOGGING_MODE 0x00000001
   1885 #define TXFS_RM_FLAG_RENAME_RM 0x00000002
   1886 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000004
   1887 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000008
   1888 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000010
   1889 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000020
   1890 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000040
   1891 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000080
   1892 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000100
   1893 #define TXFS_RM_FLAG_GROW_LOG 0x00000400
   1894 #define TXFS_RM_FLAG_SHRINK_LOG 0x00000800
   1895 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE 0x00001000
   1896 #define TXFS_RM_FLAG_PRESERVE_CHANGES 0x00002000
   1897 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START 0x00004000
   1898 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START 0x00008000
   1899 #define TXFS_RM_FLAG_PREFER_CONSISTENCY 0x00010000
   1900 #define TXFS_RM_FLAG_PREFER_AVAILABILITY 0x00020000
   1901 
   1902 #define TXFS_LOGGING_MODE_SIMPLE 1
   1903 #define TXFS_LOGGING_MODE_FULL 2
   1904 
   1905 #define TXFS_TRANSACTION_STATE_NONE      0
   1906 #define TXFS_TRANSACTION_STATE_ACTIVE    1
   1907 #define TXFS_TRANSACTION_STATE_PREPARED  2
   1908 #define TXFS_TRANSACTION_STATE_NOTACTIVE 3
   1909 
   1910 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE                        | \
   1911                                     TXFS_RM_FLAG_RENAME_RM                           | \
   1912                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX             | \
   1913                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN             | \
   1914                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
   1915                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        | \
   1916                                     TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          | \
   1917                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          | \
   1918                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN          | \
   1919                                     TXFS_RM_FLAG_SHRINK_LOG                          | \
   1920                                     TXFS_RM_FLAG_GROW_LOG                            | \
   1921                                     TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                | \
   1922                                     TXFS_RM_FLAG_PRESERVE_CHANGES                    | \
   1923                                     TXFS_RM_FLAG_RESET_RM_AT_NEXT_START              | \
   1924                                     TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START       | \
   1925                                     TXFS_RM_FLAG_PREFER_CONSISTENCY                  | \
   1926                                     TXFS_RM_FLAG_PREFER_AVAILABILITY)
   1927 
   1928 typedef struct _TXFS_MODIFY_RM {
   1929   ULONG     Flags;
   1930   ULONG     LogContainerCountMax;
   1931   ULONG     LogContainerCountMin;
   1932   ULONG     LogContainerCount;
   1933   ULONG     LogGrowthIncrement;
   1934   ULONG     LogAutoShrinkPercentage;
   1935   ULONGLONG Reserved;
   1936   USHORT    LoggingMode;
   1937 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
   1938 
   1939 #define TXFS_RM_STATE_NOT_STARTED 0
   1940 #define TXFS_RM_STATE_STARTING 1
   1941 #define TXFS_RM_STATE_ACTIVE 3
   1942 #define TXFS_RM_STATE_SHUTTING_DOWN 4
   1943 
   1944 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS                           \
   1945                 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS   |   \
   1946                  TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT          |   \
   1947                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX            |   \
   1948                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN            |   \
   1949                  TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                |   \
   1950                  TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START         |   \
   1951                  TXFS_RM_FLAG_PREFER_CONSISTENCY                    |   \
   1952                  TXFS_RM_FLAG_PREFER_AVAILABILITY)
   1953 
   1954 typedef struct _TXFS_QUERY_RM_INFORMATION {
   1955   ULONG         BytesRequired;
   1956   ULONGLONG     TailLsn;
   1957   ULONGLONG     CurrentLsn;
   1958   ULONGLONG     ArchiveTailLsn;
   1959   ULONGLONG     LogContainerSize;
   1960   LARGE_INTEGER HighestVirtualClock;
   1961   ULONG         LogContainerCount;
   1962   ULONG         LogContainerCountMax;
   1963   ULONG         LogContainerCountMin;
   1964   ULONG         LogGrowthIncrement;
   1965   ULONG         LogAutoShrinkPercentage;
   1966   ULONG         Flags;
   1967   USHORT        LoggingMode;
   1968   USHORT        Reserved;
   1969   ULONG         RmState;
   1970   ULONGLONG     LogCapacity;
   1971   ULONGLONG     LogFree;
   1972   ULONGLONG     TopsSize;
   1973   ULONGLONG     TopsUsed;
   1974   ULONGLONG     TransactionCount;
   1975   ULONGLONG     OnePCCount;
   1976   ULONGLONG     TwoPCCount;
   1977   ULONGLONG     NumberLogFileFull;
   1978   ULONGLONG     OldestTransactionAge;
   1979   GUID          RMName;
   1980   ULONG         TmLogPathOffset;
   1981 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
   1982 
   1983 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN 0x01
   1984 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK 0x02
   1985 
   1986 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS                               \
   1987                 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN |         \
   1988                  TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
   1989 
   1990 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
   1991   LARGE_INTEGER LastVirtualClock;
   1992   ULONGLONG     LastRedoLsn;
   1993   ULONGLONG     HighestRecoveryLsn;
   1994   ULONG         Flags;
   1995 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
   1996 
   1997 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000001
   1998 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000002
   1999 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE 0x00000004
   2000 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000008
   2001 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000010
   2002 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000020
   2003 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000040
   2004 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000080
   2005 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT 0x00000200
   2006 #define TXFS_START_RM_FLAG_LOGGING_MODE 0x00000400
   2007 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES 0x00000800
   2008 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY 0x00001000
   2009 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY 0x00002000
   2010 
   2011 #define TXFS_START_RM_VALID_FLAGS                                           \
   2012                 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX             |   \
   2013                  TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN             |   \
   2014                  TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                  |   \
   2015                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS |   \
   2016                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        |   \
   2017                  TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          |   \
   2018                  TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                 |   \
   2019                  TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          |   \
   2020                  TXFS_START_RM_FLAG_LOGGING_MODE                        |   \
   2021                  TXFS_START_RM_FLAG_PRESERVE_CHANGES                    |   \
   2022                  TXFS_START_RM_FLAG_PREFER_CONSISTENCY                  |   \
   2023                  TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
   2024 
   2025 typedef struct _TXFS_START_RM_INFORMATION {
   2026   ULONG     Flags;
   2027   ULONGLONG LogContainerSize;
   2028   ULONG     LogContainerCountMin;
   2029   ULONG     LogContainerCountMax;
   2030   ULONG     LogGrowthIncrement;
   2031   ULONG     LogAutoShrinkPercentage;
   2032   ULONG     TmLogPathOffset;
   2033   USHORT    TmLogPathLength;
   2034   USHORT    LoggingMode;
   2035   USHORT    LogPathLength;
   2036   USHORT    Reserved;
   2037   WCHAR     LogPath[1];
   2038 } TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
   2039 
   2040 typedef struct _TXFS_GET_METADATA_INFO_OUT {
   2041   struct {
   2042     LONGLONG LowPart;
   2043     LONGLONG HighPart;
   2044   } TxfFileId;
   2045   GUID      LockingTransaction;
   2046   ULONGLONG LastLsn;
   2047   ULONG     TransactionState;
   2048 } TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
   2049 
   2050 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED 0x00000001
   2051 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED 0x000000012
   2052 
   2053 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
   2054   ULONGLONG Offset;
   2055   ULONG     NameFlags;
   2056   LONGLONG  FileId;
   2057   ULONG     Reserved1;
   2058   ULONG     Reserved2;
   2059   LONGLONG  Reserved3;
   2060   WCHAR     FileName[1];
   2061 } TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
   2062 
   2063 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
   2064   GUID      KtmTransaction;
   2065   ULONGLONG NumberOfFiles;
   2066   ULONGLONG BufferSizeRequired;
   2067   ULONGLONG Offset;
   2068 } TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
   2069 
   2070 typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
   2071   GUID     TransactionId;
   2072   ULONG    TransactionState;
   2073   ULONG    Reserved1;
   2074   ULONG    Reserved2;
   2075   LONGLONG Reserved3;
   2076 } TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
   2077 
   2078 typedef struct _TXFS_LIST_TRANSACTIONS {
   2079   ULONGLONG NumberOfTransactions;
   2080   ULONGLONG BufferSizeRequired;
   2081 } TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
   2082 
   2083 typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
   2084   __C89_NAMELESS union {
   2085     ULONG BufferLength;
   2086     UCHAR Buffer;
   2087   } DUMMYUNIONNAME;
   2088 } TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
   2089 
   2090 typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
   2091   UCHAR Buffer;
   2092 } TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
   2093 
   2094 #define TXFS_TRANSACTED_VERSION_NONTRANSACTED 0xFFFFFFFE
   2095 #define TXFS_TRANSACTED_VERSION_UNCOMMITTED 0xFFFFFFFF
   2096 
   2097 typedef struct _TXFS_GET_TRANSACTED_VERSION {
   2098   ULONG  ThisBaseVersion;
   2099   ULONG  LatestVersion;
   2100   USHORT ThisMiniVersion;
   2101   USHORT FirstMiniVersion;
   2102   USHORT LatestMiniVersion;
   2103 } TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
   2104 
   2105 #define TXFS_SAVEPOINT_SET 1
   2106 #define TXFS_SAVEPOINT_ROLLBACK 2
   2107 #define TXFS_SAVEPOINT_CLEAR 4
   2108 #define TXFS_SAVEPOINT_CLEAR_ALL 16
   2109 
   2110 typedef struct _TXFS_SAVEPOINT_INFORMATION {
   2111   HANDLE KtmTransaction;
   2112   ULONG  ActionCode;
   2113   ULONG  SavepointId;
   2114 } TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
   2115 
   2116 typedef struct _TXFS_CREATE_MINIVERSION_INFO {
   2117   USHORT StructureVersion;
   2118   USHORT StructureLength;
   2119   ULONG  BaseVersion;
   2120   USHORT MiniVersion;
   2121 } TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
   2122 
   2123 typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
   2124   WINBOOL TransactionsActiveAtSnapshot;
   2125 } TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
   2126 
   2127 typedef enum _WRITE_CACHE_TYPE {
   2128   WriteCacheTypeUnknown        = 0,
   2129   WriteCacheTypeNone           = 1,
   2130   WriteCacheTypeWriteBack      = 2,
   2131   WriteCacheTypeWriteThrough   = 3
   2132 } WRITE_CACHE_TYPE;
   2133 
   2134 typedef enum _WRITE_CACHE_ENABLE {
   2135   WriteCacheEnableUnknown   = 0,
   2136   WriteCacheDisabled        = 1,
   2137   WriteCacheEnabled         = 2
   2138 } WRITE_CACHE_ENABLE;
   2139 
   2140 typedef enum _WRITE_CACHE_CHANGE {
   2141   WriteCacheChangeUnknown   = 0,
   2142   WriteCacheNotChangeable   = 1,
   2143   WriteCacheChangeable      = 2
   2144 } WRITE_CACHE_CHANGE;
   2145 
   2146 typedef enum _WRITE_THROUGH {
   2147   WriteThroughUnknown        = 0,
   2148   WriteThroughNotSupported   = 1,
   2149   WriteThroughSupported      = 2
   2150 } WRITE_THROUGH;
   2151 
   2152 typedef struct _STORAGE_WRITE_CACHE_PROPERTY {
   2153   DWORD              Version;
   2154   DWORD              Size;
   2155   WRITE_CACHE_TYPE   WriteCacheType;
   2156   WRITE_CACHE_ENABLE WriteCacheEnabled;
   2157   WRITE_CACHE_CHANGE WriteCacheChangeable;
   2158   WRITE_THROUGH      WriteThroughSupported;
   2159   BOOLEAN            FlushCacheSupported;
   2160   BOOLEAN            UserDefinedPowerProtection;
   2161   BOOLEAN            NVCacheEnabled;
   2162 } STORAGE_WRITE_CACHE_PROPERTY, *PSTORAGE_WRITE_CACHE_PROPERTY;
   2163 
   2164 typedef enum _STORAGE_PORT_CODE_SET {
   2165   StoragePortCodeSetReserved   = 0,
   2166   StoragePortCodeSetStorport   = 1,
   2167   StoragePortCodeSetSCSIport   = 2
   2168 } STORAGE_PORT_CODE_SET, *PSTORAGE_PORT_CODE_SET;
   2169 
   2170 typedef struct _STORAGE_MINIPORT_DESCRIPTOR {
   2171   DWORD                 Version;
   2172   DWORD                 Size;
   2173   STORAGE_PORT_CODE_SET Portdriver;
   2174   BOOLEAN               LUNResetSupported;
   2175   BOOLEAN               TargetResetSupported;
   2176 } STORAGE_MINIPORT_DESCRIPTOR, *PSTORAGE_MINIPORT_DESCRIPTOR;
   2177 
   2178 typedef struct _STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR {
   2179   DWORD Version;
   2180   DWORD Size;
   2181   DWORD BytesPerCacheLine;
   2182   DWORD BytesOffsetForCacheAlignment;
   2183   DWORD BytesPerLogicalSector;
   2184   DWORD BytesPerPhysicalSector;
   2185   DWORD BytesOffsetForSectorAlignment;
   2186 } STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR, *PSTORAGE_ACCESS_ALIGNMENT_DESCRIPTOR;
   2187 #endif /*(_WIN32_WINNT >= 0x0600)*/
   2188 
   2189 #if (_WIN32_WINNT >= 0x0601)
   2190 typedef struct _DEVICE_SEEK_PENALTY_DESCRIPTOR {
   2191   DWORD   Version;
   2192   DWORD   Size;
   2193   BOOLEAN IncursSeekPenalty;
   2194 } DEVICE_SEEK_PENALTY_DESCRIPTOR, *PDEVICE_SEEK_PENALTY_DESCRIPTOR;
   2195 
   2196 typedef struct _DEVICE_TRIM_DESCRIPTOR {
   2197   DWORD   Version;
   2198   DWORD   Size;
   2199   BOOLEAN TrimEnabled;
   2200 } DEVICE_TRIM_DESCRIPTOR, *PDEVICE_TRIM_DESCRIPTOR;
   2201 
   2202 typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
   2203   WORD  StructureVersion;
   2204   WORD  StructureLength;
   2205   DWORD RequestedOplockLevel;
   2206   DWORD Flags;
   2207 } REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
   2208 
   2209 typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
   2210   WORD        StructureVersion;
   2211   WORD        StructureLength;
   2212   DWORD       OriginalOplockLevel;
   2213   DWORD       NewOplockLevel;
   2214   DWORD       Flags;
   2215   ACCESS_MASK AccessMode;
   2216   WORD        ShareMode;
   2217 } REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
   2218 
   2219 typedef struct _BOOT_AREA_INFO {
   2220   ULONG BootSectorCount;
   2221   struct {
   2222     LARGE_INTEGER Offset;
   2223   } BootSectors[2];
   2224 } BOOT_AREA_INFO, *PBOOT_AREA_INFO;
   2225 
   2226 typedef struct _RETRIEVAL_POINTER_BASE {
   2227   LARGE_INTEGER FileAreaOffset;
   2228 } RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
   2229 
   2230 typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
   2231   CHAR FileSystem[9];
   2232 } FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
   2233 
   2234 typedef struct _FILE_SYSTEM_RECOGNITION_STRUCTURE {
   2235   UCHAR  Jmp[3];
   2236   UCHAR  FsName[8];
   2237   UCHAR  MustBeZero[5];
   2238   ULONG  Identifier;
   2239   USHORT Length;
   2240   USHORT Checksum;
   2241 } FILE_SYSTEM_RECOGNITION_STRUCTURE;
   2242 
   2243 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
   2244   DWORD         Flags;
   2245   DWORD         NumberOfClusters;
   2246   LARGE_INTEGER Cluster[1];
   2247 } LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
   2248 
   2249 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
   2250   DWORD Offset;
   2251   DWORD NumberOfMatches;
   2252   DWORD BufferSizeRequired;
   2253 } LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
   2254 
   2255 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
   2256   DWORD         OffsetToNext;
   2257   DWORD         Flags;
   2258   LARGE_INTEGER Reserved;
   2259   LARGE_INTEGER Cluster;
   2260   WCHAR         FileName[1];
   2261 } LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
   2262 
   2263 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK 0xff000000
   2264 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE 0x00000001
   2265 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET 0x00000002
   2266 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE 0x00000004
   2267 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE 0x00000008
   2268 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA 0x01000000
   2269 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX 0x02000000
   2270 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM 0x03000000
   2271 
   2272 #define FSCTL_QUERY_DEPENDENT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,124, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2273 #define FSCTL_SD_GLOBAL_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,125, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2274 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM,127, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2275 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,128, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2276 #define FSCTL_FILE_TYPE_NOTIFICATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,129, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2277 #define FSCTL_GET_BOOT_AREA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,140, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2278 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,141, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2279 #define FSCTL_SET_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2280 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2281 #define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,144,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2282 #define FSCTL_CSV_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2283 #define FSCTL_IS_CSV_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2284 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,147, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2285 #define FSCTL_CSV_GET_VOLUME_PATH_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,148, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2286 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2287 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2288 #define FSCTL_IS_FILE_ON_CSV_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2289 
   2290 #endif /*(_WIN32_WINNT >= 0x0601)*/
   2291 
   2292 #endif /* _FILESYSTEMFSCTL_ */
   2293 
   2294 
   2295 #define IOCTL_VOLUME_BASE ((DWORD) 'V')
   2296 
   2297 #define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2298 #define IOCTL_VOLUME_SUPPORTS_ONLINE_OFFLINE CTL_CODE(IOCTL_VOLUME_BASE,1,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2299 #define IOCTL_VOLUME_ONLINE                  CTL_CODE(IOCTL_VOLUME_BASE,2,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   2300 #define IOCTL_VOLUME_OFFLINE                 CTL_CODE(IOCTL_VOLUME_BASE,3,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   2301 #define IOCTL_VOLUME_IS_OFFLINE              CTL_CODE(IOCTL_VOLUME_BASE,4,METHOD_BUFFERED, FILE_ANY_ACCESS)
   2302 #define IOCTL_VOLUME_IS_IO_CAPABLE           CTL_CODE(IOCTL_VOLUME_BASE,5,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2303 #define IOCTL_VOLUME_QUERY_FAILOVER_SET      CTL_CODE(IOCTL_VOLUME_BASE,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2304 #define IOCTL_VOLUME_QUERY_VOLUME_NUMBER     CTL_CODE(IOCTL_VOLUME_BASE,7,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2305 #define IOCTL_VOLUME_LOGICAL_TO_PHYSICAL     CTL_CODE(IOCTL_VOLUME_BASE,8,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2306 #define IOCTL_VOLUME_PHYSICAL_TO_LOGICAL     CTL_CODE(IOCTL_VOLUME_BASE,9,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2307 #define IOCTL_VOLUME_IS_CLUSTERED            CTL_CODE(IOCTL_VOLUME_BASE,12,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2308 #define IOCTL_VOLUME_GET_GPT_ATTRIBUTES      CTL_CODE(IOCTL_VOLUME_BASE,14,METHOD_BUFFERED,FILE_ANY_ACCESS)
   2309 
   2310 typedef struct _DISK_EXTENT {
   2311   DWORD DiskNumber;
   2312   LARGE_INTEGER StartingOffset;
   2313   LARGE_INTEGER ExtentLength;
   2314 } DISK_EXTENT,*PDISK_EXTENT;
   2315 
   2316 typedef struct _VOLUME_DISK_EXTENTS {
   2317   DWORD NumberOfDiskExtents;
   2318   DISK_EXTENT Extents[1];
   2319 } VOLUME_DISK_EXTENTS,*PVOLUME_DISK_EXTENTS;
   2320 
   2321 #endif /* _WINIOCTL_ */
   2322 
   2323