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