zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

winioctl.h (132586B) - Raw


      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_VMLUN,0x6f416619,0x9f29,0x42a5,0xb2,0x0b,0x37,0xe2,0x19,0xca,0x02,0xb0);
     23 DEFINE_GUID(GUID_DEVINTERFACE_SES,0x1790c9ec,0x47d5,0x4df3,0xb5,0xaf,0x9a,0xdf,0x3c,0xf2,0x3e,0x48);
     24 DEFINE_GUID(GUID_DEVINTERFACE_ZNSDISK,0xb87941c5,0xffdb,0x43c7,0xb6,0xb1,0x20,0xb6,0x32,0xf0,0xb1,0x09);
     25 #define WDI_STORAGE_PREDICT_FAILURE_DPS_GUID {0xe9f2d03a,0x747c,0x41c2,{0xbb,0x9a,0x02,0xc6,0x2b,0x6d,0x5f,0xcb}};
     26 
     27 DEFINE_GUID(GUID_DEVINTERFACE_SERVICE_VOLUME,0x6ead3d82,0x25ec,0x46bc,0xb7,0xfd,0xc1,0xf0,0xdf,0x8f,0x50,0x37);
     28 DEFINE_GUID(GUID_DEVINTERFACE_HIDDEN_VOLUME,0x7f108a28,0x9833,0x4b3b,0xb7,0x80,0x2c,0x6b,0x5f,0xa5,0xc0,0x62);
     29 DEFINE_GUID(GUID_DEVINTERFACE_UNIFIED_ACCESS_RPMB,0x27447c21,0xbcc3,0x4d07,0xa0,0x5b,0xa3,0x39,0x5b,0xb4,0xee,0xe7);
     30 DEFINE_GUID(GUID_DEVINTERFACE_SCM_PHYSICAL_DEVICE,0x4283609d,0x4dc2,0x43be,0xbb,0xb4,0x4f,0x15,0xdf,0xce,0x2c,0x61);
     31 DEFINE_GUID(GUID_SCM_PD_HEALTH_NOTIFICATION,0x9da2d386,0x72f5,0x4ee3,0x81,0x55,0xec,0xa0,0x67,0x8e,0x3b,0x6);
     32 DEFINE_GUID(GUID_SCM_PD_PASSTHROUGH_INVDIMM,0x4309ac30,0x0d11,0x11e4,0x91,0x91,0x08,0x00,0x20,0x0c,0x9a,0x66);
     33 DEFINE_GUID(GUID_DEVINTERFACE_COMPORT,0x86e0d1e0,0x8089,0x11d0,0x9c,0xe4,0x08,0x00,0x3e,0x30,0x1f,0x73);
     34 DEFINE_GUID(GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR,0x4D36E978,0xE325,0x11CE,0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18);
     35 
     36 #define DiskClassGuid GUID_DEVINTERFACE_DISK
     37 #define CdRomClassGuid GUID_DEVINTERFACE_CDROM
     38 #define PartitionClassGuid GUID_DEVINTERFACE_PARTITION
     39 #define TapeClassGuid GUID_DEVINTERFACE_TAPE
     40 #define WriteOnceDiskClassGuid GUID_DEVINTERFACE_WRITEONCEDISK
     41 #define VolumeClassGuid GUID_DEVINTERFACE_VOLUME
     42 #define MediumChangerClassGuid GUID_DEVINTERFACE_MEDIUMCHANGER
     43 #define FloppyClassGuid GUID_DEVINTERFACE_FLOPPY
     44 #define CdChangerClassGuid GUID_DEVINTERFACE_CDCHANGER
     45 #define StoragePortClassGuid GUID_DEVINTERFACE_STORAGEPORT
     46 #define HiddenVolumeClassGuid GUID_DEVINTERFACE_HIDDEN_VOLUME
     47 #define GUID_CLASS_COMPORT GUID_DEVINTERFACE_COMPORT
     48 #define GUID_SERENUM_BUS_ENUMERATOR GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR
     49 #endif /* DEFINE_GUID */
     50 
     51 #ifdef DEFINE_DEVPROPKEY
     52 
     53 #ifndef __WRAPPED__
     54 #define __WRAPPED__
     55 #endif
     56 
     57 DEFINE_DEVPROPKEY(DEVPKEY_Storage_Portable,0x4d1ebee8,0x803,0x4774,0x98,0x42,0xb7,0x7d,0xb5,0x2,0x65,0xe9,2);
     58 DEFINE_DEVPROPKEY(DEVPKEY_Storage_Removable_Media,0x4d1ebee8,0x803,0x4774,0x98,0x42,0xb7,0x7d,0xb5,0x2,0x65,0xe9,3);
     59 DEFINE_DEVPROPKEY(DEVPKEY_Storage_System_Critical,0x4d1ebee8,0x803,0x4774,0x98,0x42,0xb7,0x7d,0xb5,0x2,0x65,0xe9,4);
     60 DEFINE_DEVPROPKEY(DEVPKEY_Storage_Disk_Number,0x4d1ebee8,0x803,0x4774,0x98,0x42,0xb7,0x7d,0xb5,0x2,0x65,0xe9,5);
     61 DEFINE_DEVPROPKEY(DEVPKEY_Storage_Partition_Number,0x4d1ebee8,0x803,0x4774,0x98,0x42,0xb7,0x7d,0xb5,0x2,0x65,0xe9,6);
     62 DEFINE_DEVPROPKEY(DEVPKEY_Storage_Mbr_Type,0x4d1ebee8,0x803,0x4774,0x98,0x42,0xb7,0x7d,0xb5,0x2,0x65,0xe9,7);
     63 DEFINE_DEVPROPKEY(DEVPKEY_Storage_Gpt_Type,0x4d1ebee8,0x803,0x4774,0x98,0x42,0xb7,0x7d,0xb5,0x2,0x65,0xe9,8);
     64 DEFINE_DEVPROPKEY(DEVPKEY_Storage_Gpt_Name,0x4d1ebee8,0x803,0x4774,0x98,0x42,0xb7,0x7d,0xb5,0x2,0x65,0xe9,9);
     65 
     66 #endif /* DEFINE_DEVPROPKEY */
     67 
     68 #ifndef _WINIOCTL_
     69 #define _WINIOCTL_
     70 
     71 #ifndef _DEVIOCTL_
     72 #define _DEVIOCTL_
     73 
     74 #ifndef DEVICE_TYPE
     75 #define DEVICE_TYPE DWORD
     76 #endif
     77 
     78 #define FILE_DEVICE_BEEP 0x00000001
     79 #define FILE_DEVICE_CD_ROM 0x00000002
     80 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
     81 #define FILE_DEVICE_CONTROLLER 0x00000004
     82 #define FILE_DEVICE_DATALINK 0x00000005
     83 #define FILE_DEVICE_DFS 0x00000006
     84 #define FILE_DEVICE_DISK 0x00000007
     85 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
     86 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
     87 #define FILE_DEVICE_INPORT_PORT 0x0000000a
     88 #define FILE_DEVICE_KEYBOARD 0x0000000b
     89 #define FILE_DEVICE_MAILSLOT 0x0000000c
     90 #define FILE_DEVICE_MIDI_IN 0x0000000d
     91 #define FILE_DEVICE_MIDI_OUT 0x0000000e
     92 #define FILE_DEVICE_MOUSE 0x0000000f
     93 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
     94 #define FILE_DEVICE_NAMED_PIPE 0x00000011
     95 #define FILE_DEVICE_NETWORK 0x00000012
     96 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
     97 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
     98 #define FILE_DEVICE_NULL 0x00000015
     99 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
    100 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
    101 #define FILE_DEVICE_PRINTER 0x00000018
    102 #define FILE_DEVICE_SCANNER 0x00000019
    103 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
    104 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
    105 #define FILE_DEVICE_SCREEN 0x0000001c
    106 #define FILE_DEVICE_SOUND 0x0000001d
    107 #define FILE_DEVICE_STREAMS 0x0000001e
    108 #define FILE_DEVICE_TAPE 0x0000001f
    109 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
    110 #define FILE_DEVICE_TRANSPORT 0x00000021
    111 #define FILE_DEVICE_UNKNOWN 0x00000022
    112 #define FILE_DEVICE_VIDEO 0x00000023
    113 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
    114 #define FILE_DEVICE_WAVE_IN 0x00000025
    115 #define FILE_DEVICE_WAVE_OUT 0x00000026
    116 #define FILE_DEVICE_8042_PORT 0x00000027
    117 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
    118 #define FILE_DEVICE_BATTERY 0x00000029
    119 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
    120 #define FILE_DEVICE_MODEM 0x0000002b
    121 #define FILE_DEVICE_VDM 0x0000002c
    122 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
    123 #define FILE_DEVICE_SMB 0x0000002e
    124 #define FILE_DEVICE_KS 0x0000002f
    125 #define FILE_DEVICE_CHANGER 0x00000030
    126 #define FILE_DEVICE_SMARTCARD 0x00000031
    127 #define FILE_DEVICE_ACPI 0x00000032
    128 #define FILE_DEVICE_DVD 0x00000033
    129 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
    130 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
    131 #define FILE_DEVICE_DFS_VOLUME 0x00000036
    132 #define FILE_DEVICE_SERENUM 0x00000037
    133 #define FILE_DEVICE_TERMSRV 0x00000038
    134 #define FILE_DEVICE_KSEC 0x00000039
    135 #define FILE_DEVICE_FIPS 0x0000003A
    136 #define FILE_DEVICE_INFINIBAND 0x0000003B
    137 #define FILE_DEVICE_VMBUS 0x0000003E
    138 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
    139 #define FILE_DEVICE_WPD 0x00000040
    140 #define FILE_DEVICE_BLUETOOTH 0x00000041
    141 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
    142 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
    143 #define FILE_DEVICE_BIOMETRIC 0x00000044
    144 #define FILE_DEVICE_PMI 0x00000045
    145 #define FILE_DEVICE_EHSTOR 0x00000046
    146 #define FILE_DEVICE_DEVAPI 0x00000047
    147 #define FILE_DEVICE_GPIO 0x00000048
    148 #define FILE_DEVICE_USBEX 0x00000049
    149 #define FILE_DEVICE_CONSOLE 0x00000050
    150 #define FILE_DEVICE_NFP 0x00000051
    151 #define FILE_DEVICE_SYSENV 0x00000052
    152 #define FILE_DEVICE_VIRTUAL_BLOCK 0x00000053
    153 #define FILE_DEVICE_POINT_OF_SERVICE 0x00000054
    154 #define FILE_DEVICE_STORAGE_REPLICATION 0x00000055
    155 #define FILE_DEVICE_TRUST_ENV 0x00000056
    156 #define FILE_DEVICE_UCM 0x00000057
    157 #define FILE_DEVICE_UCMTCPCI 0x00000058
    158 #define FILE_DEVICE_PERSISTENT_MEMORY 0x00000059
    159 #define FILE_DEVICE_NVDIMM 0x0000005a
    160 #define FILE_DEVICE_HOLOGRAPHIC 0x0000005b
    161 #define FILE_DEVICE_SDFXHCI 0x0000005c
    162 #define FILE_DEVICE_UCMUCSI 0x0000005d
    163 #define FILE_DEVICE_PRM 0x0000005e
    164 #define FILE_DEVICE_EVENT_COLLECTOR 0x0000005f
    165 #define FILE_DEVICE_USB4 0x00000060
    166 #define FILE_DEVICE_SOUNDWIRE 0x00000061
    167 
    168 #define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
    169 
    170 #define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((DWORD)(ctrlCode & 0xffff0000)) >> 16)
    171 #define METHOD_FROM_CTL_CODE(ctrlCode) ((DWORD)(ctrlCode & 3))
    172 
    173 #define METHOD_BUFFERED 0
    174 #define METHOD_IN_DIRECT 1
    175 #define METHOD_OUT_DIRECT 2
    176 #define METHOD_NEITHER 3
    177 
    178 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
    179 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
    180 
    181 #define FILE_ANY_ACCESS 0
    182 #define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS)
    183 #define FILE_READ_ACCESS (0x0001)
    184 #define FILE_WRITE_ACCESS (0x0002)
    185 
    186 #endif /* _DEVIOCTL_ */
    187 
    188 
    189 #ifndef _NTDDSTOR_H_
    190 #define _NTDDSTOR_H_
    191 
    192 #ifdef __cplusplus
    193 extern "C" {
    194 #endif
    195 
    196 #define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
    197 
    198 #define IOCTL_STORAGE_CHECK_VERIFY CTL_CODE(IOCTL_STORAGE_BASE,0x0200,METHOD_BUFFERED,FILE_READ_ACCESS)
    199 #define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE,0x0200,METHOD_BUFFERED,FILE_ANY_ACCESS)
    200 #define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE,0x0201,METHOD_BUFFERED,FILE_READ_ACCESS)
    201 #define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE,0x0202,METHOD_BUFFERED,FILE_READ_ACCESS)
    202 #define IOCTL_STORAGE_LOAD_MEDIA CTL_CODE(IOCTL_STORAGE_BASE,0x0203,METHOD_BUFFERED,FILE_READ_ACCESS)
    203 #define IOCTL_STORAGE_LOAD_MEDIA2 CTL_CODE(IOCTL_STORAGE_BASE,0x0203,METHOD_BUFFERED,FILE_ANY_ACCESS)
    204 #define IOCTL_STORAGE_RESERVE CTL_CODE(IOCTL_STORAGE_BASE,0x0204,METHOD_BUFFERED,FILE_READ_ACCESS)
    205 #define IOCTL_STORAGE_RELEASE CTL_CODE(IOCTL_STORAGE_BASE,0x0205,METHOD_BUFFERED,FILE_READ_ACCESS)
    206 #define IOCTL_STORAGE_FIND_NEW_DEVICES CTL_CODE(IOCTL_STORAGE_BASE,0x0206,METHOD_BUFFERED,FILE_READ_ACCESS)
    207 
    208 #define IOCTL_STORAGE_EJECTION_CONTROL CTL_CODE(IOCTL_STORAGE_BASE,0x0250,METHOD_BUFFERED,FILE_ANY_ACCESS)
    209 #define IOCTL_STORAGE_MCN_CONTROL CTL_CODE(IOCTL_STORAGE_BASE,0x0251,METHOD_BUFFERED,FILE_ANY_ACCESS)
    210 
    211 #define IOCTL_STORAGE_GET_MEDIA_TYPES CTL_CODE(IOCTL_STORAGE_BASE,0x0300,METHOD_BUFFERED,FILE_ANY_ACCESS)
    212 #define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE,0x0301,METHOD_BUFFERED,FILE_ANY_ACCESS)
    213 #define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE,0x0304,METHOD_BUFFERED,FILE_ANY_ACCESS)
    214 #define IOCTL_STORAGE_GET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE,0x0305,METHOD_BUFFERED,FILE_ANY_ACCESS)
    215 #define IOCTL_STORAGE_SET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE,0x0306,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    216 
    217 #define IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE,0x0400,METHOD_BUFFERED,FILE_READ_ACCESS)
    218 #define IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS)
    219 #define IOCTL_STORAGE_BREAK_RESERVATION CTL_CODE(IOCTL_STORAGE_BASE,0x0405,METHOD_BUFFERED,FILE_READ_ACCESS)
    220 #define IOCTL_STORAGE_PERSISTENT_RESERVE_IN CTL_CODE(IOCTL_STORAGE_BASE, 0x0406, METHOD_BUFFERED, FILE_READ_ACCESS)
    221 #define IOCTL_STORAGE_PERSISTENT_RESERVE_OUT CTL_CODE(IOCTL_STORAGE_BASE, 0x0407, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    222 
    223 #define IOCTL_STORAGE_GET_DEVICE_NUMBER CTL_CODE(IOCTL_STORAGE_BASE,0x0420,METHOD_BUFFERED,FILE_ANY_ACCESS)
    224 #define IOCTL_STORAGE_GET_DEVICE_NUMBER_EX CTL_CODE(IOCTL_STORAGE_BASE,0x0421,METHOD_BUFFERED,FILE_ANY_ACCESS)
    225 #define IOCTL_STORAGE_PREDICT_FAILURE CTL_CODE(IOCTL_STORAGE_BASE,0x0440,METHOD_BUFFERED,FILE_ANY_ACCESS)
    226 #define IOCTL_STORAGE_FAILURE_PREDICTION_CONFIG CTL_CODE(IOCTL_STORAGE_BASE,0x0441,METHOD_BUFFERED,FILE_ANY_ACCESS)
    227 #define IOCTL_STORAGE_GET_COUNTERS CTL_CODE(IOCTL_STORAGE_BASE,0x442,METHOD_BUFFERED,FILE_ANY_ACCESS)
    228 #define IOCTL_STORAGE_READ_CAPACITY CTL_CODE(IOCTL_STORAGE_BASE,0x0450,METHOD_BUFFERED,FILE_READ_ACCESS)
    229 
    230 #define IOCTL_STORAGE_GET_DEVICE_TELEMETRY CTL_CODE(IOCTL_STORAGE_BASE, 0x0470, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    231 #define IOCTL_STORAGE_DEVICE_TELEMETRY_NOTIFY CTL_CODE(IOCTL_STORAGE_BASE, 0x0471, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    232 #define IOCTL_STORAGE_DEVICE_TELEMETRY_QUERY_CAPS CTL_CODE(IOCTL_STORAGE_BASE, 0x0472, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    233 #define IOCTL_STORAGE_GET_DEVICE_TELEMETRY_RAW CTL_CODE(IOCTL_STORAGE_BASE, 0x0473, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    234 
    235 #define IOCTL_STORAGE_SET_TEMPERATURE_THRESHOLD CTL_CODE(IOCTL_STORAGE_BASE, 0x0480, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    236 
    237 #define IOCTL_STORAGE_PROTOCOL_COMMAND CTL_CODE(IOCTL_STORAGE_BASE, 0x04F0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    238 
    239 #define IOCTL_STORAGE_SET_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x04FF, METHOD_BUFFERED, FILE_WRITE_ACCESS)
    240 #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
    241 #define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES CTL_CODE(IOCTL_STORAGE_BASE, 0x0501, METHOD_BUFFERED, FILE_WRITE_ACCESS)
    242 #define IOCTL_STORAGE_GET_LB_PROVISIONING_MAP_RESOURCES CTL_CODE(IOCTL_STORAGE_BASE, 0x0502, METHOD_BUFFERED, FILE_READ_ACCESS)
    243 
    244 #define IOCTL_STORAGE_REINITIALIZE_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0590, METHOD_BUFFERED, FILE_WRITE_ACCESS)
    245 
    246 #define IOCTL_STORAGE_GET_BC_PROPERTIES CTL_CODE(IOCTL_STORAGE_BASE, 0x0600, METHOD_BUFFERED, FILE_READ_ACCESS)
    247 #define IOCTL_STORAGE_ALLOCATE_BC_STREAM CTL_CODE(IOCTL_STORAGE_BASE, 0x0601, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    248 #define IOCTL_STORAGE_FREE_BC_STREAM CTL_CODE(IOCTL_STORAGE_BASE, 0x0602, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    249 
    250 #define IOCTL_STORAGE_CHECK_PRIORITY_HINT_SUPPORT CTL_CODE(IOCTL_STORAGE_BASE, 0x0620, METHOD_BUFFERED, FILE_ANY_ACCESS)
    251 
    252 #define IOCTL_STORAGE_START_DATA_INTEGRITY_CHECK CTL_CODE(IOCTL_STORAGE_BASE, 0x0621, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    253 #define IOCTL_STORAGE_STOP_DATA_INTEGRITY_CHECK CTL_CODE(IOCTL_STORAGE_BASE, 0x0622, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    254 
    255 #define OBSOLETE_IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE,0x0400,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    256 #define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    257 
    258 #define IOCTL_STORAGE_FIRMWARE_GET_INFO CTL_CODE(IOCTL_STORAGE_BASE, 0x0700, METHOD_BUFFERED, FILE_ANY_ACCESS)
    259 #define IOCTL_STORAGE_FIRMWARE_DOWNLOAD CTL_CODE(IOCTL_STORAGE_BASE, 0x0701, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    260 #define IOCTL_STORAGE_FIRMWARE_ACTIVATE CTL_CODE(IOCTL_STORAGE_BASE, 0x0702, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    261 
    262 #define IOCTL_STORAGE_ENABLE_IDLE_POWER CTL_CODE(IOCTL_STORAGE_BASE, 0x0720, METHOD_BUFFERED, FILE_ANY_ACCESS)
    263 #define IOCTL_STORAGE_GET_IDLE_POWERUP_REASON CTL_CODE(IOCTL_STORAGE_BASE, 0x0721, METHOD_BUFFERED, FILE_ANY_ACCESS)
    264 
    265 #define IOCTL_STORAGE_POWER_ACTIVE CTL_CODE(IOCTL_STORAGE_BASE, 0x0722, METHOD_BUFFERED, FILE_ANY_ACCESS)
    266 #define IOCTL_STORAGE_POWER_IDLE CTL_CODE(IOCTL_STORAGE_BASE, 0x0723, METHOD_BUFFERED, FILE_ANY_ACCESS)
    267 
    268 #define IOCTL_STORAGE_EVENT_NOTIFICATION CTL_CODE(IOCTL_STORAGE_BASE, 0x0724, METHOD_BUFFERED, FILE_ANY_ACCESS)
    269 #define IOCTL_STORAGE_DEVICE_POWER_CAP CTL_CODE(IOCTL_STORAGE_BASE, 0x0725, METHOD_BUFFERED, FILE_ANY_ACCESS)
    270 #define IOCTL_STORAGE_RPMB_COMMAND CTL_CODE(IOCTL_STORAGE_BASE, 0x0726, METHOD_BUFFERED, FILE_ANY_ACCESS)
    271 #define IOCTL_STORAGE_ATTRIBUTE_MANAGEMENT CTL_CODE(IOCTL_STORAGE_BASE, 0x0727, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    272 #define IOCTL_STORAGE_DIAGNOSTIC CTL_CODE(IOCTL_STORAGE_BASE, 0x0728, METHOD_BUFFERED, FILE_ANY_ACCESS)
    273 #define IOCTL_STORAGE_GET_PHYSICAL_ELEMENT_STATUS CTL_CODE(IOCTL_STORAGE_BASE, 0x0729, METHOD_BUFFERED, FILE_ANY_ACCESS)
    274 #define IOCTL_STORAGE_REMOVE_ELEMENT_AND_TRUNCATE CTL_CODE(IOCTL_STORAGE_BASE, 0x0730, METHOD_BUFFERED, FILE_ANY_ACCESS)
    275 #define IOCTL_STORAGE_GET_DEVICE_INTERNAL_LOG CTL_CODE(IOCTL_STORAGE_BASE, 0x0731, METHOD_BUFFERED, FILE_ANY_ACCESS)
    276 
    277 typedef struct _STORAGE_READ_CAPACITY {
    278   ULONG Version;
    279   ULONG Size;
    280   ULONG BlockLength;
    281   LARGE_INTEGER NumberOfBlocks;
    282   LARGE_INTEGER DiskLength;
    283 } STORAGE_READ_CAPACITY, *PSTORAGE_READ_CAPACITY;
    284 
    285 #define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES CTL_CODE(IOCTL_STORAGE_BASE, 0x0501, METHOD_BUFFERED, FILE_WRITE_ACCESS)
    286 #define DeviceDsmActionFlag_NonDestructive 0x80000000
    287 #define DeviceDsmAction_None 0
    288 #define DeviceDsmAction_Trim 1
    289 #define DeviceDsmAction_Notification (2 | DeviceDsmActionFlag_NonDestructive)
    290 
    291 #define IsDsmActionNonDestructive(x) ((BOOLEAN)(!!((x) & DeviceDsmActionFlag_NonDestructive)))
    292 
    293 #define DEVICE_DSM_FLAG_ENTIRE_DATA_SET_RANGE __MSABI_LONG(0x00000001)
    294 
    295 #define DEVICE_DSM_NOTIFY_FLAG_BEGIN             0x00000001
    296 #define DEVICE_DSM_NOTIFY_FLAG_END               0x00000002
    297 
    298 #define IOCTL_STORAGE_BC_VERSION                 1
    299 
    300 #define STORAGE_PRIORITY_HINT_SUPPORTED          0x0001
    301 
    302   typedef DWORD DEVICE_DATA_MANAGEMENT_SET_ACTION;
    303   typedef struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES {
    304     DWORD                             Size;
    305     DEVICE_DATA_MANAGEMENT_SET_ACTION Action;
    306     DWORD                             Flags;
    307     DWORD                             ParameterBlockOffset;
    308     DWORD                             ParameterBlockLength;
    309     DWORD                             DataSetRangesOffset;
    310     DWORD                             DataSetRangesLength;
    311   } DEVICE_MANAGE_DATA_SET_ATTRIBUTES, *PDEVICE_MANAGE_DATA_SET_ATTRIBUTES;
    312 
    313   typedef struct _DEVICE_DATA_SET_RANGE {
    314     LONGLONG  StartingOffset;
    315     DWORDLONG LengthInBytes;
    316   } DEVICE_DATA_SET_RANGE, *PDEVICE_DATA_SET_RANGE;
    317 
    318   typedef struct _DEVICE_DSM_NOTIFICATION_PARAMETERS {
    319     ULONG Size;
    320     ULONG Flags;
    321     ULONG NumFileTypeIDs;
    322     GUID FileTypeID[1];
    323   } DEVICE_DSM_NOTIFICATION_PARAMETERS, *PDEVICE_DSM_NOTIFICATION_PARAMETERS;
    324 
    325   typedef struct _STORAGE_GET_BC_PROPERTIES_OUTPUT {
    326     ULONG MaximumRequestsPerPeriod;
    327     ULONG MinimumPeriod;
    328     ULONGLONG MaximumRequestSize;
    329     ULONG EstimatedTimePerRequest;
    330     ULONG NumOutStandingRequests;
    331     ULONGLONG RequestSize;
    332   } STORAGE_GET_BC_PROPERTIES_OUTPUT, *PSTORAGE_GET_BC_PROPERTIES_OUTPUT;
    333 
    334   typedef struct _STORAGE_ALLOCATE_BC_STREAM_INPUT {
    335     ULONG Version;
    336     ULONG RequestsPerPeriod;
    337     ULONG Period;
    338     BOOLEAN RetryFailures;
    339     BOOLEAN Discardable;
    340     BOOLEAN Reserved1[2];
    341     ULONG AccessType;
    342     ULONG AccessMode;
    343   } STORAGE_ALLOCATE_BC_STREAM_INPUT, *PSTORAGE_ALLOCATE_BC_STREAM_INPUT;
    344 
    345   typedef struct _STORAGE_ALLOCATE_BC_STREAM_OUTPUT {
    346     ULONGLONG RequestSize;
    347     ULONG NumOutStandingRequests;
    348   } STORAGE_ALLOCATE_BC_STREAM_OUTPUT, *PSTORAGE_ALLOCATE_BC_STREAM_OUTPUT;
    349 
    350   typedef struct _STORAGE_PRIORITY_HINT_SUPPORT {
    351     ULONG SupportFlags;
    352   } STORAGE_PRIORITY_HINT_SUPPORT, *PSTORAGE_PRIORITY_HINT_SUPPORT;
    353 
    354 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
    355 
    356   typedef struct _STORAGE_MEDIA_SERIAL_NUMBER_DATA {
    357     USHORT Reserved;
    358     USHORT SerialNumberLength;
    359     UCHAR SerialNumber[0];
    360   } STORAGE_MEDIA_SERIAL_NUMBER_DATA, *PSTORAGE_MEDIA_SERIAL_NUMBER_DATA;
    361 
    362   typedef struct _PERSISTENT_RESERVE_COMMAND {
    363     ULONG Version;
    364     ULONG Size;
    365     __C89_NAMELESS union {
    366       struct {
    367         UCHAR ServiceAction:5;
    368         UCHAR Reserved1:3;
    369         USHORT AllocationLength;
    370       } PR_IN;
    371       struct {
    372         UCHAR ServiceAction:5;
    373         UCHAR Reserved1:3;
    374         UCHAR Type:4;
    375         UCHAR Scope:4;
    376         UCHAR ParameterList[0];
    377       } PR_OUT;
    378     } DUMMYUNIONNAME;
    379   } PERSISTENT_RESERVE_COMMAND, *PPERSISTENT_RESERVE_COMMAND;
    380 
    381 #endif /* defined(_MSC_EXTENSIONS) */
    382 
    383   typedef struct _STORAGE_HOTPLUG_INFO {
    384     DWORD Size;
    385     BOOLEAN MediaRemovable;
    386     BOOLEAN MediaHotplug;
    387     BOOLEAN DeviceHotplug;
    388     BOOLEAN WriteCacheEnableOverride;
    389   } STORAGE_HOTPLUG_INFO,*PSTORAGE_HOTPLUG_INFO;
    390 
    391   typedef struct _STORAGE_DEVICE_NUMBER {
    392     DEVICE_TYPE DeviceType;
    393     DWORD DeviceNumber;
    394     DWORD PartitionNumber;
    395   } STORAGE_DEVICE_NUMBER,*PSTORAGE_DEVICE_NUMBER;
    396 
    397   typedef struct _STORAGE_DEVICE_NUMBERS {
    398     DWORD Version;
    399     DWORD Size;
    400     DWORD NumberOfDevices;
    401     STORAGE_DEVICE_NUMBER Devices[ANYSIZE_ARRAY];
    402   } STORAGE_DEVICE_NUMBERS,*PSTORAGE_DEVICE_NUMBERS;
    403 
    404 #define STORAGE_DEVICE_FLAGS_RANDOM_DEVICEGUID_REASON_CONFLICT 0x1
    405 #define STORAGE_DEVICE_FLAGS_RANDOM_DEVICEGUID_REASON_NOHWID 0x2
    406 #define STORAGE_DEVICE_FLAGS_PAGE_83_DEVICEGUID 0x4
    407 
    408   typedef struct _STORAGE_DEVICE_NUMBER_EX {
    409     DWORD Version;
    410     DWORD Size;
    411     DWORD Flags;
    412     DEVICE_TYPE DeviceType;
    413     DWORD DeviceNumber;
    414     GUID DeviceGuid;
    415     DWORD PartitionNumber;
    416   } STORAGE_DEVICE_NUMBER_EX,*PSTORAGE_DEVICE_NUMBER_EX;
    417 
    418   typedef struct _STORAGE_BUS_RESET_REQUEST {
    419     BYTE PathId;
    420   } STORAGE_BUS_RESET_REQUEST,*PSTORAGE_BUS_RESET_REQUEST;
    421 
    422   typedef struct STORAGE_BREAK_RESERVATION_REQUEST {
    423     DWORD Length;
    424     BYTE _unused;
    425     BYTE PathId;
    426     BYTE TargetId;
    427     BYTE Lun;
    428   } STORAGE_BREAK_RESERVATION_REQUEST,*PSTORAGE_BREAK_RESERVATION_REQUEST;
    429 
    430   typedef struct _PREVENT_MEDIA_REMOVAL {
    431     BOOLEAN PreventMediaRemoval;
    432   } PREVENT_MEDIA_REMOVAL,*PPREVENT_MEDIA_REMOVAL;
    433 
    434   typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
    435     DWORD MediaChangeCount;
    436     DWORD NewState;
    437   } CLASS_MEDIA_CHANGE_CONTEXT,*PCLASS_MEDIA_CHANGE_CONTEXT;
    438 
    439   typedef struct _TAPE_STATISTICS {
    440     DWORD Version;
    441     DWORD Flags;
    442     LARGE_INTEGER RecoveredWrites;
    443     LARGE_INTEGER UnrecoveredWrites;
    444     LARGE_INTEGER RecoveredReads;
    445     LARGE_INTEGER UnrecoveredReads;
    446     BYTE CompressionRatioReads;
    447     BYTE CompressionRatioWrites;
    448   } TAPE_STATISTICS,*PTAPE_STATISTICS;
    449 
    450 #define RECOVERED_WRITES_VALID 0x00000001
    451 #define UNRECOVERED_WRITES_VALID 0x00000002
    452 #define RECOVERED_READS_VALID 0x00000004
    453 #define UNRECOVERED_READS_VALID 0x00000008
    454 #define WRITE_COMPRESSION_INFO_VALID 0x00000010
    455 #define READ_COMPRESSION_INFO_VALID 0x00000020
    456 
    457   typedef struct _TAPE_GET_STATISTICS {
    458     DWORD Operation;
    459   } TAPE_GET_STATISTICS,*PTAPE_GET_STATISTICS;
    460 
    461 #define TAPE_RETURN_STATISTICS __MSABI_LONG(0)
    462 #define TAPE_RETURN_ENV_INFO __MSABI_LONG(1)
    463 #define TAPE_RESET_STATISTICS __MSABI_LONG(2)
    464 
    465   typedef enum _STORAGE_MEDIA_TYPE {
    466     DDS_4mm = 0x20,
    467     MiniQic,
    468     Travan,
    469     QIC,
    470     MP_8mm,
    471     AME_8mm,
    472     AIT1_8mm,
    473     DLT,
    474     NCTP,
    475     IBM_3480,
    476     IBM_3490E,
    477     IBM_Magstar_3590,
    478     IBM_Magstar_MP,
    479     STK_DATA_D3,
    480     SONY_DTF,
    481     DV_6mm,
    482     DMI,
    483     SONY_D2,
    484     CLEANER_CARTRIDGE,
    485     CD_ROM,
    486     CD_R,
    487     CD_RW,
    488     DVD_ROM,
    489     DVD_R,
    490     DVD_RW,
    491     MO_3_RW,
    492     MO_5_WO,
    493     MO_5_RW,
    494     MO_5_LIMDOW,
    495     PC_5_WO,
    496     PC_5_RW,
    497     PD_5_RW,
    498     ABL_5_WO,
    499     PINNACLE_APEX_5_RW,
    500     SONY_12_WO,
    501     PHILIPS_12_WO,
    502     HITACHI_12_WO,
    503     CYGNET_12_WO,
    504     KODAK_14_WO,
    505     MO_NFR_525,
    506     NIKON_12_RW,
    507     IOMEGA_ZIP,
    508     IOMEGA_JAZ,
    509     SYQUEST_EZ135,
    510     SYQUEST_EZFLYER,
    511     SYQUEST_SYJET,
    512     AVATAR_F2,
    513     MP2_8mm,
    514     DST_S,
    515     DST_M,
    516     DST_L,
    517     VXATape_1,
    518     VXATape_2,
    519     STK_9840,
    520     LTO_Ultrium,
    521     LTO_Accelis,
    522     DVD_RAM,
    523     AIT_8mm,
    524     ADR_1,
    525     ADR_2,
    526     STK_9940,
    527     SAIT,
    528     VXATape
    529   } STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
    530 
    531 #define MEDIA_ERASEABLE 0x00000001
    532 #define MEDIA_WRITE_ONCE 0x00000002
    533 #define MEDIA_READ_ONLY 0x00000004
    534 #define MEDIA_READ_WRITE 0x00000008
    535 
    536 #define MEDIA_WRITE_PROTECTED 0x00000100
    537 #define MEDIA_CURRENTLY_MOUNTED 0x80000000
    538 
    539   typedef enum _STORAGE_BUS_TYPE {
    540     BusTypeUnknown             = 0x00,
    541     BusTypeScsi                = 0x1,
    542     BusTypeAtapi               = 0x2,
    543     BusTypeAta                 = 0x3,
    544     BusType1394                = 0x4,
    545     BusTypeSsa                 = 0x5,
    546     BusTypeFibre               = 0x6,
    547     BusTypeUsb                 = 0x7,
    548     BusTypeRAID                = 0x8,
    549 #if (_WIN32_WINNT >= 0x0600)
    550     BusTypeiScsi               = 0x9,
    551     BusTypeSas                 = 0xA,
    552     BusTypeSata                = 0xB,
    553     BusTypeSd                  = 0xC,
    554     BusTypeMmc                 = 0xD,
    555 #endif /*(_WIN32_WINNT >= 0x0600)*/
    556 #if (_WIN32_WINNT >= 0x0601)
    557     BusTypeVirtual             = 0xE,
    558     BusTypeFileBackedVirtual   = 0xF,
    559     BusTypeSpaces              = 0x10,
    560     BusTypeNvme                = 0x11,
    561     BusTypeSCM                 = 0x12,
    562     BusTypeUfs                 = 0x13,
    563 #endif /*(_WIN32_WINNT >= 0x0601)*/
    564     BusTypeMax,
    565     BusTypeMaxReserved         = 0x7F 
    566   } STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
    567 
    568 #define SupportsDeviceSharing(BusType) ((BusType == BusTypeScsi) || (BusType == BusTypeFibre) || (BusType == BusTypeiScsi) || (BusType == BusTypeSas) || (BusType == BusTypeSpaces))
    569 
    570   typedef struct _DEVICE_MEDIA_INFO {
    571     union {
    572       struct {
    573 	LARGE_INTEGER Cylinders;
    574 	STORAGE_MEDIA_TYPE MediaType;
    575 	DWORD TracksPerCylinder;
    576 	DWORD SectorsPerTrack;
    577 	DWORD BytesPerSector;
    578 	DWORD NumberMediaSides;
    579 	DWORD MediaCharacteristics;
    580       } DiskInfo;
    581       struct {
    582 	LARGE_INTEGER Cylinders;
    583 	STORAGE_MEDIA_TYPE MediaType;
    584 	DWORD TracksPerCylinder;
    585 	DWORD SectorsPerTrack;
    586 	DWORD BytesPerSector;
    587 	DWORD NumberMediaSides;
    588 	DWORD MediaCharacteristics;
    589       } RemovableDiskInfo;
    590       struct {
    591 	STORAGE_MEDIA_TYPE MediaType;
    592 	DWORD MediaCharacteristics;
    593 	DWORD CurrentBlockSize;
    594 	STORAGE_BUS_TYPE BusType;
    595 	union {
    596 	  struct {
    597 	    BYTE MediumType;
    598 	    BYTE DensityCode;
    599 	  } ScsiInformation;
    600 	} BusSpecificData;
    601       } TapeInfo;
    602     } DeviceSpecific;
    603   } DEVICE_MEDIA_INFO,*PDEVICE_MEDIA_INFO;
    604 
    605   typedef struct _GET_MEDIA_TYPES {
    606     DWORD DeviceType;
    607     DWORD MediaInfoCount;
    608     DEVICE_MEDIA_INFO MediaInfo[1];
    609   } GET_MEDIA_TYPES,*PGET_MEDIA_TYPES;
    610 
    611   typedef struct _STORAGE_PREDICT_FAILURE {
    612     DWORD PredictFailure;
    613     BYTE VendorSpecific[512];
    614   } STORAGE_PREDICT_FAILURE,*PSTORAGE_PREDICT_FAILURE;
    615 
    616   typedef struct _STORAGE_FAILURE_PREDICTION_CONFIG {
    617     DWORD Version;
    618     DWORD Size;
    619     BOOLEAN Set;
    620     BOOLEAN Enabled;
    621     WORD Reserved;
    622   } STORAGE_FAILURE_PREDICTION_CONFIG,*PSTORAGE_FAILURE_PREDICTION_CONFIG;
    623 
    624 #define STORAGE_FAILURE_PREDICTION_CONFIG_V1 1
    625 
    626 #ifdef __cplusplus
    627 }
    628 #endif
    629 #endif /* _NTDDSTOR_H_ */
    630 
    631 
    632 #ifndef _NTDDDISK_H_
    633 #define _NTDDDISK_H_
    634 
    635 #define IOCTL_DISK_BASE FILE_DEVICE_DISK
    636 #define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE,0x0000,METHOD_BUFFERED,FILE_ANY_ACCESS)
    637 #define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,0x0001,METHOD_BUFFERED,FILE_READ_ACCESS)
    638 #define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,0x0002,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    639 #define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0003,METHOD_BUFFERED,FILE_READ_ACCESS)
    640 #define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0004,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    641 #define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x0005,METHOD_BUFFERED,FILE_ANY_ACCESS)
    642 #define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE,0x0006,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    643 #define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE,0x0007,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    644 #define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE,0x0008,METHOD_BUFFERED,FILE_ANY_ACCESS)
    645 #define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE,0x0009,METHOD_BUFFERED,FILE_ANY_ACCESS)
    646 #define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE,0x000a,METHOD_BUFFERED,FILE_ANY_ACCESS)
    647 #define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE,0x000b,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    648 #define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,0x000c,METHOD_BUFFERED,FILE_ANY_ACCESS)
    649 #define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE,0x000d,METHOD_BUFFERED,FILE_ANY_ACCESS)
    650 #define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE,0x000e,METHOD_BUFFERED,FILE_ANY_ACCESS)
    651 #define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,0x000f,METHOD_BUFFERED,FILE_ANY_ACCESS)
    652 #define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE,0x0010,METHOD_BUFFERED,FILE_ANY_ACCESS)
    653 #define IOCTL_DISK_PERFORMANCE_OFF CTL_CODE(IOCTL_DISK_BASE,0x0018,METHOD_BUFFERED,FILE_ANY_ACCESS)
    654 #define IOCTL_DISK_CONTROLLER_NUMBER CTL_CODE(IOCTL_DISK_BASE,0x0011,METHOD_BUFFERED,FILE_ANY_ACCESS)
    655 
    656 #define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE,0x0020,METHOD_BUFFERED,FILE_READ_ACCESS)
    657 #define SMART_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE,0x0021,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    658 #define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE,0x0022,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    659 
    660 #define IOCTL_DISK_GET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x0012,METHOD_BUFFERED,FILE_ANY_ACCESS)
    661 #define IOCTL_DISK_SET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x0013,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    662 #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x0014,METHOD_BUFFERED,FILE_ANY_ACCESS)
    663 #define IOCTL_DISK_SET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x0015,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    664 #define IOCTL_DISK_CREATE_DISK CTL_CODE(IOCTL_DISK_BASE,0x0016,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    665 #define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE,0x0017,METHOD_BUFFERED,FILE_READ_ACCESS)
    666 #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE,0x0028,METHOD_BUFFERED,FILE_ANY_ACCESS)
    667 
    668 #define IOCTL_DISK_REASSIGN_BLOCKS_EX CTL_CODE(IOCTL_DISK_BASE,0x0029,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    669 #define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE,0x0032,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    670 #define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE,0x0034,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    671 #define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x0035,METHOD_BUFFERED,FILE_READ_ACCESS)
    672 #define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x0036,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    673 #define OBSOLETE_DISK_GET_WRITE_CACHE_STATE CTL_CODE(IOCTL_DISK_BASE,0x0037,METHOD_BUFFERED,FILE_READ_ACCESS)
    674 #define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0040,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    675 #define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE,0x0050,METHOD_BUFFERED,FILE_ANY_ACCESS)
    676 #define IOCTL_DISK_RESET_SNAPSHOT_INFO CTL_CODE(IOCTL_DISK_BASE,0x0084,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    677 #define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE,0x00f3,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    678 #define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE,0x00f8,METHOD_BUFFERED,FILE_ANY_ACCESS)
    679 #define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x0200,METHOD_BUFFERED,FILE_READ_ACCESS)
    680 #define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE,0x0201,METHOD_BUFFERED,FILE_READ_ACCESS)
    681 #define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x0202,METHOD_BUFFERED,FILE_READ_ACCESS)
    682 #define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x0203,METHOD_BUFFERED,FILE_READ_ACCESS)
    683 #define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE,0x0204,METHOD_BUFFERED,FILE_READ_ACCESS)
    684 #define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE,0x0205,METHOD_BUFFERED,FILE_READ_ACCESS)
    685 #define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE,0x0206,METHOD_BUFFERED,FILE_READ_ACCESS)
    686 #define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE,0x0300,METHOD_BUFFERED,FILE_ANY_ACCESS)
    687 #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
    688 
    689 #define PARTITION_ENTRY_UNUSED 0x00
    690 #define PARTITION_FAT_12 0x01
    691 #define PARTITION_XENIX_1 0x02
    692 #define PARTITION_XENIX_2 0x03
    693 #define PARTITION_FAT_16 0x04
    694 #define PARTITION_EXTENDED 0x05
    695 #define PARTITION_HUGE 0x06
    696 #define PARTITION_IFS 0x07
    697 #define PARTITION_OS2BOOTMGR 0x0A
    698 #define PARTITION_FAT32 0x0B
    699 #define PARTITION_FAT32_XINT13 0x0C
    700 #define PARTITION_XINT13 0x0E
    701 #define PARTITION_XINT13_EXTENDED 0x0F
    702 #define PARTITION_PREP 0x41
    703 #define PARTITION_LDM 0x42
    704 #define PARTITION_UNIX 0x63
    705 
    706 #define VALID_NTFT 0xC0
    707 
    708 #define PARTITION_NTFT 0x80
    709 
    710 #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))
    711 #define IsContainerPartition(PartitionType) ((PartitionType==PARTITION_EXTENDED) || (PartitionType==PARTITION_XINT13_EXTENDED))
    712 #define IsFTPartition(PartitionType) (((PartitionType)&PARTITION_NTFT) && IsRecognizedPartition(PartitionType))
    713 
    714 typedef enum _MEDIA_TYPE {
    715   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,
    716   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,
    717   F3_230Mb_512,F8_256_128,F3_200Mb_512,F3_240M_512,F3_32M_512
    718 } MEDIA_TYPE,*PMEDIA_TYPE;
    719 
    720 typedef struct _FORMAT_PARAMETERS {
    721   MEDIA_TYPE MediaType;
    722   DWORD StartCylinderNumber;
    723   DWORD EndCylinderNumber;
    724   DWORD StartHeadNumber;
    725   DWORD EndHeadNumber;
    726 } FORMAT_PARAMETERS,*PFORMAT_PARAMETERS;
    727 
    728 typedef WORD BAD_TRACK_NUMBER;
    729 typedef WORD *PBAD_TRACK_NUMBER;
    730 
    731 typedef struct _FORMAT_EX_PARAMETERS {
    732   MEDIA_TYPE MediaType;
    733   DWORD StartCylinderNumber;
    734   DWORD EndCylinderNumber;
    735   DWORD StartHeadNumber;
    736   DWORD EndHeadNumber;
    737   WORD FormatGapLength;
    738   WORD SectorsPerTrack;
    739   WORD SectorNumber[1];
    740 } FORMAT_EX_PARAMETERS,*PFORMAT_EX_PARAMETERS;
    741 
    742 typedef struct _DISK_GEOMETRY {
    743   LARGE_INTEGER Cylinders;
    744   MEDIA_TYPE MediaType;
    745   DWORD TracksPerCylinder;
    746   DWORD SectorsPerTrack;
    747   DWORD BytesPerSector;
    748 } DISK_GEOMETRY,*PDISK_GEOMETRY;
    749 
    750 #define WMI_DISK_GEOMETRY_GUID { 0x25007f51,0x57c2,0x11d1,{ 0xa5,0x28,0x0,0xa0,0xc9,0x6,0x29,0x10 } }
    751 
    752 typedef struct _PARTITION_INFORMATION {
    753   LARGE_INTEGER StartingOffset;
    754   LARGE_INTEGER PartitionLength;
    755   DWORD HiddenSectors;
    756   DWORD PartitionNumber;
    757   BYTE PartitionType;
    758   BOOLEAN BootIndicator;
    759   BOOLEAN RecognizedPartition;
    760   BOOLEAN RewritePartition;
    761 } PARTITION_INFORMATION,*PPARTITION_INFORMATION;
    762 
    763 typedef struct _SET_PARTITION_INFORMATION {
    764   BYTE PartitionType;
    765 } SET_PARTITION_INFORMATION,*PSET_PARTITION_INFORMATION;
    766 
    767 typedef struct _DRIVE_LAYOUT_INFORMATION {
    768   DWORD PartitionCount;
    769   DWORD Signature;
    770   PARTITION_INFORMATION PartitionEntry[1];
    771 } DRIVE_LAYOUT_INFORMATION,*PDRIVE_LAYOUT_INFORMATION;
    772 
    773 typedef struct _VERIFY_INFORMATION {
    774   LARGE_INTEGER StartingOffset;
    775   DWORD Length;
    776 } VERIFY_INFORMATION,*PVERIFY_INFORMATION;
    777 
    778 typedef struct _REASSIGN_BLOCKS {
    779   WORD Reserved;
    780   WORD Count;
    781   DWORD BlockNumber[1];
    782 } REASSIGN_BLOCKS,*PREASSIGN_BLOCKS;
    783 
    784 #include <pshpack1.h>
    785 typedef struct _REASSIGN_BLOCKS_EX {
    786   WORD Reserved;
    787   WORD Count;
    788   LARGE_INTEGER BlockNumber[1];
    789 } REASSIGN_BLOCKS_EX,*PREASSIGN_BLOCKS_EX;
    790 #include <poppack.h>
    791 
    792 typedef enum _PARTITION_STYLE {
    793   PARTITION_STYLE_MBR,PARTITION_STYLE_GPT,PARTITION_STYLE_RAW
    794 } PARTITION_STYLE;
    795 
    796 typedef struct _PARTITION_INFORMATION_GPT {
    797   GUID PartitionType;
    798   GUID PartitionId;
    799   DWORD64 Attributes;
    800   WCHAR Name [36];
    801 } PARTITION_INFORMATION_GPT,*PPARTITION_INFORMATION_GPT;
    802 
    803 #define GPT_ATTRIBUTE_PLATFORM_REQUIRED (0x0000000000000001)
    804 
    805 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER (0x8000000000000000)
    806 #define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN (0x4000000000000000)
    807 #define GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY (0x2000000000000000)
    808 #define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY (0x1000000000000000)
    809 
    810 typedef struct _PARTITION_INFORMATION_MBR {
    811   BYTE PartitionType;
    812   BOOLEAN BootIndicator;
    813   BOOLEAN RecognizedPartition;
    814   DWORD HiddenSectors;
    815 #if NTDDI_VERSION > NTDDI_WINBLUE
    816   GUID PartitionId;
    817 #endif
    818 } PARTITION_INFORMATION_MBR,*PPARTITION_INFORMATION_MBR;
    819 
    820 typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
    821 typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
    822 
    823 typedef struct _SET_PARTITION_INFORMATION_EX {
    824   PARTITION_STYLE PartitionStyle;
    825   __C89_NAMELESS union {
    826     SET_PARTITION_INFORMATION_MBR Mbr;
    827     SET_PARTITION_INFORMATION_GPT Gpt;
    828   } DUMMYUNIONNAME;
    829 } SET_PARTITION_INFORMATION_EX,*PSET_PARTITION_INFORMATION_EX;
    830 
    831 typedef struct _CREATE_DISK_GPT {
    832   GUID DiskId;
    833   DWORD MaxPartitionCount;
    834 } CREATE_DISK_GPT,*PCREATE_DISK_GPT;
    835 
    836 typedef struct _CREATE_DISK_MBR {
    837   DWORD Signature;
    838 } CREATE_DISK_MBR,*PCREATE_DISK_MBR;
    839 
    840 typedef struct _CREATE_DISK {
    841   PARTITION_STYLE PartitionStyle;
    842   __C89_NAMELESS union {
    843     CREATE_DISK_MBR Mbr;
    844     CREATE_DISK_GPT Gpt;
    845   } DUMMYUNIONNAME;
    846 } CREATE_DISK,*PCREATE_DISK;
    847 
    848 typedef struct _GET_LENGTH_INFORMATION {
    849   LARGE_INTEGER Length;
    850 } GET_LENGTH_INFORMATION,*PGET_LENGTH_INFORMATION;
    851 
    852 typedef struct _PARTITION_INFORMATION_EX {
    853   PARTITION_STYLE PartitionStyle;
    854   LARGE_INTEGER StartingOffset;
    855   LARGE_INTEGER PartitionLength;
    856   DWORD PartitionNumber;
    857   BOOLEAN RewritePartition;
    858 #if NTDDI_VERSION >= NTDDI_WIN10_RS3
    859   BOOLEAN  IsServicePartition;
    860 #endif
    861   __C89_NAMELESS union {
    862     PARTITION_INFORMATION_MBR Mbr;
    863     PARTITION_INFORMATION_GPT Gpt;
    864   } DUMMYUNIONNAME;
    865 } PARTITION_INFORMATION_EX,*PPARTITION_INFORMATION_EX;
    866 
    867 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
    868   GUID DiskId;
    869   LARGE_INTEGER StartingUsableOffset;
    870   LARGE_INTEGER UsableLength;
    871   DWORD MaxPartitionCount;
    872 } DRIVE_LAYOUT_INFORMATION_GPT,*PDRIVE_LAYOUT_INFORMATION_GPT;
    873 
    874 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
    875   DWORD Signature;
    876 } DRIVE_LAYOUT_INFORMATION_MBR,*PDRIVE_LAYOUT_INFORMATION_MBR;
    877 
    878 typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
    879   DWORD PartitionStyle;
    880   DWORD PartitionCount;
    881   __C89_NAMELESS union {
    882     DRIVE_LAYOUT_INFORMATION_MBR Mbr;
    883     DRIVE_LAYOUT_INFORMATION_GPT Gpt;
    884   } DUMMYUNIONNAME;
    885   PARTITION_INFORMATION_EX PartitionEntry[1];
    886 } DRIVE_LAYOUT_INFORMATION_EX,*PDRIVE_LAYOUT_INFORMATION_EX;
    887 
    888 typedef enum _DETECTION_TYPE {
    889   DetectNone,DetectInt13,DetectExInt13
    890 } DETECTION_TYPE;
    891 
    892 typedef struct _DISK_INT13_INFO {
    893   WORD DriveSelect;
    894   DWORD MaxCylinders;
    895   WORD SectorsPerTrack;
    896   WORD MaxHeads;
    897   WORD NumberDrives;
    898 } DISK_INT13_INFO,*PDISK_INT13_INFO;
    899 
    900 typedef struct _DISK_EX_INT13_INFO {
    901   WORD ExBufferSize;
    902   WORD ExFlags;
    903   DWORD ExCylinders;
    904   DWORD ExHeads;
    905   DWORD ExSectorsPerTrack;
    906   DWORD64 ExSectorsPerDrive;
    907   WORD ExSectorSize;
    908   WORD ExReserved;
    909 } DISK_EX_INT13_INFO,*PDISK_EX_INT13_INFO;
    910 
    911 typedef struct _DISK_DETECTION_INFO {
    912   DWORD SizeOfDetectInfo;
    913   DETECTION_TYPE DetectionType;
    914   __C89_NAMELESS union {
    915     __C89_NAMELESS struct {
    916       DISK_INT13_INFO Int13;
    917       DISK_EX_INT13_INFO ExInt13;
    918     } DUMMYSTRUCTNAME;
    919   } DUMMYUNIONNAME;
    920 } DISK_DETECTION_INFO,*PDISK_DETECTION_INFO;
    921 
    922 typedef struct _DISK_PARTITION_INFO {
    923   DWORD SizeOfPartitionInfo;
    924   PARTITION_STYLE PartitionStyle;
    925   __C89_NAMELESS union {
    926     struct {
    927       DWORD Signature;
    928       DWORD CheckSum;
    929     } Mbr;
    930     struct {
    931       GUID DiskId;
    932     } Gpt;
    933   } DUMMYUNIONNAME;
    934 } DISK_PARTITION_INFO,*PDISK_PARTITION_INFO;
    935 
    936 #define DiskGeometryGetPartition(Geometry) ((PDISK_PARTITION_INFO)((Geometry)->Data))
    937 #define DiskGeometryGetDetect(Geometry) ((PDISK_DETECTION_INFO)(((DWORD_PTR)DiskGeometryGetPartition(Geometry)+ DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
    938 
    939 typedef struct _DISK_GEOMETRY_EX {
    940   DISK_GEOMETRY Geometry;
    941   LARGE_INTEGER DiskSize;
    942   BYTE Data[1];
    943 } DISK_GEOMETRY_EX,*PDISK_GEOMETRY_EX;
    944 
    945 typedef struct _DISK_CONTROLLER_NUMBER {
    946   DWORD ControllerNumber;
    947   DWORD DiskNumber;
    948 } DISK_CONTROLLER_NUMBER,*PDISK_CONTROLLER_NUMBER;
    949 
    950 typedef enum {
    951   EqualPriority,KeepPrefetchedData,KeepReadData
    952 } DISK_CACHE_RETENTION_PRIORITY;
    953 
    954 typedef struct _DISK_CACHE_INFORMATION {
    955   BOOLEAN ParametersSavable;
    956   BOOLEAN ReadCacheEnabled;
    957   BOOLEAN WriteCacheEnabled;
    958   DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
    959   DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
    960   WORD DisablePrefetchTransferLength;
    961   BOOLEAN PrefetchScalar;
    962   __C89_NAMELESS union {
    963     struct {
    964       WORD Minimum;
    965       WORD Maximum;
    966       WORD MaximumBlocks;
    967     } ScalarPrefetch;
    968     struct {
    969       WORD Minimum;
    970       WORD Maximum;
    971     } BlockPrefetch;
    972   } DUMMYUNIONNAME;
    973 } DISK_CACHE_INFORMATION,*PDISK_CACHE_INFORMATION;
    974 
    975 typedef struct _DISK_GROW_PARTITION {
    976   DWORD PartitionNumber;
    977   LARGE_INTEGER BytesToGrow;
    978 } DISK_GROW_PARTITION,*PDISK_GROW_PARTITION;
    979 
    980 #define HIST_NO_OF_BUCKETS 24
    981 
    982 typedef struct _HISTOGRAM_BUCKET {
    983   DWORD Reads;
    984   DWORD Writes;
    985 } HISTOGRAM_BUCKET,*PHISTOGRAM_BUCKET;
    986 
    987 #define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET)
    988 
    989 typedef struct _DISK_HISTOGRAM {
    990   LARGE_INTEGER DiskSize;
    991   LARGE_INTEGER Start;
    992   LARGE_INTEGER End;
    993   LARGE_INTEGER Average;
    994   LARGE_INTEGER AverageRead;
    995   LARGE_INTEGER AverageWrite;
    996   DWORD Granularity;
    997   DWORD Size;
    998   DWORD ReadCount;
    999   DWORD WriteCount;
   1000   PHISTOGRAM_BUCKET Histogram;
   1001 } DISK_HISTOGRAM,*PDISK_HISTOGRAM;
   1002 
   1003 #define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM)
   1004 
   1005 typedef struct _DISK_PERFORMANCE {
   1006   LARGE_INTEGER BytesRead;
   1007   LARGE_INTEGER BytesWritten;
   1008   LARGE_INTEGER ReadTime;
   1009   LARGE_INTEGER WriteTime;
   1010   LARGE_INTEGER IdleTime;
   1011   DWORD ReadCount;
   1012   DWORD WriteCount;
   1013   DWORD QueueDepth;
   1014   DWORD SplitCount;
   1015   LARGE_INTEGER QueryTime;
   1016   DWORD StorageDeviceNumber;
   1017   WCHAR StorageManagerName[8];
   1018 } DISK_PERFORMANCE,*PDISK_PERFORMANCE;
   1019 
   1020 typedef struct _DISK_RECORD {
   1021   LARGE_INTEGER ByteOffset;
   1022   LARGE_INTEGER StartTime;
   1023   LARGE_INTEGER EndTime;
   1024   PVOID VirtualAddress;
   1025   DWORD NumberOfBytes;
   1026   BYTE DeviceNumber;
   1027   BOOLEAN ReadRequest;
   1028 } DISK_RECORD,*PDISK_RECORD;
   1029 
   1030 typedef struct _DISK_LOGGING {
   1031   BYTE Function;
   1032   PVOID BufferAddress;
   1033   DWORD BufferSize;
   1034 } DISK_LOGGING,*PDISK_LOGGING;
   1035 
   1036 #define DISK_LOGGING_START 0
   1037 #define DISK_LOGGING_STOP 1
   1038 #define DISK_LOGGING_DUMP 2
   1039 #define DISK_BINNING 3
   1040 
   1041 typedef enum _BIN_TYPES {
   1042   RequestSize,RequestLocation
   1043 } BIN_TYPES;
   1044 
   1045 typedef struct _BIN_RANGE {
   1046   LARGE_INTEGER StartValue;
   1047   LARGE_INTEGER Length;
   1048 } BIN_RANGE,*PBIN_RANGE;
   1049 
   1050 typedef struct _PERF_BIN {
   1051   DWORD NumberOfBins;
   1052   DWORD TypeOfBin;
   1053   BIN_RANGE BinsRanges[1];
   1054 } PERF_BIN,*PPERF_BIN;
   1055 
   1056 typedef struct _BIN_COUNT {
   1057   BIN_RANGE BinRange;
   1058   DWORD BinCount;
   1059 } BIN_COUNT,*PBIN_COUNT;
   1060 
   1061 typedef struct _BIN_RESULTS {
   1062   DWORD NumberOfBins;
   1063   BIN_COUNT BinCounts[1];
   1064 } BIN_RESULTS,*PBIN_RESULTS;
   1065 
   1066 #include <pshpack1.h>
   1067 typedef struct _GETVERSIONINPARAMS {
   1068   BYTE bVersion;
   1069   BYTE bRevision;
   1070   BYTE bReserved;
   1071   BYTE bIDEDeviceMap;
   1072   DWORD fCapabilities;
   1073   DWORD dwReserved[4];
   1074 } GETVERSIONINPARAMS,*PGETVERSIONINPARAMS,*LPGETVERSIONINPARAMS;
   1075 #include <poppack.h>
   1076 
   1077 #define CAP_ATA_ID_CMD 1
   1078 #define CAP_ATAPI_ID_CMD 2
   1079 #define CAP_SMART_CMD 4
   1080 
   1081 #include <pshpack1.h>
   1082 typedef struct _IDEREGS {
   1083   BYTE bFeaturesReg;
   1084   BYTE bSectorCountReg;
   1085   BYTE bSectorNumberReg;
   1086   BYTE bCylLowReg;
   1087   BYTE bCylHighReg;
   1088   BYTE bDriveHeadReg;
   1089   BYTE bCommandReg;
   1090   BYTE bReserved;
   1091 } IDEREGS,*PIDEREGS,*LPIDEREGS;
   1092 #include <poppack.h>
   1093 
   1094 #define ATAPI_ID_CMD 0xA1
   1095 #define ID_CMD 0xEC
   1096 #define SMART_CMD 0xB0
   1097 
   1098 #define SMART_CYL_LOW 0x4F
   1099 #define SMART_CYL_HI 0xC2
   1100 
   1101 #include <pshpack1.h>
   1102 typedef struct _SENDCMDINPARAMS {
   1103   DWORD cBufferSize;
   1104   IDEREGS irDriveRegs;
   1105   BYTE bDriveNumber;
   1106   BYTE bReserved[3];
   1107   DWORD dwReserved[4];
   1108   BYTE bBuffer[1];
   1109 } SENDCMDINPARAMS,*PSENDCMDINPARAMS,*LPSENDCMDINPARAMS;
   1110 #include <poppack.h>
   1111 
   1112 #include <pshpack1.h>
   1113 typedef struct _DRIVERSTATUS {
   1114   BYTE bDriverError;
   1115   BYTE bIDEError;
   1116   BYTE bReserved[2];
   1117   DWORD dwReserved[2];
   1118 } DRIVERSTATUS,*PDRIVERSTATUS,*LPDRIVERSTATUS;
   1119 #include <poppack.h>
   1120 
   1121 #define SMART_NO_ERROR 0
   1122 #define SMART_IDE_ERROR 1
   1123 #define SMART_INVALID_FLAG 2
   1124 #define SMART_INVALID_COMMAND 3
   1125 #define SMART_INVALID_BUFFER 4
   1126 #define SMART_INVALID_DRIVE 5
   1127 #define SMART_INVALID_IOCTL 6
   1128 #define SMART_ERROR_NO_MEM 7
   1129 #define SMART_INVALID_REGISTER 8
   1130 #define SMART_NOT_SUPPORTED 9
   1131 #define SMART_NO_IDE_DEVICE 10
   1132 
   1133 #define SMART_OFFLINE_ROUTINE_OFFLINE 0
   1134 #define SMART_SHORT_SELFTEST_OFFLINE 1
   1135 #define SMART_EXTENDED_SELFTEST_OFFLINE 2
   1136 #define SMART_ABORT_OFFLINE_SELFTEST 127
   1137 #define SMART_SHORT_SELFTEST_CAPTIVE 129
   1138 #define SMART_EXTENDED_SELFTEST_CAPTIVE 130
   1139 
   1140 #include <pshpack1.h>
   1141 typedef struct _SENDCMDOUTPARAMS {
   1142   DWORD cBufferSize;
   1143   DRIVERSTATUS DriverStatus;
   1144   BYTE bBuffer[1];
   1145 } SENDCMDOUTPARAMS,*PSENDCMDOUTPARAMS,*LPSENDCMDOUTPARAMS;
   1146 #include <poppack.h>
   1147 
   1148 #define READ_ATTRIBUTE_BUFFER_SIZE 512
   1149 #define IDENTIFY_BUFFER_SIZE 512
   1150 #define READ_THRESHOLD_BUFFER_SIZE 512
   1151 #define SMART_LOG_SECTOR_SIZE 512
   1152 
   1153 #define READ_ATTRIBUTES 0xD0
   1154 #define READ_THRESHOLDS 0xD1
   1155 #define ENABLE_DISABLE_AUTOSAVE 0xD2
   1156 #define SAVE_ATTRIBUTE_VALUES 0xD3
   1157 #define EXECUTE_OFFLINE_DIAGS 0xD4
   1158 #define SMART_READ_LOG 0xD5
   1159 #define SMART_WRITE_LOG 0xd6
   1160 #define ENABLE_SMART 0xD8
   1161 #define DISABLE_SMART 0xD9
   1162 #define RETURN_SMART_STATUS 0xDA
   1163 #define ENABLE_DISABLE_AUTO_OFFLINE 0xDB
   1164 
   1165 #endif /* _NTDDDISK_H_ */
   1166 
   1167 
   1168 #define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER
   1169 #define IOCTL_CHANGER_GET_PARAMETERS CTL_CODE(IOCTL_CHANGER_BASE,0x0000,METHOD_BUFFERED,FILE_READ_ACCESS)
   1170 #define IOCTL_CHANGER_GET_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0001,METHOD_BUFFERED,FILE_READ_ACCESS)
   1171 #define IOCTL_CHANGER_GET_PRODUCT_DATA CTL_CODE(IOCTL_CHANGER_BASE,0x0002,METHOD_BUFFERED,FILE_READ_ACCESS)
   1172 #define IOCTL_CHANGER_SET_ACCESS CTL_CODE(IOCTL_CHANGER_BASE,0x0004,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   1173 #define IOCTL_CHANGER_GET_ELEMENT_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0005,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   1174 #define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0006,METHOD_BUFFERED,FILE_READ_ACCESS)
   1175 #define IOCTL_CHANGER_SET_POSITION CTL_CODE(IOCTL_CHANGER_BASE,0x0007,METHOD_BUFFERED,FILE_READ_ACCESS)
   1176 #define IOCTL_CHANGER_EXCHANGE_MEDIUM CTL_CODE(IOCTL_CHANGER_BASE,0x0008,METHOD_BUFFERED,FILE_READ_ACCESS)
   1177 #define IOCTL_CHANGER_MOVE_MEDIUM CTL_CODE(IOCTL_CHANGER_BASE,0x0009,METHOD_BUFFERED,FILE_READ_ACCESS)
   1178 #define IOCTL_CHANGER_REINITIALIZE_TRANSPORT CTL_CODE(IOCTL_CHANGER_BASE,0x000A,METHOD_BUFFERED,FILE_READ_ACCESS)
   1179 #define IOCTL_CHANGER_QUERY_VOLUME_TAGS CTL_CODE(IOCTL_CHANGER_BASE,0x000B,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   1180 
   1181 #define MAX_VOLUME_ID_SIZE 36
   1182 #define MAX_VOLUME_TEMPLATE_SIZE 40
   1183 
   1184 #define VENDOR_ID_LENGTH 8
   1185 #define PRODUCT_ID_LENGTH 16
   1186 #define REVISION_LENGTH 4
   1187 #define SERIAL_NUMBER_LENGTH 32
   1188 
   1189 typedef enum _ELEMENT_TYPE {
   1190   AllElements,ChangerTransport,ChangerSlot,ChangerIEPort,ChangerDrive,ChangerDoor,ChangerKeypad,ChangerMaxElement
   1191 } ELEMENT_TYPE,*PELEMENT_TYPE;
   1192 
   1193 typedef struct _CHANGER_ELEMENT {
   1194   ELEMENT_TYPE ElementType;
   1195   DWORD ElementAddress;
   1196 } CHANGER_ELEMENT,*PCHANGER_ELEMENT;
   1197 
   1198 typedef struct _CHANGER_ELEMENT_LIST {
   1199   CHANGER_ELEMENT Element;
   1200   DWORD NumberOfElements;
   1201 } CHANGER_ELEMENT_LIST ,*PCHANGER_ELEMENT_LIST;
   1202 
   1203 #define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001
   1204 #define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002
   1205 #define CHANGER_CLOSE_IEPORT 0x00000004
   1206 #define CHANGER_OPEN_IEPORT 0x00000008
   1207 
   1208 #define CHANGER_STATUS_NON_VOLATILE 0x00000010
   1209 #define CHANGER_EXCHANGE_MEDIA 0x00000020
   1210 #define CHANGER_CLEANER_SLOT 0x00000040
   1211 #define CHANGER_LOCK_UNLOCK 0x00000080
   1212 
   1213 #define CHANGER_CARTRIDGE_MAGAZINE 0x00000100
   1214 #define CHANGER_MEDIUM_FLIP 0x00000200
   1215 #define CHANGER_POSITION_TO_ELEMENT 0x00000400
   1216 #define CHANGER_REPORT_IEPORT_STATE 0x00000800
   1217 
   1218 #define CHANGER_STORAGE_DRIVE 0x00001000
   1219 #define CHANGER_STORAGE_IEPORT 0x00002000
   1220 #define CHANGER_STORAGE_SLOT 0x00004000
   1221 #define CHANGER_STORAGE_TRANSPORT 0x00008000
   1222 
   1223 #define CHANGER_DRIVE_CLEANING_REQUIRED 0x00010000
   1224 
   1225 #define CHANGER_PREDISMOUNT_EJECT_REQUIRED 0x00020000
   1226 
   1227 #define CHANGER_CLEANER_ACCESS_NOT_VALID 0x00040000
   1228 #define CHANGER_PREMOUNT_EJECT_REQUIRED 0x00080000
   1229 
   1230 #define CHANGER_VOLUME_IDENTIFICATION 0x00100000
   1231 #define CHANGER_VOLUME_SEARCH 0x00200000
   1232 #define CHANGER_VOLUME_ASSERT 0x00400000
   1233 #define CHANGER_VOLUME_REPLACE 0x00800000
   1234 #define CHANGER_VOLUME_UNDEFINE 0x01000000
   1235 
   1236 #define CHANGER_SERIAL_NUMBER_VALID 0x04000000
   1237 
   1238 #define CHANGER_DEVICE_REINITIALIZE_CAPABLE 0x08000000
   1239 #define CHANGER_KEYPAD_ENABLE_DISABLE 0x10000000
   1240 #define CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS 0x20000000
   1241 
   1242 #define CHANGER_RESERVED_BIT 0x80000000
   1243 
   1244 #define CHANGER_PREDISMOUNT_ALIGN_TO_SLOT 0x80000001
   1245 #define CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE 0x80000002
   1246 #define CHANGER_CLEANER_AUTODISMOUNT 0x80000004
   1247 #define CHANGER_TRUE_EXCHANGE_CAPABLE 0x80000008
   1248 #define CHANGER_SLOTS_USE_TRAYS 0x80000010
   1249 #define CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR 0x80000020
   1250 #define CHANGER_CLEANER_OPS_NOT_SUPPORTED 0x80000040
   1251 #define CHANGER_IEPORT_USER_CONTROL_OPEN 0x80000080
   1252 #define CHANGER_IEPORT_USER_CONTROL_CLOSE 0x80000100
   1253 #define CHANGER_MOVE_EXTENDS_IEPORT 0x80000200
   1254 #define CHANGER_MOVE_RETRACTS_IEPORT 0x80000400
   1255 
   1256 #define CHANGER_TO_TRANSPORT 0x01
   1257 #define CHANGER_TO_SLOT 0x02
   1258 #define CHANGER_TO_IEPORT 0x04
   1259 #define CHANGER_TO_DRIVE 0x08
   1260 
   1261 #define LOCK_UNLOCK_IEPORT 0x01
   1262 #define LOCK_UNLOCK_DOOR 0x02
   1263 #define LOCK_UNLOCK_KEYPAD 0x04
   1264 
   1265 typedef struct _GET_CHANGER_PARAMETERS {
   1266   DWORD Size;
   1267   WORD NumberTransportElements;
   1268   WORD NumberStorageElements;
   1269   WORD NumberCleanerSlots;
   1270   WORD NumberIEElements;
   1271   WORD NumberDataTransferElements;
   1272   WORD NumberOfDoors;
   1273   WORD FirstSlotNumber;
   1274   WORD FirstDriveNumber;
   1275   WORD FirstTransportNumber;
   1276   WORD FirstIEPortNumber;
   1277   WORD FirstCleanerSlotAddress;
   1278   WORD MagazineSize;
   1279   DWORD DriveCleanTimeout;
   1280   DWORD Features0;
   1281   DWORD Features1;
   1282   BYTE MoveFromTransport;
   1283   BYTE MoveFromSlot;
   1284   BYTE MoveFromIePort;
   1285   BYTE MoveFromDrive;
   1286   BYTE ExchangeFromTransport;
   1287   BYTE ExchangeFromSlot;
   1288   BYTE ExchangeFromIePort;
   1289   BYTE ExchangeFromDrive;
   1290   BYTE LockUnlockCapabilities;
   1291   BYTE PositionCapabilities;
   1292   BYTE Reserved1[2];
   1293   DWORD Reserved2[2];
   1294 } GET_CHANGER_PARAMETERS,*PGET_CHANGER_PARAMETERS;
   1295 
   1296 typedef struct _CHANGER_PRODUCT_DATA {
   1297   BYTE VendorId[VENDOR_ID_LENGTH];
   1298   BYTE ProductId[PRODUCT_ID_LENGTH];
   1299   BYTE Revision[REVISION_LENGTH];
   1300   BYTE SerialNumber[SERIAL_NUMBER_LENGTH];
   1301   BYTE DeviceType;
   1302 } CHANGER_PRODUCT_DATA,*PCHANGER_PRODUCT_DATA;
   1303 
   1304 #define LOCK_ELEMENT 0
   1305 #define UNLOCK_ELEMENT 1
   1306 #define EXTEND_IEPORT 2
   1307 #define RETRACT_IEPORT 3
   1308 
   1309 typedef struct _CHANGER_SET_ACCESS {
   1310   CHANGER_ELEMENT Element;
   1311   DWORD Control;
   1312 } CHANGER_SET_ACCESS,*PCHANGER_SET_ACCESS;
   1313 
   1314 typedef struct _CHANGER_READ_ELEMENT_STATUS {
   1315   CHANGER_ELEMENT_LIST ElementList;
   1316   BOOLEAN VolumeTagInfo;
   1317 } CHANGER_READ_ELEMENT_STATUS,*PCHANGER_READ_ELEMENT_STATUS;
   1318 
   1319 typedef struct _CHANGER_ELEMENT_STATUS {
   1320   CHANGER_ELEMENT Element;
   1321   CHANGER_ELEMENT SrcElementAddress;
   1322   DWORD Flags;
   1323   DWORD ExceptionCode;
   1324   BYTE TargetId;
   1325   BYTE Lun;
   1326   WORD Reserved;
   1327   BYTE PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
   1328   BYTE AlternateVolumeID[MAX_VOLUME_ID_SIZE];
   1329 } CHANGER_ELEMENT_STATUS,*PCHANGER_ELEMENT_STATUS;
   1330 
   1331 typedef struct _CHANGER_ELEMENT_STATUS_EX {
   1332   CHANGER_ELEMENT Element;
   1333   CHANGER_ELEMENT SrcElementAddress;
   1334   DWORD Flags;
   1335   DWORD ExceptionCode;
   1336   BYTE TargetId;
   1337   BYTE Lun;
   1338   WORD Reserved;
   1339   BYTE PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
   1340   BYTE AlternateVolumeID[MAX_VOLUME_ID_SIZE];
   1341   BYTE VendorIdentification[VENDOR_ID_LENGTH];
   1342   BYTE ProductIdentification[PRODUCT_ID_LENGTH];
   1343   BYTE SerialNumber[SERIAL_NUMBER_LENGTH];
   1344 } CHANGER_ELEMENT_STATUS_EX,*PCHANGER_ELEMENT_STATUS_EX;
   1345 
   1346 #define ELEMENT_STATUS_FULL 0x00000001
   1347 #define ELEMENT_STATUS_IMPEXP 0x00000002
   1348 #define ELEMENT_STATUS_EXCEPT 0x00000004
   1349 #define ELEMENT_STATUS_ACCESS 0x00000008
   1350 #define ELEMENT_STATUS_EXENAB 0x00000010
   1351 #define ELEMENT_STATUS_INENAB 0x00000020
   1352 
   1353 #define ELEMENT_STATUS_PRODUCT_DATA 0x00000040
   1354 
   1355 #define ELEMENT_STATUS_LUN_VALID 0x00001000
   1356 #define ELEMENT_STATUS_ID_VALID 0x00002000
   1357 #define ELEMENT_STATUS_NOT_BUS 0x00008000
   1358 #define ELEMENT_STATUS_INVERT 0x00400000
   1359 #define ELEMENT_STATUS_SVALID 0x00800000
   1360 
   1361 #define ELEMENT_STATUS_PVOLTAG 0x10000000
   1362 #define ELEMENT_STATUS_AVOLTAG 0x20000000
   1363 
   1364 #define ERROR_LABEL_UNREADABLE 0x00000001
   1365 #define ERROR_LABEL_QUESTIONABLE 0x00000002
   1366 #define ERROR_SLOT_NOT_PRESENT 0x00000004
   1367 #define ERROR_DRIVE_NOT_INSTALLED 0x00000008
   1368 #define ERROR_TRAY_MALFUNCTION 0x00000010
   1369 #define ERROR_INIT_STATUS_NEEDED 0x00000011
   1370 #define ERROR_UNHANDLED_ERROR 0xFFFFFFFF
   1371 
   1372 typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
   1373   CHANGER_ELEMENT_LIST ElementList;
   1374   BOOLEAN BarCodeScan;
   1375 } CHANGER_INITIALIZE_ELEMENT_STATUS,*PCHANGER_INITIALIZE_ELEMENT_STATUS;
   1376 
   1377 typedef struct _CHANGER_SET_POSITION {
   1378   CHANGER_ELEMENT Transport;
   1379   CHANGER_ELEMENT Destination;
   1380   BOOLEAN Flip;
   1381 } CHANGER_SET_POSITION,*PCHANGER_SET_POSITION;
   1382 
   1383 typedef struct _CHANGER_EXCHANGE_MEDIUM {
   1384   CHANGER_ELEMENT Transport;
   1385   CHANGER_ELEMENT Source;
   1386   CHANGER_ELEMENT Destination1;
   1387   CHANGER_ELEMENT Destination2;
   1388   BOOLEAN Flip1;
   1389   BOOLEAN Flip2;
   1390 } CHANGER_EXCHANGE_MEDIUM,*PCHANGER_EXCHANGE_MEDIUM;
   1391 
   1392 typedef struct _CHANGER_MOVE_MEDIUM {
   1393   CHANGER_ELEMENT Transport;
   1394   CHANGER_ELEMENT Source;
   1395   CHANGER_ELEMENT Destination;
   1396   BOOLEAN Flip;
   1397 } CHANGER_MOVE_MEDIUM,*PCHANGER_MOVE_MEDIUM;
   1398 
   1399 typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
   1400   CHANGER_ELEMENT StartingElement;
   1401   DWORD ActionCode;
   1402   BYTE VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE];
   1403 } CHANGER_SEND_VOLUME_TAG_INFORMATION,*PCHANGER_SEND_VOLUME_TAG_INFORMATION;
   1404 
   1405 typedef struct _READ_ELEMENT_ADDRESS_INFO {
   1406   DWORD NumberOfElements;
   1407   CHANGER_ELEMENT_STATUS ElementStatus[1];
   1408 } READ_ELEMENT_ADDRESS_INFO,*PREAD_ELEMENT_ADDRESS_INFO;
   1409 
   1410 #define SEARCH_ALL 0x0
   1411 #define SEARCH_PRIMARY 0x1
   1412 #define SEARCH_ALTERNATE 0x2
   1413 #define SEARCH_ALL_NO_SEQ 0x4
   1414 #define SEARCH_PRI_NO_SEQ 0x5
   1415 #define SEARCH_ALT_NO_SEQ 0x6
   1416 
   1417 #define ASSERT_PRIMARY 0x8
   1418 #define ASSERT_ALTERNATE 0x9
   1419 
   1420 #define REPLACE_PRIMARY 0xA
   1421 #define REPLACE_ALTERNATE 0xB
   1422 
   1423 #define UNDEFINE_PRIMARY 0xC
   1424 #define UNDEFINE_ALTERNATE 0xD
   1425 
   1426 typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
   1427   DeviceProblemNone,DeviceProblemHardware,DeviceProblemCHMError,DeviceProblemDoorOpen,DeviceProblemCalibrationError,DeviceProblemTargetFailure,
   1428   DeviceProblemCHMMoveError,DeviceProblemCHMZeroError,DeviceProblemCartridgeInsertError,DeviceProblemPositionError,DeviceProblemSensorError,
   1429   DeviceProblemCartridgeEjectError,DeviceProblemGripperError,DeviceProblemDriveError
   1430 } CHANGER_DEVICE_PROBLEM_TYPE,*PCHANGER_DEVICE_PROBLEM_TYPE;
   1431 
   1432 #define IOCTL_SERIAL_LSRMST_INSERT CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1433 
   1434 #define IOCTL_SERENUM_EXPOSE_HARDWARE CTL_CODE(FILE_DEVICE_SERENUM,128,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1435 #define IOCTL_SERENUM_REMOVE_HARDWARE CTL_CODE(FILE_DEVICE_SERENUM,129,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1436 #define IOCTL_SERENUM_PORT_DESC CTL_CODE(FILE_DEVICE_SERENUM,130,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1437 #define IOCTL_SERENUM_GET_PORT_NAME CTL_CODE(FILE_DEVICE_SERENUM,131,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1438 
   1439 #define SERIAL_LSRMST_ESCAPE ((BYTE)0x00)
   1440 
   1441 #define SERIAL_LSRMST_LSR_DATA ((BYTE)0x01)
   1442 
   1443 #define SERIAL_LSRMST_LSR_NODATA ((BYTE)0x02)
   1444 
   1445 #define SERIAL_LSRMST_MST ((BYTE)0x03)
   1446 
   1447 #define SERIAL_IOC_FCR_FIFO_ENABLE ((DWORD)0x00000001)
   1448 #define SERIAL_IOC_FCR_RCVR_RESET ((DWORD)0x00000002)
   1449 #define SERIAL_IOC_FCR_XMIT_RESET ((DWORD)0x00000004)
   1450 #define SERIAL_IOC_FCR_DMA_MODE ((DWORD)0x00000008)
   1451 #define SERIAL_IOC_FCR_RES1 ((DWORD)0x00000010)
   1452 #define SERIAL_IOC_FCR_RES2 ((DWORD)0x00000020)
   1453 #define SERIAL_IOC_FCR_RCVR_TRIGGER_LSB ((DWORD)0x00000040)
   1454 #define SERIAL_IOC_FCR_RCVR_TRIGGER_MSB ((DWORD)0x00000080)
   1455 
   1456 #define SERIAL_IOC_MCR_DTR ((DWORD)0x00000001)
   1457 #define SERIAL_IOC_MCR_RTS ((DWORD)0x00000002)
   1458 #define SERIAL_IOC_MCR_OUT1 ((DWORD)0x00000004)
   1459 #define SERIAL_IOC_MCR_OUT2 ((DWORD)0x00000008)
   1460 #define SERIAL_IOC_MCR_LOOP ((DWORD)0x00000010)
   1461 
   1462 #ifndef _FILESYSTEMFSCTL_
   1463 #define _FILESYSTEMFSCTL_
   1464 
   1465 #define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1466 #define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,1,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1467 #define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,2,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1468 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,3,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1469 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,4,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1470 #define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,5,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1471 #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1472 #define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,7,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1473 #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,8,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1474 
   1475 #define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,10,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1476 #define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,11,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1477 #define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,12,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1478 
   1479 #define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,14,METHOD_NEITHER,FILE_ANY_ACCESS)
   1480 #define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,15,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1481 #define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,16,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
   1482 
   1483 #define FSCTL_SET_BOOTLOADER_ACCESSED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,19,METHOD_NEITHER,FILE_ANY_ACCESS)
   1484 #define FSCTL_MARK_AS_SYSTEM_HIVE FSCTL_SET_BOOTLOADER_ACCESSED
   1485 #define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,20,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1486 #define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,21,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1487 #define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM,22,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1488 #define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,23,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1489 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,24,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1490 #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,25,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1491 #define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM,26,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1492 #define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM,27,METHOD_NEITHER,FILE_ANY_ACCESS)
   1493 #define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,28,METHOD_NEITHER,FILE_ANY_ACCESS)
   1494 #define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,29,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1495 #define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,30,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1496 #define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,32,METHOD_NEITHER,FILE_ANY_ACCESS)
   1497 #define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,35,METHOD_NEITHER,FILE_ANY_ACCESS)
   1498 #define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,38,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1499 #define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,39,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1500 #define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,40,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1501 #define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,41,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1502 #define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,42,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1503 #define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,43,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1504 #define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,44,METHOD_NEITHER,FILE_ANY_ACCESS)
   1505 #define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,45,METHOD_NEITHER,FILE_READ_DATA)
   1506 #define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,46,METHOD_NEITHER,FILE_ANY_ACCESS)
   1507 #define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,47,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1508 #define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,48,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1509 #define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,49,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1510 #define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,50,METHOD_BUFFERED,FILE_WRITE_DATA)
   1511 #define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,51,METHOD_NEITHER,FILE_READ_DATA)
   1512 #define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,52,METHOD_BUFFERED,FILE_WRITE_DATA)
   1513 #define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,53,METHOD_NEITHER,FILE_ANY_ACCESS)
   1514 #define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,54,METHOD_NEITHER,FILE_ANY_ACCESS)
   1515 #define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,55,METHOD_NEITHER,FILE_SPECIAL_ACCESS)
   1516 #define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,56,METHOD_NEITHER,FILE_SPECIAL_ACCESS)
   1517 #define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,57,METHOD_NEITHER,FILE_ANY_ACCESS)
   1518 #define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,58,METHOD_NEITHER,FILE_ANY_ACCESS)
   1519 #define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM,59,METHOD_NEITHER,FILE_ANY_ACCESS)
   1520 #define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1521 #define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,61,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1522 #define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,62,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1523 #define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,63,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1524 #define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,64,METHOD_BUFFERED,FILE_ANY_ACCESS)
   1525 #define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,65,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
   1526 #define FSCTL_HSM_MSG CTL_CODE(FILE_DEVICE_FILE_SYSTEM,66,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
   1527 #define FSCTL_HSM_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,68,METHOD_NEITHER,FILE_READ_DATA | FILE_WRITE_DATA)
   1528 #define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,69,METHOD_NEITHER,FILE_ANY_ACCESS)
   1529 #define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM,71,METHOD_OUT_DIRECT,FILE_READ_DATA)
   1530 #define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM,72,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
   1531 
   1532 typedef struct _PATHNAME_BUFFER {
   1533   DWORD PathNameLength;
   1534   WCHAR Name[1];
   1535 } PATHNAME_BUFFER,*PPATHNAME_BUFFER;
   1536 
   1537 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
   1538   BYTE First0x24BytesOfBootSector[0x24];
   1539 } FSCTL_QUERY_FAT_BPB_BUFFER,*PFSCTL_QUERY_FAT_BPB_BUFFER;
   1540 
   1541 typedef struct {
   1542   LARGE_INTEGER VolumeSerialNumber;
   1543   LARGE_INTEGER NumberSectors;
   1544   LARGE_INTEGER TotalClusters;
   1545   LARGE_INTEGER FreeClusters;
   1546   LARGE_INTEGER TotalReserved;
   1547   DWORD BytesPerSector;
   1548   DWORD BytesPerCluster;
   1549   DWORD BytesPerFileRecordSegment;
   1550   DWORD ClustersPerFileRecordSegment;
   1551   LARGE_INTEGER MftValidDataLength;
   1552   LARGE_INTEGER MftStartLcn;
   1553   LARGE_INTEGER Mft2StartLcn;
   1554   LARGE_INTEGER MftZoneStart;
   1555   LARGE_INTEGER MftZoneEnd;
   1556 } NTFS_VOLUME_DATA_BUFFER,*PNTFS_VOLUME_DATA_BUFFER;
   1557 
   1558 typedef struct {
   1559   DWORD ByteCount;
   1560   WORD MajorVersion;
   1561   WORD MinorVersion;
   1562 } NTFS_EXTENDED_VOLUME_DATA,*PNTFS_EXTENDED_VOLUME_DATA;
   1563 
   1564 typedef struct {
   1565   LARGE_INTEGER StartingLcn;
   1566 } STARTING_LCN_INPUT_BUFFER,*PSTARTING_LCN_INPUT_BUFFER;
   1567 
   1568 typedef struct {
   1569   LARGE_INTEGER StartingLcn;
   1570   LARGE_INTEGER BitmapSize;
   1571   BYTE Buffer[1];
   1572 } VOLUME_BITMAP_BUFFER,*PVOLUME_BITMAP_BUFFER;
   1573 
   1574 typedef struct {
   1575   LARGE_INTEGER StartingVcn;
   1576 } STARTING_VCN_INPUT_BUFFER,*PSTARTING_VCN_INPUT_BUFFER;
   1577 
   1578 typedef struct RETRIEVAL_POINTERS_BUFFER {
   1579   DWORD ExtentCount;
   1580   LARGE_INTEGER StartingVcn;
   1581   struct {
   1582     LARGE_INTEGER NextVcn;
   1583     LARGE_INTEGER Lcn;
   1584   } Extents[1];
   1585 } RETRIEVAL_POINTERS_BUFFER,*PRETRIEVAL_POINTERS_BUFFER;
   1586 
   1587 typedef struct {
   1588   LARGE_INTEGER FileReferenceNumber;
   1589 } NTFS_FILE_RECORD_INPUT_BUFFER,*PNTFS_FILE_RECORD_INPUT_BUFFER;
   1590 
   1591 typedef struct {
   1592   LARGE_INTEGER FileReferenceNumber;
   1593   DWORD FileRecordLength;
   1594   BYTE FileRecordBuffer[1];
   1595 } NTFS_FILE_RECORD_OUTPUT_BUFFER,*PNTFS_FILE_RECORD_OUTPUT_BUFFER;
   1596 
   1597 typedef struct {
   1598   HANDLE FileHandle;
   1599   LARGE_INTEGER StartingVcn;
   1600   LARGE_INTEGER StartingLcn;
   1601   DWORD ClusterCount;
   1602 } MOVE_FILE_DATA,*PMOVE_FILE_DATA;
   1603 
   1604 typedef struct _MOVE_FILE_RECORD_DATA {
   1605   HANDLE FileHandle;
   1606   LARGE_INTEGER SourceFileRecord;
   1607   LARGE_INTEGER TargetFileRecord;
   1608 } MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
   1609 
   1610 #ifdef _WIN64
   1611 typedef struct _MOVE_FILE_DATA32 {
   1612   UINT32 FileHandle;
   1613   LARGE_INTEGER StartingVcn;
   1614   LARGE_INTEGER StartingLcn;
   1615   DWORD ClusterCount;
   1616 } MOVE_FILE_DATA32,*PMOVE_FILE_DATA32;
   1617 #endif
   1618 
   1619 typedef struct {
   1620   DWORD Restart;
   1621   SID Sid;
   1622 } FIND_BY_SID_DATA,*PFIND_BY_SID_DATA;
   1623 
   1624 typedef struct {
   1625   DWORD NextEntryOffset;
   1626   DWORD FileIndex;
   1627   DWORD FileNameLength;
   1628   WCHAR FileName[1];
   1629 } FIND_BY_SID_OUTPUT,*PFIND_BY_SID_OUTPUT;
   1630 
   1631 typedef struct {
   1632   DWORDLONG StartFileReferenceNumber;
   1633   USN LowUsn;
   1634   USN HighUsn;
   1635 } MFT_ENUM_DATA,*PMFT_ENUM_DATA;
   1636 
   1637 typedef struct {
   1638   DWORDLONG MaximumSize;
   1639   DWORDLONG AllocationDelta;
   1640 } CREATE_USN_JOURNAL_DATA,*PCREATE_USN_JOURNAL_DATA;
   1641 
   1642 typedef struct {
   1643   USN StartUsn;
   1644   DWORD ReasonMask;
   1645   DWORD ReturnOnlyOnClose;
   1646   DWORDLONG Timeout;
   1647   DWORDLONG BytesToWaitFor;
   1648   DWORDLONG UsnJournalID;
   1649 } READ_USN_JOURNAL_DATA,*PREAD_USN_JOURNAL_DATA;
   1650 
   1651 typedef struct {
   1652   DWORD RecordLength;
   1653   WORD MajorVersion;
   1654   WORD MinorVersion;
   1655   DWORDLONG FileReferenceNumber;
   1656   DWORDLONG ParentFileReferenceNumber;
   1657   USN Usn;
   1658   LARGE_INTEGER TimeStamp;
   1659   DWORD Reason;
   1660   DWORD SourceInfo;
   1661   DWORD SecurityId;
   1662   DWORD FileAttributes;
   1663   WORD FileNameLength;
   1664   WORD FileNameOffset;
   1665   WCHAR FileName[1];
   1666 } USN_RECORD,*PUSN_RECORD;
   1667 
   1668 #define USN_PAGE_SIZE (0x1000)
   1669 
   1670 #define USN_REASON_DATA_OVERWRITE (0x00000001)
   1671 #define USN_REASON_DATA_EXTEND (0x00000002)
   1672 #define USN_REASON_DATA_TRUNCATION (0x00000004)
   1673 #define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010)
   1674 #define USN_REASON_NAMED_DATA_EXTEND (0x00000020)
   1675 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
   1676 #define USN_REASON_FILE_CREATE (0x00000100)
   1677 #define USN_REASON_FILE_DELETE (0x00000200)
   1678 #define USN_REASON_EA_CHANGE (0x00000400)
   1679 #define USN_REASON_SECURITY_CHANGE (0x00000800)
   1680 #define USN_REASON_RENAME_OLD_NAME (0x00001000)
   1681 #define USN_REASON_RENAME_NEW_NAME (0x00002000)
   1682 #define USN_REASON_INDEXABLE_CHANGE (0x00004000)
   1683 #define USN_REASON_BASIC_INFO_CHANGE (0x00008000)
   1684 #define USN_REASON_HARD_LINK_CHANGE (0x00010000)
   1685 #define USN_REASON_COMPRESSION_CHANGE (0x00020000)
   1686 #define USN_REASON_ENCRYPTION_CHANGE (0x00040000)
   1687 #define USN_REASON_OBJECT_ID_CHANGE (0x00080000)
   1688 #define USN_REASON_REPARSE_POINT_CHANGE (0x00100000)
   1689 #define USN_REASON_STREAM_CHANGE (0x00200000)
   1690 #define USN_REASON_TRANSACTED_CHANGE (0x00400000)
   1691 
   1692 #define USN_REASON_CLOSE (0x80000000)
   1693 
   1694 typedef struct {
   1695   DWORDLONG UsnJournalID;
   1696   USN FirstUsn;
   1697   USN NextUsn;
   1698   USN LowestValidUsn;
   1699   USN MaxUsn;
   1700   DWORDLONG MaximumSize;
   1701   DWORDLONG AllocationDelta;
   1702 } USN_JOURNAL_DATA,*PUSN_JOURNAL_DATA;
   1703 
   1704 typedef struct {
   1705   DWORDLONG UsnJournalID;
   1706   DWORD DeleteFlags;
   1707 } DELETE_USN_JOURNAL_DATA,*PDELETE_USN_JOURNAL_DATA;
   1708 
   1709 #define USN_DELETE_FLAG_DELETE (0x00000001)
   1710 #define USN_DELETE_FLAG_NOTIFY (0x00000002)
   1711 
   1712 #define USN_DELETE_VALID_FLAGS (0x00000003)
   1713 
   1714 typedef struct {
   1715   DWORD UsnSourceInfo;
   1716   HANDLE VolumeHandle;
   1717   DWORD HandleInfo;
   1718 } MARK_HANDLE_INFO,*PMARK_HANDLE_INFO;
   1719 
   1720 #ifdef _WIN64
   1721 
   1722 typedef struct {
   1723   DWORD UsnSourceInfo;
   1724   UINT32 VolumeHandle;
   1725   DWORD HandleInfo;
   1726 
   1727 } MARK_HANDLE_INFO32,*PMARK_HANDLE_INFO32;
   1728 #endif
   1729 
   1730 #define USN_SOURCE_DATA_MANAGEMENT (0x00000001)
   1731 #define USN_SOURCE_AUXILIARY_DATA (0x00000002)
   1732 #define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004)
   1733 
   1734 #define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001)
   1735 #define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004)
   1736 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008)
   1737 #define MARK_HANDLE_REALTIME (0x00000020)
   1738 #define MARK_HANDLE_NOT_REALTIME (0x00000040)
   1739 
   1740 typedef struct {
   1741   ACCESS_MASK DesiredAccess;
   1742   DWORD SecurityIds[1];
   1743 } BULK_SECURITY_TEST_DATA,*PBULK_SECURITY_TEST_DATA;
   1744 
   1745 #define VOLUME_IS_DIRTY                  (0x00000001)
   1746 #define VOLUME_UPGRADE_SCHEDULED         (0x00000002)
   1747 #define VOLUME_SESSION_OPEN              (0x00000004)
   1748 
   1749 typedef struct _FILE_PREFETCH {
   1750   DWORD Type;
   1751   DWORD Count;
   1752   DWORDLONG Prefetch[1];
   1753 } FILE_PREFETCH,*PFILE_PREFETCH;
   1754 
   1755 typedef struct _FILE_PREFETCH_EX {
   1756   ULONG Type;
   1757   ULONG Count;
   1758   PVOID Context;
   1759   ULONGLONG Prefetch[1];
   1760 } FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
   1761 
   1762 #define FILE_PREFETCH_TYPE_FOR_CREATE       0x1
   1763 #define FILE_PREFETCH_TYPE_FOR_DIRENUM      0x2
   1764 #define FILE_PREFETCH_TYPE_FOR_CREATE_EX    0x3
   1765 #define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX   0x4
   1766 
   1767 #define FILE_PREFETCH_TYPE_MAX              0x4
   1768 
   1769 typedef struct _FILESYSTEM_STATISTICS {
   1770   WORD FileSystemType;
   1771   WORD Version;
   1772   DWORD SizeOfCompleteStructure;
   1773   DWORD UserFileReads;
   1774   DWORD UserFileReadBytes;
   1775   DWORD UserDiskReads;
   1776   DWORD UserFileWrites;
   1777   DWORD UserFileWriteBytes;
   1778   DWORD UserDiskWrites;
   1779   DWORD MetaDataReads;
   1780   DWORD MetaDataReadBytes;
   1781   DWORD MetaDataDiskReads;
   1782   DWORD MetaDataWrites;
   1783   DWORD MetaDataWriteBytes;
   1784   DWORD MetaDataDiskWrites;
   1785 } FILESYSTEM_STATISTICS,*PFILESYSTEM_STATISTICS;
   1786 
   1787 #define FILESYSTEM_STATISTICS_TYPE_NTFS 1
   1788 #define FILESYSTEM_STATISTICS_TYPE_FAT 2
   1789 #define FILESYSTEM_STATISTICS_TYPE_EXFAT 3
   1790 
   1791 typedef struct _FAT_STATISTICS {
   1792   DWORD CreateHits;
   1793   DWORD SuccessfulCreates;
   1794   DWORD FailedCreates;
   1795   DWORD NonCachedReads;
   1796   DWORD NonCachedReadBytes;
   1797   DWORD NonCachedWrites;
   1798   DWORD NonCachedWriteBytes;
   1799   DWORD NonCachedDiskReads;
   1800   DWORD NonCachedDiskWrites;
   1801 } FAT_STATISTICS,*PFAT_STATISTICS;
   1802 
   1803 typedef struct _EXFAT_STATISTICS {
   1804   DWORD CreateHits;
   1805   DWORD SuccessfulCreates;
   1806   DWORD FailedCreates;
   1807   DWORD NonCachedReads;
   1808   DWORD NonCachedReadBytes;
   1809   DWORD NonCachedWrites;
   1810   DWORD NonCachedWriteBytes;
   1811   DWORD NonCachedDiskReads;
   1812   DWORD NonCachedDiskWrites;
   1813 } EXFAT_STATISTICS, *PEXFAT_STATISTICS;
   1814 
   1815 typedef struct _NTFS_STATISTICS {
   1816   DWORD LogFileFullExceptions;
   1817   DWORD OtherExceptions;
   1818   DWORD MftReads;
   1819   DWORD MftReadBytes;
   1820   DWORD MftWrites;
   1821   DWORD MftWriteBytes;
   1822   struct {
   1823     WORD Write;
   1824     WORD Create;
   1825     WORD SetInfo;
   1826     WORD Flush;
   1827   } MftWritesUserLevel;
   1828   WORD MftWritesFlushForLogFileFull;
   1829   WORD MftWritesLazyWriter;
   1830   WORD MftWritesUserRequest;
   1831   DWORD Mft2Writes;
   1832   DWORD Mft2WriteBytes;
   1833   struct {
   1834     WORD Write;
   1835     WORD Create;
   1836     WORD SetInfo;
   1837     WORD Flush;
   1838   } Mft2WritesUserLevel;
   1839   WORD Mft2WritesFlushForLogFileFull;
   1840   WORD Mft2WritesLazyWriter;
   1841   WORD Mft2WritesUserRequest;
   1842   DWORD RootIndexReads;
   1843   DWORD RootIndexReadBytes;
   1844   DWORD RootIndexWrites;
   1845   DWORD RootIndexWriteBytes;
   1846   DWORD BitmapReads;
   1847   DWORD BitmapReadBytes;
   1848   DWORD BitmapWrites;
   1849   DWORD BitmapWriteBytes;
   1850   WORD BitmapWritesFlushForLogFileFull;
   1851   WORD BitmapWritesLazyWriter;
   1852   WORD BitmapWritesUserRequest;
   1853   struct {
   1854     WORD Write;
   1855     WORD Create;
   1856     WORD SetInfo;
   1857   } BitmapWritesUserLevel;
   1858   DWORD MftBitmapReads;
   1859   DWORD MftBitmapReadBytes;
   1860   DWORD MftBitmapWrites;
   1861   DWORD MftBitmapWriteBytes;
   1862   WORD MftBitmapWritesFlushForLogFileFull;
   1863   WORD MftBitmapWritesLazyWriter;
   1864   WORD MftBitmapWritesUserRequest;
   1865   struct {
   1866     WORD Write;
   1867     WORD Create;
   1868     WORD SetInfo;
   1869     WORD Flush;
   1870   } MftBitmapWritesUserLevel;
   1871   DWORD UserIndexReads;
   1872   DWORD UserIndexReadBytes;
   1873   DWORD UserIndexWrites;
   1874   DWORD UserIndexWriteBytes;
   1875   DWORD LogFileReads;
   1876   DWORD LogFileReadBytes;
   1877   DWORD LogFileWrites;
   1878   DWORD LogFileWriteBytes;
   1879   struct {
   1880     DWORD Calls;
   1881     DWORD Clusters;
   1882     DWORD Hints;
   1883     DWORD RunsReturned;
   1884     DWORD HintsHonored;
   1885     DWORD HintsClusters;
   1886     DWORD Cache;
   1887     DWORD CacheClusters;
   1888     DWORD CacheMiss;
   1889     DWORD CacheMissClusters;
   1890   } Allocate;
   1891 } NTFS_STATISTICS,*PNTFS_STATISTICS;
   1892 
   1893 typedef struct _FILE_OBJECTID_BUFFER {
   1894   BYTE ObjectId[16];
   1895   __C89_NAMELESS union {
   1896     __C89_NAMELESS struct {
   1897       BYTE BirthVolumeId[16];
   1898       BYTE BirthObjectId[16];
   1899       BYTE DomainId[16];
   1900     } DUMMYSTRUCTNAME;
   1901     BYTE ExtendedInfo[48];
   1902   } DUMMYUNIONNAME;
   1903 } FILE_OBJECTID_BUFFER,*PFILE_OBJECTID_BUFFER;
   1904 
   1905 typedef struct _FILE_SET_SPARSE_BUFFER {
   1906   BOOLEAN SetSparse;
   1907 } FILE_SET_SPARSE_BUFFER,*PFILE_SET_SPARSE_BUFFER;
   1908 
   1909 typedef struct _FILE_ZERO_DATA_INFORMATION {
   1910   LARGE_INTEGER FileOffset;
   1911   LARGE_INTEGER BeyondFinalZero;
   1912 } FILE_ZERO_DATA_INFORMATION,*PFILE_ZERO_DATA_INFORMATION;
   1913 
   1914 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
   1915   LARGE_INTEGER FileOffset;
   1916   LARGE_INTEGER Length;
   1917 } FILE_ALLOCATED_RANGE_BUFFER,*PFILE_ALLOCATED_RANGE_BUFFER;
   1918 
   1919 typedef struct _ENCRYPTION_BUFFER {
   1920   DWORD EncryptionOperation;
   1921   BYTE Private[1];
   1922 } ENCRYPTION_BUFFER,*PENCRYPTION_BUFFER;
   1923 
   1924 #define FILE_SET_ENCRYPTION 0x00000001
   1925 #define FILE_CLEAR_ENCRYPTION 0x00000002
   1926 #define STREAM_SET_ENCRYPTION 0x00000003
   1927 #define STREAM_CLEAR_ENCRYPTION 0x00000004
   1928 
   1929 #define MAXIMUM_ENCRYPTION_VALUE 0x00000004
   1930 
   1931 typedef struct _DECRYPTION_STATUS_BUFFER {
   1932   BOOLEAN NoEncryptedStreams;
   1933 } DECRYPTION_STATUS_BUFFER,*PDECRYPTION_STATUS_BUFFER;
   1934 
   1935 #define ENCRYPTION_FORMAT_DEFAULT (0x01)
   1936 #define COMPRESSION_FORMAT_SPARSE (0x4000)
   1937 
   1938 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
   1939   LONGLONG FileOffset;
   1940   DWORD Length;
   1941 } REQUEST_RAW_ENCRYPTED_DATA,*PREQUEST_RAW_ENCRYPTED_DATA;
   1942 
   1943 typedef struct _ENCRYPTED_DATA_INFO {
   1944   DWORDLONG StartingFileOffset;
   1945   DWORD OutputBufferOffset;
   1946   DWORD BytesWithinFileSize;
   1947   DWORD BytesWithinValidDataLength;
   1948   WORD CompressionFormat;
   1949   BYTE DataUnitShift;
   1950   BYTE ChunkShift;
   1951   BYTE ClusterShift;
   1952   BYTE EncryptionFormat;
   1953   WORD NumberOfDataBlocks;
   1954   DWORD DataBlockSize[ANYSIZE_ARRAY];
   1955 } ENCRYPTED_DATA_INFO;
   1956 typedef ENCRYPTED_DATA_INFO *PENCRYPTED_DATA_INFO;
   1957 
   1958 typedef struct _PLEX_READ_DATA_REQUEST {
   1959   LARGE_INTEGER ByteOffset;
   1960   DWORD ByteLength;
   1961   DWORD PlexNumber;
   1962 } PLEX_READ_DATA_REQUEST,*PPLEX_READ_DATA_REQUEST;
   1963 
   1964 typedef struct _SI_COPYFILE {
   1965   DWORD SourceFileNameLength;
   1966   DWORD DestinationFileNameLength;
   1967   DWORD Flags;
   1968   WCHAR FileNameBuffer[1];
   1969 } SI_COPYFILE,*PSI_COPYFILE;
   1970 
   1971 #define COPYFILE_SIS_LINK 0x0001
   1972 #define COPYFILE_SIS_REPLACE 0x0002
   1973 #define COPYFILE_SIS_FLAGS 0x0003
   1974 
   1975 typedef struct _STORAGE_DESCRIPTOR_HEADER {
   1976   DWORD Version;
   1977   DWORD Size;
   1978 } STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
   1979 
   1980 typedef enum _STORAGE_PROPERTY_ID {
   1981   StorageDeviceProperty = 0,
   1982   StorageAdapterProperty,
   1983   StorageDeviceIdProperty,
   1984   StorageDeviceUniqueIdProperty,
   1985   StorageDeviceWriteCacheProperty,
   1986   StorageMiniportProperty,
   1987   StorageAccessAlignmentProperty,
   1988   StorageDeviceSeekPenaltyProperty,
   1989   StorageDeviceTrimProperty,
   1990   StorageDeviceWriteAggregationProperty,
   1991   StorageDeviceDeviceTelemetryProperty,
   1992   StorageDeviceLBProvisioningProperty,
   1993   StorageDevicePowerProperty,
   1994   StorageDeviceCopyOffloadProperty,
   1995   StorageDeviceResiliencyProperty,
   1996   StorageDeviceMediumProductType,
   1997   StorageAdapterRpmbProperty,
   1998   StorageAdapterCryptoProperty,
   1999   StorageDeviceIoCapabilityProperty = 48,
   2000   StorageAdapterProtocolSpecificProperty,
   2001   StorageDeviceProtocolSpecificProperty,
   2002   StorageAdapterTemperatureProperty,
   2003   StorageDeviceTemperatureProperty,
   2004   StorageAdapterPhysicalTopologyProperty,
   2005   StorageDevicePhysicalTopologyProperty,
   2006   StorageDeviceAttributesProperty,
   2007   StorageDeviceManagementStatus,
   2008   StorageAdapterSerialNumberProperty,
   2009   StorageDeviceLocationProperty,
   2010   StorageDeviceNumaProperty,
   2011   StorageDeviceZonedDeviceProperty,
   2012   StorageDeviceUnsafeShutdownCount,
   2013   StorageDeviceEnduranceProperty,
   2014   StorageDeviceLedStateProperty,
   2015   StorageDeviceSelfEncryptionProperty = 64,
   2016   StorageFruIdProperty
   2017 } STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
   2018 
   2019 typedef enum _STORAGE_QUERY_TYPE {
   2020   PropertyStandardQuery     = 0,
   2021   PropertyExistsQuery       = 1,
   2022   PropertyMaskQuery         = 2,
   2023   PropertyQueryMaxDefined   = 3 
   2024 } STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
   2025 
   2026 typedef enum _STORAGE_SET_TYPE {
   2027   PropertyStandardSet = 0,
   2028   PropertyExistsSet,
   2029   PropertySetMaxDefined
   2030 } STORAGE_SET_TYPE, *PSTORAGE_SET_TYPE;
   2031 
   2032 typedef struct _STORAGE_PROPERTY_QUERY {
   2033   STORAGE_PROPERTY_ID PropertyId;
   2034   STORAGE_QUERY_TYPE  QueryType;
   2035   BYTE                AdditionalParameters[1];
   2036 } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
   2037 
   2038 typedef struct _STORAGE_PROPERTY_SET {
   2039   STORAGE_PROPERTY_ID PropertyId;
   2040   STORAGE_SET_TYPE SetType;
   2041   BYTE AdditionalParameters[1];
   2042 } STORAGE_PROPERTY_SET, *PSTORAGE_PROPERTY_SET;
   2043 
   2044 typedef struct _STORAGE_DEVICE_DESCRIPTOR {
   2045   DWORD            Version;
   2046   DWORD            Size;
   2047   BYTE             DeviceType;
   2048   BYTE             DeviceTypeModifier;
   2049   BOOLEAN          RemovableMedia;
   2050   BOOLEAN          CommandQueueing;
   2051   DWORD            VendorIdOffset;
   2052   DWORD            ProductIdOffset;
   2053   DWORD            ProductRevisionOffset;
   2054   DWORD            SerialNumberOffset;
   2055   STORAGE_BUS_TYPE BusType;
   2056   DWORD            RawPropertiesLength;
   2057   BYTE             RawDeviceProperties[1];
   2058 } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
   2059 
   2060 typedef struct _STORAGE_ADAPTER_DESCRIPTOR {
   2061   DWORD   Version;
   2062   DWORD   Size;
   2063   DWORD   MaximumTransferLength;
   2064   DWORD   MaximumPhysicalPages;
   2065   DWORD   AlignmentMask;
   2066   BOOLEAN AdapterUsesPio;
   2067   BOOLEAN AdapterScansDown;
   2068   BOOLEAN CommandQueueing;
   2069   BOOLEAN AcceleratedTransfer;
   2070   BYTE    BusType;
   2071   WORD    BusMajorVersion;
   2072   WORD    BusMinorVersion;
   2073 #if NTDDI_VERSION >= NTDDI_WIN8
   2074   BYTE SrbType;
   2075   BYTE AddressType;
   2076 #endif
   2077 } STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
   2078 
   2079 #if NTDDI_VERSION >= NTDDI_WIN8
   2080 
   2081 #define NO_SRBTYPE_ADAPTER_DESCRIPTOR_SIZE UFIELD_OFFSET(STORAGE_ADAPTER_DESCRIPTOR, SrbType)
   2082 
   2083 #ifndef SRB_TYPE_SCSI_REQUEST_BLOCK
   2084 #define SRB_TYPE_SCSI_REQUEST_BLOCK 0
   2085 #endif
   2086 
   2087 #ifndef SRB_TYPE_STORAGE_REQUEST_BLOCK
   2088 #define SRB_TYPE_STORAGE_REQUEST_BLOCK 1
   2089 #endif
   2090 
   2091 #ifndef STORAGE_ADDRESS_TYPE_BTL8
   2092 #define STORAGE_ADDRESS_TYPE_BTL8 0
   2093 #endif
   2094 
   2095 #endif
   2096 
   2097 typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
   2098   DWORD Version;
   2099   DWORD Size;
   2100   DWORD NumberOfIdentifiers;
   2101   BYTE  Identifiers[1];
   2102 } STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
   2103 
   2104 typedef struct _VOLUME_GET_GPT_ATTRIBUTES_INFORMATION {
   2105   ULONGLONG GptAttributes;
   2106 } VOLUME_GET_GPT_ATTRIBUTES_INFORMATION, *PVOLUME_GET_GPT_ATTRIBUTES_INFORMATION;
   2107 
   2108 #if (_WIN32_WINNT >= 0x0600)
   2109 #define FSCTL_MAKE_MEDIA_COMPATIBLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
   2110 #define FSCTL_SET_DEFECT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
   2111 #define FSCTL_QUERY_SPARING_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2112 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2113 #define FSCTL_SET_VOLUME_COMPRESSION_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   2114 #define FSCTL_TXFS_MODIFY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,81, METHOD_BUFFERED, FILE_WRITE_DATA)
   2115 #define FSCTL_TXFS_QUERY_RM_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,82, METHOD_BUFFERED, FILE_READ_DATA)
   2116 #define FSCTL_TXFS_ROLLFORWARD_REDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,84, METHOD_BUFFERED, FILE_WRITE_DATA)
   2117 #define FSCTL_TXFS_ROLLFORWARD_UNDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,85, METHOD_BUFFERED, FILE_WRITE_DATA)
   2118 #define FSCTL_TXFS_START_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,86, METHOD_BUFFERED, FILE_WRITE_DATA)
   2119 #define FSCTL_TXFS_SHUTDOWN_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
   2120 #define FSCTL_TXFS_READ_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,88, METHOD_BUFFERED, FILE_READ_DATA)
   2121 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,89, METHOD_BUFFERED, FILE_WRITE_DATA)
   2122 #define FSCTL_TXFS_CREATE_SECONDARY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,90,METHOD_BUFFERED, FILE_WRITE_DATA)
   2123 #define FSCTL_TXFS_GET_METADATA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,91, METHOD_BUFFERED, FILE_READ_DATA)
   2124 #define FSCTL_TXFS_GET_TRANSACTED_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,92, METHOD_BUFFERED, FILE_READ_DATA)
   2125 #define FSCTL_TXFS_SAVEPOINT_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,94, METHOD_BUFFERED, FILE_WRITE_DATA)
   2126 #define FSCTL_TXFS_CREATE_MINIVERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
   2127 #define FSCTL_TXFS_TRANSACTION_ACTIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,99, METHOD_BUFFERED, FILE_READ_DATA)
   2128 #define FSCTL_SET_ZERO_ON_DEALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   2129 #define FSCTL_SET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2130 #define FSCTL_GET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2131 #define FSCTL_WAIT_FOR_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2132 #define FSCTL_INITIATE_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2133 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
   2134 #define FSCTL_SHRINK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   2135 #define FSCTL_SET_SHORT_NAME_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2136 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2137 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
   2138 #define FSCTL_TXFS_LIST_TRANSACTIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
   2139 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2140 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2141 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
   2142 
   2143 #define SET_REPAIR_ENABLED 0x00000001
   2144 #define SET_REPAIR_VOLUME_BITMAP_SCAN 0x00000002
   2145 #define SET_REPAIR_DELETE_CROSSLINK 0x00000004
   2146 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS 0x00000008
   2147 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT 0x00000010
   2148 
   2149 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
   2150   BOOLEAN CloseDisc;
   2151 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
   2152 
   2153 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
   2154   BOOLEAN Disable;
   2155 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
   2156 
   2157 typedef struct _FILE_QUERY_SPARING_BUFFER {
   2158   ULONG   SparingUnitBytes;
   2159   BOOLEAN SoftwareSparing;
   2160   ULONG   TotalSpareBlocks;
   2161   ULONG   FreeSpareBlocks;
   2162 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
   2163 
   2164 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
   2165   LARGE_INTEGER DirectoryCount;
   2166   LARGE_INTEGER FileCount;
   2167   WORD          FsFormatMajVersion;
   2168   WORD          FsFormatMinVersion;
   2169   WCHAR         FsFormatName[12];
   2170   LARGE_INTEGER FormatTime;
   2171   LARGE_INTEGER LastUpdateTime;
   2172   WCHAR         CopyrightInfo[34];
   2173   WCHAR         AbstractInfo[34];
   2174   WCHAR         FormattingImplementationInfo[34];
   2175   WCHAR         LastModifyingImplementationInfo[34];
   2176 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
   2177 
   2178 #define SET_REPAIR_ENABLED                          0x00000001
   2179 #define SET_REPAIR_VOLUME_BITMAP_SCAN               0x00000002
   2180 #define SET_REPAIR_DELETE_CROSSLINK                 0x00000004
   2181 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS             0x00000008
   2182 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT 0x00000010
   2183 #define SET_REPAIR_VALID_MASK                       0x0000001F
   2184 
   2185 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
   2186   ShrinkPrepare = 1,
   2187   ShrinkCommit,
   2188   ShrinkAbort
   2189 } SHRINK_VOLUME_REQUEST_TYPES;
   2190 
   2191 typedef struct _SHRINK_VOLUME_INFORMATION {
   2192   SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
   2193   DWORDLONG                   Flags;
   2194   LONGLONG                    NewNumberOfSectors;
   2195 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
   2196 
   2197 #define TXFS_RM_FLAG_LOGGING_MODE 0x00000001
   2198 #define TXFS_RM_FLAG_RENAME_RM 0x00000002
   2199 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000004
   2200 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000008
   2201 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000010
   2202 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000020
   2203 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000040
   2204 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000080
   2205 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000100
   2206 #define TXFS_RM_FLAG_GROW_LOG 0x00000400
   2207 #define TXFS_RM_FLAG_SHRINK_LOG 0x00000800
   2208 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE 0x00001000
   2209 #define TXFS_RM_FLAG_PRESERVE_CHANGES 0x00002000
   2210 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START 0x00004000
   2211 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START 0x00008000
   2212 #define TXFS_RM_FLAG_PREFER_CONSISTENCY 0x00010000
   2213 #define TXFS_RM_FLAG_PREFER_AVAILABILITY 0x00020000
   2214 
   2215 #define TXFS_LOGGING_MODE_SIMPLE 1
   2216 #define TXFS_LOGGING_MODE_FULL 2
   2217 
   2218 #define TXFS_TRANSACTION_STATE_NONE      0
   2219 #define TXFS_TRANSACTION_STATE_ACTIVE    1
   2220 #define TXFS_TRANSACTION_STATE_PREPARED  2
   2221 #define TXFS_TRANSACTION_STATE_NOTACTIVE 3
   2222 
   2223 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE                        | \
   2224                                     TXFS_RM_FLAG_RENAME_RM                           | \
   2225                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX             | \
   2226                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN             | \
   2227                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
   2228                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        | \
   2229                                     TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          | \
   2230                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          | \
   2231                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN          | \
   2232                                     TXFS_RM_FLAG_SHRINK_LOG                          | \
   2233                                     TXFS_RM_FLAG_GROW_LOG                            | \
   2234                                     TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                | \
   2235                                     TXFS_RM_FLAG_PRESERVE_CHANGES                    | \
   2236                                     TXFS_RM_FLAG_RESET_RM_AT_NEXT_START              | \
   2237                                     TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START       | \
   2238                                     TXFS_RM_FLAG_PREFER_CONSISTENCY                  | \
   2239                                     TXFS_RM_FLAG_PREFER_AVAILABILITY)
   2240 
   2241 typedef struct _TXFS_MODIFY_RM {
   2242   ULONG     Flags;
   2243   ULONG     LogContainerCountMax;
   2244   ULONG     LogContainerCountMin;
   2245   ULONG     LogContainerCount;
   2246   ULONG     LogGrowthIncrement;
   2247   ULONG     LogAutoShrinkPercentage;
   2248   ULONGLONG Reserved;
   2249   USHORT    LoggingMode;
   2250 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
   2251 
   2252 #define TXFS_RM_STATE_NOT_STARTED 0
   2253 #define TXFS_RM_STATE_STARTING 1
   2254 #define TXFS_RM_STATE_ACTIVE 2
   2255 #define TXFS_RM_STATE_SHUTTING_DOWN 3
   2256 
   2257 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS                           \
   2258                 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS   |   \
   2259                  TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT          |   \
   2260                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX            |   \
   2261                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN            |   \
   2262                  TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                |   \
   2263                  TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START         |   \
   2264                  TXFS_RM_FLAG_PREFER_CONSISTENCY                    |   \
   2265                  TXFS_RM_FLAG_PREFER_AVAILABILITY)
   2266 
   2267 typedef struct _TXFS_QUERY_RM_INFORMATION {
   2268   ULONG         BytesRequired;
   2269   ULONGLONG     TailLsn;
   2270   ULONGLONG     CurrentLsn;
   2271   ULONGLONG     ArchiveTailLsn;
   2272   ULONGLONG     LogContainerSize;
   2273   LARGE_INTEGER HighestVirtualClock;
   2274   ULONG         LogContainerCount;
   2275   ULONG         LogContainerCountMax;
   2276   ULONG         LogContainerCountMin;
   2277   ULONG         LogGrowthIncrement;
   2278   ULONG         LogAutoShrinkPercentage;
   2279   ULONG         Flags;
   2280   USHORT        LoggingMode;
   2281   USHORT        Reserved;
   2282   ULONG         RmState;
   2283   ULONGLONG     LogCapacity;
   2284   ULONGLONG     LogFree;
   2285   ULONGLONG     TopsSize;
   2286   ULONGLONG     TopsUsed;
   2287   ULONGLONG     TransactionCount;
   2288   ULONGLONG     OnePCCount;
   2289   ULONGLONG     TwoPCCount;
   2290   ULONGLONG     NumberLogFileFull;
   2291   ULONGLONG     OldestTransactionAge;
   2292   GUID          RMName;
   2293   ULONG         TmLogPathOffset;
   2294 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
   2295 
   2296 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN 0x01
   2297 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK 0x02
   2298 
   2299 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS                               \
   2300                 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN |         \
   2301                  TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
   2302 
   2303 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
   2304   LARGE_INTEGER LastVirtualClock;
   2305   ULONGLONG     LastRedoLsn;
   2306   ULONGLONG     HighestRecoveryLsn;
   2307   ULONG         Flags;
   2308 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
   2309 
   2310 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000001
   2311 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000002
   2312 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE 0x00000004
   2313 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000008
   2314 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000010
   2315 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000020
   2316 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000040
   2317 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000080
   2318 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT 0x00000200
   2319 #define TXFS_START_RM_FLAG_LOGGING_MODE 0x00000400
   2320 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES 0x00000800
   2321 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY 0x00001000
   2322 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY 0x00002000
   2323 
   2324 #define TXFS_START_RM_VALID_FLAGS                                           \
   2325                 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX             |   \
   2326                  TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN             |   \
   2327                  TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                  |   \
   2328                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS |   \
   2329                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        |   \
   2330                  TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          |   \
   2331                  TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                 |   \
   2332                  TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          |   \
   2333                  TXFS_START_RM_FLAG_LOGGING_MODE                        |   \
   2334                  TXFS_START_RM_FLAG_PRESERVE_CHANGES                    |   \
   2335                  TXFS_START_RM_FLAG_PREFER_CONSISTENCY                  |   \
   2336                  TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
   2337 
   2338 typedef struct _TXFS_START_RM_INFORMATION {
   2339   ULONG     Flags;
   2340   ULONGLONG LogContainerSize;
   2341   ULONG     LogContainerCountMin;
   2342   ULONG     LogContainerCountMax;
   2343   ULONG     LogGrowthIncrement;
   2344   ULONG     LogAutoShrinkPercentage;
   2345   ULONG     TmLogPathOffset;
   2346   USHORT    TmLogPathLength;
   2347   USHORT    LoggingMode;
   2348   USHORT    LogPathLength;
   2349   USHORT    Reserved;
   2350   WCHAR     LogPath[1];
   2351 } TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
   2352 
   2353 typedef struct _TXFS_GET_METADATA_INFO_OUT {
   2354   struct {
   2355     LONGLONG LowPart;
   2356     LONGLONG HighPart;
   2357   } TxfFileId;
   2358   GUID      LockingTransaction;
   2359   ULONGLONG LastLsn;
   2360   ULONG     TransactionState;
   2361 } TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
   2362 
   2363 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED 0x00000001
   2364 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED 0x00000002
   2365 
   2366 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
   2367   ULONGLONG Offset;
   2368   ULONG     NameFlags;
   2369   LONGLONG  FileId;
   2370   ULONG     Reserved1;
   2371   ULONG     Reserved2;
   2372   LONGLONG  Reserved3;
   2373   WCHAR     FileName[1];
   2374 } TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
   2375 
   2376 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
   2377   GUID      KtmTransaction;
   2378   ULONGLONG NumberOfFiles;
   2379   ULONGLONG BufferSizeRequired;
   2380   ULONGLONG Offset;
   2381 } TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
   2382 
   2383 typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
   2384   GUID     TransactionId;
   2385   ULONG    TransactionState;
   2386   ULONG    Reserved1;
   2387   ULONG    Reserved2;
   2388   LONGLONG Reserved3;
   2389 } TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
   2390 
   2391 typedef struct _TXFS_LIST_TRANSACTIONS {
   2392   ULONGLONG NumberOfTransactions;
   2393   ULONGLONG BufferSizeRequired;
   2394 } TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
   2395 
   2396 typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
   2397   __C89_NAMELESS union {
   2398     ULONG BufferLength;
   2399     UCHAR Buffer;
   2400   } DUMMYUNIONNAME;
   2401 } TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
   2402 
   2403 typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
   2404   UCHAR Buffer;
   2405 } TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
   2406 
   2407 #define TXFS_TRANSACTED_VERSION_NONTRANSACTED 0xFFFFFFFE
   2408 #define TXFS_TRANSACTED_VERSION_UNCOMMITTED 0xFFFFFFFF
   2409 
   2410 typedef struct _TXFS_GET_TRANSACTED_VERSION {
   2411   ULONG  ThisBaseVersion;
   2412   ULONG  LatestVersion;
   2413   USHORT ThisMiniVersion;
   2414   USHORT FirstMiniVersion;
   2415   USHORT LatestMiniVersion;
   2416 } TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
   2417 
   2418 #define TXFS_SAVEPOINT_SET 1
   2419 #define TXFS_SAVEPOINT_ROLLBACK 2
   2420 #define TXFS_SAVEPOINT_CLEAR 4
   2421 #define TXFS_SAVEPOINT_CLEAR_ALL 16
   2422 
   2423 typedef struct _TXFS_SAVEPOINT_INFORMATION {
   2424   HANDLE KtmTransaction;
   2425   ULONG  ActionCode;
   2426   ULONG  SavepointId;
   2427 } TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
   2428 
   2429 typedef struct _TXFS_CREATE_MINIVERSION_INFO {
   2430   USHORT StructureVersion;
   2431   USHORT StructureLength;
   2432   ULONG  BaseVersion;
   2433   USHORT MiniVersion;
   2434 } TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
   2435 
   2436 typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
   2437   BOOLEAN TransactionsActiveAtSnapshot;
   2438 } TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
   2439 
   2440 typedef enum _WRITE_CACHE_TYPE {
   2441   WriteCacheTypeUnknown        = 0,
   2442   WriteCacheTypeNone           = 1,
   2443   WriteCacheTypeWriteBack      = 2,
   2444   WriteCacheTypeWriteThrough   = 3 
   2445 } WRITE_CACHE_TYPE;
   2446 
   2447 typedef enum _WRITE_CACHE_ENABLE {
   2448   WriteCacheEnableUnknown   = 0,
   2449   WriteCacheDisabled        = 1,
   2450   WriteCacheEnabled         = 2 
   2451 } WRITE_CACHE_ENABLE;
   2452 
   2453 typedef enum _WRITE_CACHE_CHANGE {
   2454   WriteCacheChangeUnknown   = 0,
   2455   WriteCacheNotChangeable   = 1,
   2456   WriteCacheChangeable      = 2 
   2457 } WRITE_CACHE_CHANGE;
   2458 
   2459 typedef enum _WRITE_THROUGH {
   2460   WriteThroughUnknown        = 0,
   2461   WriteThroughNotSupported   = 1,
   2462   WriteThroughSupported      = 2 
   2463 } WRITE_THROUGH;
   2464 
   2465 typedef struct _STORAGE_WRITE_CACHE_PROPERTY {
   2466   DWORD              Version;
   2467   DWORD              Size;
   2468   WRITE_CACHE_TYPE   WriteCacheType;
   2469   WRITE_CACHE_ENABLE WriteCacheEnabled;
   2470   WRITE_CACHE_CHANGE WriteCacheChangeable;
   2471   WRITE_THROUGH      WriteThroughSupported;
   2472   BOOLEAN            FlushCacheSupported;
   2473   BOOLEAN            UserDefinedPowerProtection;
   2474   BOOLEAN            NVCacheEnabled;
   2475 } STORAGE_WRITE_CACHE_PROPERTY, *PSTORAGE_WRITE_CACHE_PROPERTY;
   2476 
   2477 typedef enum _STORAGE_PORT_CODE_SET {
   2478   StoragePortCodeSetReserved = 0,
   2479   StoragePortCodeSetStorport = 1,
   2480   StoragePortCodeSetSCSIport = 2,
   2481   StoragePortCodeSetSpaceport = 3,
   2482   StoragePortCodeSetATAport = 4,
   2483   StoragePortCodeSetUSBport = 5,
   2484   StoragePortCodeSetSBP2port = 6,
   2485   StoragePortCodeSetSDport = 7
   2486 } STORAGE_PORT_CODE_SET, *PSTORAGE_PORT_CODE_SET;
   2487 
   2488 typedef struct _STORAGE_MINIPORT_DESCRIPTOR {
   2489   DWORD                 Version;
   2490   DWORD                 Size;
   2491   STORAGE_PORT_CODE_SET Portdriver;
   2492   BOOLEAN               LUNResetSupported;
   2493   BOOLEAN               TargetResetSupported;
   2494 } STORAGE_MINIPORT_DESCRIPTOR, *PSTORAGE_MINIPORT_DESCRIPTOR;
   2495 
   2496 typedef enum _STORAGE_IDENTIFIER_CODE_SET {
   2497   StorageIdCodeSetReserved = 0,
   2498   StorageIdCodeSetBinary = 1,
   2499   StorageIdCodeSetAscii = 2,
   2500   StorageIdCodeSetUtf8 = 3
   2501 } STORAGE_IDENTIFIER_CODE_SET, *PSTORAGE_IDENTIFIER_CODE_SET;
   2502 
   2503 typedef enum _STORAGE_IDENTIFIER_TYPE {
   2504   StorageIdTypeVendorSpecific = 0,
   2505   StorageIdTypeVendorId = 1,
   2506   StorageIdTypeEUI64 = 2,
   2507   StorageIdTypeFCPHName = 3,
   2508   StorageIdTypePortRelative = 4,
   2509   StorageIdTypeTargetPortGroup = 5,
   2510   StorageIdTypeLogicalUnitGroup = 6,
   2511   StorageIdTypeMD5LogicalUnitIdentifier = 7,
   2512   StorageIdTypeScsiNameString = 8
   2513 } STORAGE_IDENTIFIER_TYPE, *PSTORAGE_IDENTIFIER_TYPE;
   2514 
   2515 #define StorageIdTypeNAA StorageIdTypeFCPHName
   2516 
   2517 typedef enum _STORAGE_ID_NAA_FORMAT {
   2518   StorageIdNAAFormatIEEEExtended = 2,
   2519   StorageIdNAAFormatIEEERegistered = 3,
   2520   StorageIdNAAFormatIEEEERegisteredExtended = 5
   2521 } STORAGE_ID_NAA_FORMAT, *PSTORAGE_ID_NAA_FORMAT;
   2522 
   2523 typedef enum _STORAGE_ASSOCIATION_TYPE {
   2524   StorageIdAssocDevice = 0,
   2525   StorageIdAssocPort = 1,
   2526   StorageIdAssocTarget = 2
   2527 } STORAGE_ASSOCIATION_TYPE, *PSTORAGE_ASSOCIATION_TYPE;
   2528 
   2529 typedef struct _STORAGE_IDENTIFIER {
   2530   STORAGE_IDENTIFIER_CODE_SET CodeSet;
   2531   STORAGE_IDENTIFIER_TYPE Type;
   2532   USHORT IdentifierSize;
   2533   USHORT NextOffset;
   2534   STORAGE_ASSOCIATION_TYPE Association;
   2535   UCHAR Identifier[1];
   2536 } STORAGE_IDENTIFIER, *PSTORAGE_IDENTIFIER;
   2537 
   2538 typedef struct _STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR {
   2539   DWORD Version;
   2540   DWORD Size;
   2541   DWORD BytesPerCacheLine;
   2542   DWORD BytesOffsetForCacheAlignment;
   2543   DWORD BytesPerLogicalSector;
   2544   DWORD BytesPerPhysicalSector;
   2545   DWORD BytesOffsetForSectorAlignment;
   2546 } STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR, *PSTORAGE_ACCESS_ALIGNMENT_DESCRIPTOR;
   2547 
   2548 typedef struct _STORAGE_MEDIUM_PRODUCT_TYPE_DESCRIPTOR {
   2549   DWORD Version;
   2550   DWORD Size;
   2551   DWORD MediumProductType;
   2552 } STORAGE_MEDIUM_PRODUCT_TYPE_DESCRIPTOR, *PSTORAGE_MEDIUM_PRODUCT_TYPE_DESCRIPTOR;
   2553 
   2554 #endif /*(_WIN32_WINNT >= 0x0600)*/
   2555 
   2556 typedef struct _DEVICE_SEEK_PENALTY_DESCRIPTOR {
   2557   DWORD   Version;
   2558   DWORD   Size;
   2559   BOOLEAN IncursSeekPenalty;
   2560 } DEVICE_SEEK_PENALTY_DESCRIPTOR, *PDEVICE_SEEK_PENALTY_DESCRIPTOR;
   2561 
   2562 typedef struct _DEVICE_WRITE_AGGREGATION_DESCRIPTOR {
   2563   ULONG Version;
   2564   ULONG Size;
   2565   BOOLEAN BenefitsFromWriteAggregation;
   2566 } DEVICE_WRITE_AGGREGATION_DESCRIPTOR, *PDEVICE_WRITE_AGGREGATION_DESCRIPTOR;
   2567 
   2568 typedef struct _DEVICE_TRIM_DESCRIPTOR {
   2569   DWORD   Version;
   2570   DWORD   Size;
   2571   BOOLEAN TrimEnabled;
   2572 } DEVICE_TRIM_DESCRIPTOR, *PDEVICE_TRIM_DESCRIPTOR;
   2573 
   2574 typedef struct _DEVICE_LB_PROVISIONING_DESCRIPTOR {
   2575   DWORD Version;
   2576   DWORD Size;
   2577   BYTE ThinProvisioningEnabled : 1;
   2578   BYTE ThinProvisioningReadZeros : 1;
   2579   BYTE AnchorSupported : 3;
   2580   BYTE UnmapGranularityAlignmentValid : 1;
   2581   BYTE GetFreeSpaceSupported : 1;
   2582   BYTE MapSupported : 1;
   2583   BYTE Reserved1[7];
   2584   DWORDLONG OptimalUnmapGranularity;
   2585   DWORDLONG UnmapGranularityAlignment;
   2586 #if NTDDI_VERSION >= NTDDI_WINBLUE
   2587   DWORD MaxUnmapLbaCount;
   2588   DWORD MaxUnmapBlockDescriptorCount;
   2589 #endif
   2590 } DEVICE_LB_PROVISIONING_DESCRIPTOR, *PDEVICE_LB_PROVISIONING_DESCRIPTOR;
   2591 
   2592 #define DEVICE_LB_PROVISIONING_DESCRIPTOR_V1_SIZE RTL_SIZEOF_THROUGH_FIELD(DEVICE_LB_PROVISIONING_DESCRIPTOR, UnmapGranularityAlignment)
   2593 
   2594 typedef struct _STORAGE_LB_PROVISIONING_MAP_RESOURCES {
   2595   DWORD Size;
   2596   DWORD Version;
   2597   BYTE AvailableMappingResourcesValid : 1;
   2598   BYTE UsedMappingResourcesValid : 1;
   2599   BYTE Reserved0 : 6;
   2600   BYTE Reserved1[3];
   2601   BYTE AvailableMappingResourcesScope : 2;
   2602   BYTE UsedMappingResourcesScope : 2;
   2603   BYTE Reserved2 : 4;
   2604   BYTE Reserved3[3];
   2605   DWORDLONG AvailableMappingResources;
   2606   DWORDLONG UsedMappingResources;
   2607 } STORAGE_LB_PROVISIONING_MAP_RESOURCES, *PSTORAGE_LB_PROVISIONING_MAP_RESOURCES;
   2608 
   2609 typedef struct _DEVICE_POWER_DESCRIPTOR {
   2610   DWORD Version;
   2611   DWORD Size;
   2612   BOOLEAN DeviceAttentionSupported;
   2613   BOOLEAN AsynchronousNotificationSupported;
   2614   BOOLEAN IdlePowerManagementEnabled;
   2615   BOOLEAN D3ColdEnabled;
   2616   BOOLEAN D3ColdSupported;
   2617   BOOLEAN NoVerifyDuringIdlePower;
   2618   BYTE Reserved[2];
   2619   DWORD IdleTimeoutInMS;
   2620 } DEVICE_POWER_DESCRIPTOR, *PDEVICE_POWER_DESCRIPTOR;
   2621 
   2622 typedef struct _DEVICE_COPY_OFFLOAD_DESCRIPTOR {
   2623   DWORD Version;
   2624   DWORD Size;
   2625   DWORD MaximumTokenLifetime;
   2626   DWORD DefaultTokenLifetime;
   2627   DWORDLONG MaximumTransferSize;
   2628   DWORDLONG OptimalTransferCount;
   2629   DWORD MaximumDataDescriptors;
   2630   DWORD MaximumTransferLengthPerDescriptor;
   2631   DWORD OptimalTransferLengthPerDescriptor;
   2632   WORD OptimalTransferLengthGranularity;
   2633   BYTE Reserved[2];
   2634 } DEVICE_COPY_OFFLOAD_DESCRIPTOR, *PDEVICE_COPY_OFFLOAD_DESCRIPTOR;
   2635 
   2636 typedef struct _STORAGE_DEVICE_RESILIENCY_DESCRIPTOR {
   2637   DWORD Version;
   2638   DWORD Size;
   2639   DWORD NameOffset;
   2640   DWORD NumberOfLogicalCopies;
   2641   DWORD NumberOfPhysicalCopies;
   2642   DWORD PhysicalDiskRedundancy;
   2643   DWORD NumberOfColumns;
   2644   DWORD Interleave;
   2645 } STORAGE_DEVICE_RESILIENCY_DESCRIPTOR, *PSTORAGE_DEVICE_RESILIENCY_DESCRIPTOR;
   2646 
   2647 typedef enum _STORAGE_RPMB_FRAME_TYPE {
   2648   StorageRpmbFrameTypeUnknown = 0,
   2649   StorageRpmbFrameTypeStandard,
   2650   StorageRpmbFrameTypeMax
   2651 } STORAGE_RPMB_FRAME_TYPE, *PSTORAGE_RPMB_FRAME_TYPE;
   2652 
   2653 #define STORAGE_RPMB_DESCRIPTOR_VERSION_1 1
   2654 
   2655 #define STORAGE_RPMB_MINIMUM_RELIABLE_WRITE_SIZE 512
   2656 
   2657 typedef struct _STORAGE_RPMB_DESCRIPTOR {
   2658   DWORD Version;
   2659   DWORD Size;
   2660   DWORD SizeInBytes;
   2661   DWORD MaxReliableWriteSizeInBytes;
   2662   STORAGE_RPMB_FRAME_TYPE FrameFormat;
   2663 } STORAGE_RPMB_DESCRIPTOR, *PSTORAGE_RPMB_DESCRIPTOR;
   2664 
   2665 typedef enum _STORAGE_CRYPTO_ALGORITHM_ID {
   2666   StorageCryptoAlgorithmUnknown = 0,
   2667   StorageCryptoAlgorithmXTSAES = 1,
   2668   StorageCryptoAlgorithmBitlockerAESCBC,
   2669   StorageCryptoAlgorithmAESECB,
   2670   StorageCryptoAlgorithmESSIVAESCBC,
   2671   StorageCryptoAlgorithmMax
   2672 } STORAGE_CRYPTO_ALGORITHM_ID, *PSTORAGE_CRYPTO_ALGORITHM_ID;
   2673 
   2674 typedef enum _STORAGE_CRYPTO_KEY_SIZE {
   2675   StorageCryptoKeySizeUnknown = 0,
   2676   StorageCryptoKeySize128Bits = 1,
   2677   StorageCryptoKeySize192Bits,
   2678   StorageCryptoKeySize256Bits,
   2679   StorageCryptoKeySize512Bits
   2680 } STORAGE_CRYPTO_KEY_SIZE, *PSTORAGE_CRYPTO_KEY_SIZE;
   2681 
   2682 #define STORAGE_CRYPTO_CAPABILITY_VERSION_1 1
   2683 
   2684 typedef struct _STORAGE_CRYPTO_CAPABILITY {
   2685   DWORD Version;
   2686   DWORD Size;
   2687   DWORD CryptoCapabilityIndex;
   2688   STORAGE_CRYPTO_ALGORITHM_ID AlgorithmId;
   2689   STORAGE_CRYPTO_KEY_SIZE KeySize;
   2690   DWORD DataUnitSizeBitmask;
   2691 } STORAGE_CRYPTO_CAPABILITY, *PSTORAGE_CRYPTO_CAPABILITY;
   2692 
   2693 #define STORAGE_CRYPTO_DESCRIPTOR_VERSION_1 1
   2694 
   2695 typedef struct _STORAGE_CRYPTO_DESCRIPTOR {
   2696   DWORD Version;
   2697   DWORD Size;
   2698   DWORD NumKeysSupported;
   2699   DWORD NumCryptoCapabilities;
   2700   STORAGE_CRYPTO_CAPABILITY CryptoCapabilities[ANYSIZE_ARRAY];
   2701 } STORAGE_CRYPTO_DESCRIPTOR, *PSTORAGE_CRYPTO_DESCRIPTOR;
   2702 
   2703 #define STORAGE_TIER_NAME_LENGTH (256)
   2704 #define STORAGE_TIER_DESCRIPTION_LENGTH (512)
   2705 
   2706 #define STORAGE_TIER_FLAG_NO_SEEK_PENALTY (0x00020000)
   2707 #define STORAGE_TIER_FLAG_WRITE_BACK_CACHE (0x00200000)
   2708 #define STORAGE_TIER_FLAG_READ_CACHE (0x00400000)
   2709 #define STORAGE_TIER_FLAG_PARITY (0x00800000)
   2710 #define STORAGE_TIER_FLAG_SMR (0x01000000)
   2711 
   2712 typedef enum _STORAGE_TIER_MEDIA_TYPE {
   2713   StorageTierMediaTypeUnspecified = 0,
   2714   StorageTierMediaTypeDisk = 1,
   2715   StorageTierMediaTypeSsd = 2,
   2716   StorageTierMediaTypeScm = 4,
   2717   StorageTierMediaTypeMax
   2718 } STORAGE_TIER_MEDIA_TYPE, *PSTORAGE_TIER_MEDIA_TYPE;
   2719 
   2720 typedef enum _STORAGE_TIER_CLASS {
   2721   StorageTierClassUnspecified = 0,
   2722   StorageTierClassCapacity,
   2723   StorageTierClassPerformance,
   2724   StorageTierClassMax
   2725 } STORAGE_TIER_CLASS, *PSTORAGE_TIER_CLASS;
   2726 
   2727 typedef struct _STORAGE_TIER {
   2728   GUID Id;
   2729   WCHAR Name[STORAGE_TIER_NAME_LENGTH];
   2730   WCHAR Description[STORAGE_TIER_NAME_LENGTH];
   2731   DWORDLONG Flags;
   2732   DWORDLONG ProvisionedCapacity;
   2733   STORAGE_TIER_MEDIA_TYPE MediaType;
   2734   STORAGE_TIER_CLASS Class;
   2735 } STORAGE_TIER, *PSTORAGE_TIER;
   2736 
   2737 typedef struct _STORAGE_DEVICE_TIERING_DESCRIPTOR {
   2738   DWORD Version;
   2739   DWORD Size;
   2740   DWORD Flags;
   2741   DWORD TotalNumberOfTiers;
   2742   DWORD NumberOfTiersReturned;
   2743   STORAGE_TIER Tiers[ANYSIZE_ARRAY];
   2744 } STORAGE_DEVICE_TIERING_DESCRIPTOR, *PSTORAGE_DEVICE_TIERING_DESCRIPTOR;
   2745 
   2746 typedef struct _STORAGE_DEVICE_FAULT_DOMAIN_DESCRIPTOR {
   2747   DWORD Version;
   2748   DWORD Size;
   2749   DWORD NumberOfFaultDomains;
   2750   GUID FaultDomainIds[ANYSIZE_ARRAY];
   2751 } STORAGE_DEVICE_FAULT_DOMAIN_DESCRIPTOR, *PSTORAGE_DEVICE_FAULT_DOMAIN_DESCRIPTOR;
   2752 
   2753 typedef enum _STORAGE_PROTOCOL_TYPE {
   2754   ProtocolTypeUnknown = 0x00,
   2755   ProtocolTypeScsi,
   2756   ProtocolTypeAta,
   2757   ProtocolTypeNvme,
   2758   ProtocolTypeSd,
   2759   ProtocolTypeUfs,
   2760   ProtocolTypeProprietary = 0x7E,
   2761   ProtocolTypeMaxReserved = 0x7F
   2762 } STORAGE_PROTOCOL_TYPE, *PSTORAGE_PROTOCOL_TYPE;
   2763 
   2764 typedef enum _STORAGE_PROTOCOL_NVME_DATA_TYPE {
   2765   NVMeDataTypeUnknown = 0,
   2766   NVMeDataTypeIdentify,
   2767   NVMeDataTypeLogPage,
   2768   NVMeDataTypeFeature
   2769 } STORAGE_PROTOCOL_NVME_DATA_TYPE, *PSTORAGE_PROTOCOL_NVME_DATA_TYPE;
   2770 
   2771 typedef enum _STORAGE_PROTOCOL_ATA_DATA_TYPE {
   2772   AtaDataTypeUnknown = 0,
   2773   AtaDataTypeIdentify,
   2774   AtaDataTypeLogPage
   2775 } STORAGE_PROTOCOL_ATA_DATA_TYPE, *PSTORAGE_PROTOCOL_ATA_DATA_TYPE;
   2776 
   2777 typedef enum _STORAGE_PROTOCOL_UFS_DATA_TYPE {
   2778   UfsDataTypeUnknown = 0,
   2779   UfsDataTypeQueryDescriptor,
   2780   UfsDataTypeQueryAttribute,
   2781   UfsDataTypeQueryFlag,
   2782   UfsDataTypeQueryDmeAttribute,
   2783   UfsDataTypeQueryDmePeerAttribute,
   2784   UfsDataTypeMax
   2785 } STORAGE_PROTOCOL_UFS_DATA_TYPE, *PSTORAGE_PROTOCOL_UFS_DATA_TYPE;
   2786 
   2787 typedef union _STORAGE_PROTOCOL_DATA_SUBVALUE_GET_LOG_PAGE {
   2788   __C89_NAMELESS struct {
   2789     DWORD RetainAsynEvent : 1;
   2790     DWORD LogSpecificField : 4;
   2791     DWORD Reserved : 27;
   2792   };
   2793   DWORD AsUlong;
   2794 } STORAGE_PROTOCOL_DATA_SUBVALUE_GET_LOG_PAGE, *PSTORAGE_PROTOCOL_DATA_SUBVALUE_GET_LOG_PAGE;
   2795 
   2796 typedef struct _STORAGE_PROTOCOL_SPECIFIC_DATA {
   2797   STORAGE_PROTOCOL_TYPE ProtocolType;
   2798   DWORD DataType;
   2799   DWORD ProtocolDataRequestValue;
   2800   DWORD ProtocolDataRequestSubValue;
   2801   DWORD ProtocolDataOffset;
   2802   DWORD ProtocolDataLength;
   2803   DWORD FixedProtocolReturnData;
   2804   DWORD ProtocolDataRequestSubValue2;
   2805   DWORD ProtocolDataRequestSubValue3;
   2806   DWORD ProtocolDataRequestSubValue4;
   2807 } STORAGE_PROTOCOL_SPECIFIC_DATA, *PSTORAGE_PROTOCOL_SPECIFIC_DATA;
   2808 
   2809 typedef struct _STORAGE_PROTOCOL_SPECIFIC_DATA_EXT {
   2810   STORAGE_PROTOCOL_TYPE ProtocolType;
   2811   DWORD DataType;
   2812   DWORD ProtocolDataValue;
   2813   DWORD ProtocolDataSubValue;
   2814   DWORD ProtocolDataOffset;
   2815   DWORD ProtocolDataLength;
   2816   DWORD FixedProtocolReturnData;
   2817   DWORD ProtocolDataSubValue2;
   2818   DWORD ProtocolDataSubValue3;
   2819   DWORD ProtocolDataSubValue4;
   2820   DWORD ProtocolDataSubValue5;
   2821   DWORD Reserved[5];
   2822 } STORAGE_PROTOCOL_SPECIFIC_DATA_EXT, *PSTORAGE_PROTOCOL_SPECIFIC_DATA_EXT;
   2823 
   2824 typedef struct _STORAGE_PROTOCOL_DATA_DESCRIPTOR {
   2825   DWORD Version;
   2826   DWORD Size;
   2827   STORAGE_PROTOCOL_SPECIFIC_DATA ProtocolSpecificData;
   2828 } STORAGE_PROTOCOL_DATA_DESCRIPTOR, *PSTORAGE_PROTOCOL_DATA_DESCRIPTOR;
   2829 
   2830 typedef struct _STORAGE_PROTOCOL_DATA_DESCRIPTOR_EXT {
   2831   DWORD Version;
   2832   DWORD Size;
   2833   STORAGE_PROTOCOL_SPECIFIC_DATA_EXT ProtocolSpecificData;
   2834 } STORAGE_PROTOCOL_DATA_DESCRIPTOR_EXT, *PSTORAGE_PROTOCOL_DATA_DESCRIPTOR_EXT;
   2835 
   2836 #define STORAGE_TEMPERATURE_VALUE_NOT_REPORTED 0x8000
   2837 
   2838 typedef struct _STORAGE_TEMPERATURE_INFO {
   2839   WORD Index;
   2840   SHORT Temperature;
   2841   SHORT OverThreshold;
   2842   SHORT UnderThreshold;
   2843   BOOLEAN OverThresholdChangable;
   2844   BOOLEAN UnderThresholdChangable;
   2845   BOOLEAN EventGenerated;
   2846   BYTE Reserved0;
   2847   DWORD Reserved1;
   2848 } STORAGE_TEMPERATURE_INFO, *PSTORAGE_TEMPERATURE_INFO;
   2849 
   2850 typedef struct _STORAGE_TEMPERATURE_DATA_DESCRIPTOR {
   2851   DWORD Version;
   2852   DWORD Size;
   2853   SHORT CriticalTemperature;
   2854   SHORT WarningTemperature;
   2855   WORD InfoCount;
   2856   BYTE Reserved0[2];
   2857   DWORD Reserved1[2];
   2858   STORAGE_TEMPERATURE_INFO TemperatureInfo[ANYSIZE_ARRAY];
   2859 } STORAGE_TEMPERATURE_DATA_DESCRIPTOR, *PSTORAGE_TEMPERATURE_DATA_DESCRIPTOR;
   2860 
   2861 #define STORAGE_TEMPERATURE_THRESHOLD_FLAG_ADAPTER_REQUEST 0x0001
   2862 
   2863 typedef struct _STORAGE_TEMPERATURE_THRESHOLD {
   2864   DWORD Version;
   2865   DWORD Size;
   2866   WORD Flags;
   2867   WORD Index;
   2868   SHORT Threshold;
   2869   BOOLEAN OverThreshold;
   2870   BYTE Reserved;
   2871 } STORAGE_TEMPERATURE_THRESHOLD, *PSTORAGE_TEMPERATURE_THRESHOLD;
   2872 
   2873 #define STORAGE_PROTOCOL_STRUCTURE_VERSION 0x1
   2874 
   2875 typedef struct _STORAGE_PROTOCOL_COMMAND {
   2876   DWORD Version;
   2877   DWORD Length;
   2878   STORAGE_PROTOCOL_TYPE ProtocolType;
   2879   DWORD Flags;
   2880   DWORD ReturnStatus;
   2881   DWORD ErrorCode;
   2882   DWORD CommandLength;
   2883   DWORD ErrorInfoLength;
   2884   DWORD DataToDeviceTransferLength;
   2885   DWORD DataFromDeviceTransferLength;
   2886   DWORD TimeOutValue;
   2887   DWORD ErrorInfoOffset;
   2888   DWORD DataToDeviceBufferOffset;
   2889   DWORD DataFromDeviceBufferOffset;
   2890   DWORD CommandSpecific;
   2891   DWORD Reserved0;
   2892   DWORD FixedProtocolReturnData;
   2893   DWORD Reserved1[3];
   2894   BYTE Command[ANYSIZE_ARRAY];
   2895 } STORAGE_PROTOCOL_COMMAND, *PSTORAGE_PROTOCOL_COMMAND;
   2896 
   2897 #define STORAGE_PROTOCOL_COMMAND_FLAG_ADAPTER_REQUEST 0x80000000
   2898 
   2899 #define STORAGE_PROTOCOL_STATUS_PENDING 0x0
   2900 #define STORAGE_PROTOCOL_STATUS_SUCCESS 0x1
   2901 #define STORAGE_PROTOCOL_STATUS_ERROR 0x2
   2902 #define STORAGE_PROTOCOL_STATUS_INVALID_REQUEST 0x3
   2903 #define STORAGE_PROTOCOL_STATUS_NO_DEVICE 0x4
   2904 #define STORAGE_PROTOCOL_STATUS_BUSY 0x5
   2905 #define STORAGE_PROTOCOL_STATUS_DATA_OVERRUN 0x6
   2906 #define STORAGE_PROTOCOL_STATUS_INSUFFICIENT_RESOURCES 0x7
   2907 #define STORAGE_PROTOCOL_STATUS_THROTTLED_REQUEST 0x8
   2908 #define STORAGE_PROTOCOL_STATUS_NOT_SUPPORTED 0xFF
   2909 
   2910 #define STORAGE_PROTOCOL_COMMAND_LENGTH_NVME 0x40
   2911 
   2912 #define STORAGE_PROTOCOL_SPECIFIC_NVME_ADMIN_COMMAND 0x01
   2913 #define STORAGE_PROTOCOL_SPECIFIC_NVME_NVM_COMMAND 0x02
   2914 
   2915 #if (_WIN32_WINNT >= 0x0601)
   2916 typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
   2917   WORD  StructureVersion;
   2918   WORD  StructureLength;
   2919   DWORD RequestedOplockLevel;
   2920   DWORD Flags;
   2921 } REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
   2922 
   2923 typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
   2924   WORD        StructureVersion;
   2925   WORD        StructureLength;
   2926   DWORD       OriginalOplockLevel;
   2927   DWORD       NewOplockLevel;
   2928   DWORD       Flags;
   2929   ACCESS_MASK AccessMode;
   2930   WORD        ShareMode;
   2931 } REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
   2932 
   2933 #define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED        (0x00000001)
   2934 
   2935 typedef struct _BOOT_AREA_INFO {
   2936   ULONG BootSectorCount;
   2937   struct {
   2938     LARGE_INTEGER Offset;
   2939   } BootSectors[2];
   2940 } BOOT_AREA_INFO, *PBOOT_AREA_INFO;
   2941 
   2942 typedef struct _RETRIEVAL_POINTER_BASE {
   2943   LARGE_INTEGER FileAreaOffset;
   2944 } RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
   2945 
   2946 typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION {
   2947   ULONG VolumeFlags;
   2948   ULONG FlagMask;
   2949   ULONG Version;
   2950   ULONG Reserved;
   2951 } FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION;
   2952 
   2953 typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
   2954   CHAR FileSystem[9];
   2955 } FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
   2956 
   2957 typedef struct _FILE_SYSTEM_RECOGNITION_STRUCTURE {
   2958   UCHAR  Jmp[3];
   2959   UCHAR  FsName[8];
   2960   UCHAR  MustBeZero[5];
   2961   ULONG  Identifier;
   2962   USHORT Length;
   2963   USHORT Checksum;
   2964 } FILE_SYSTEM_RECOGNITION_STRUCTURE;
   2965 
   2966 #define OPLOCK_LEVEL_CACHE_READ         (0x00000001)
   2967 #define OPLOCK_LEVEL_CACHE_HANDLE       (0x00000002)
   2968 #define OPLOCK_LEVEL_CACHE_WRITE        (0x00000004)
   2969 
   2970 #define REQUEST_OPLOCK_INPUT_FLAG_REQUEST               (0x00000001)
   2971 #define REQUEST_OPLOCK_INPUT_FLAG_ACK                   (0x00000002)
   2972 #define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)
   2973 
   2974 #define REQUEST_OPLOCK_CURRENT_VERSION          1
   2975 
   2976 #define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED     (0x00000001)
   2977 #define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED   (0x00000002)
   2978 
   2979 #define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID   1
   2980 
   2981 typedef struct _SD_CHANGE_MACHINE_SID_INPUT {
   2982   USHORT CurrentMachineSIDOffset;
   2983   USHORT CurrentMachineSIDLength;
   2984   USHORT NewMachineSIDOffset;
   2985   USHORT NewMachineSIDLength;
   2986 } SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT;
   2987 
   2988 typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
   2989   ULONGLONG NumSDChangedSuccess;
   2990   ULONGLONG NumSDChangedFail;
   2991   ULONGLONG NumSDUnused;
   2992   ULONGLONG NumSDTotal;
   2993   ULONGLONG NumMftSDChangedSuccess;
   2994   ULONGLONG NumMftSDChangedFail;
   2995   ULONGLONG NumMftSDTotal;
   2996 } SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT;
   2997 
   2998 #define ENCRYPTED_DATA_INFO_SPARSE_FILE    1
   2999 
   3000 typedef struct _EXTENDED_ENCRYPTED_DATA_INFO {
   3001   ULONG ExtendedCode;
   3002   ULONG Length;
   3003   ULONG Flags;
   3004   ULONG Reserved;
   3005 } EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO;
   3006 
   3007 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
   3008   DWORD         Flags;
   3009   DWORD         NumberOfClusters;
   3010   LARGE_INTEGER Cluster[1];
   3011 } LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
   3012 
   3013 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
   3014   DWORD Offset;
   3015   DWORD NumberOfMatches;
   3016   DWORD BufferSizeRequired;
   3017 } LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
   3018 
   3019 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
   3020   DWORD         OffsetToNext;
   3021   DWORD         Flags;
   3022   LARGE_INTEGER Reserved;
   3023   LARGE_INTEGER Cluster;
   3024   WCHAR         FileName[1];
   3025 } LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
   3026 
   3027 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK 0xff000000
   3028 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE 0x00000001
   3029 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET 0x00000002
   3030 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE 0x00000004
   3031 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE 0x00000008
   3032 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA 0x01000000
   3033 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX 0x02000000
   3034 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM 0x03000000
   3035 
   3036 typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
   3037   ULONG Flags;
   3038   ULONG NumFileTypeIDs;
   3039   GUID FileTypeID[1];
   3040 } FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT;
   3041 
   3042 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN     0x00000001
   3043 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END       0x00000002
   3044 
   3045 #define FSCTL_QUERY_DEPENDENT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,124, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3046 #define FSCTL_SD_GLOBAL_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,125, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3047 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM,127, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3048 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,128, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3049 #define FSCTL_FILE_TYPE_NOTIFICATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,129, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3050 #define FSCTL_GET_BOOT_AREA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,140, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3051 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,141, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3052 #define FSCTL_SET_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3053 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3054 #define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,144,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3055 #define FSCTL_CSV_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3056 #define FSCTL_IS_CSV_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3057 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,147, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3058 #define FSCTL_CSV_GET_VOLUME_PATH_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,148, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3059 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3060 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3061 #define FSCTL_IS_FILE_ON_CSV_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3062 #define FSCTL_CSV_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 155, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3063 #define FSCTL_SET_EXTERNAL_BACKING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 195, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3064 #define FSCTL_GET_EXTERNAL_BACKING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 196, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3065 #define FSCTL_DELETE_EXTERNAL_BACKING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 197, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3066 #define FSCTL_ENUM_EXTERNAL_BACKING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 198, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3067 #define FSCTL_ENUM_OVERLAY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 199, METHOD_NEITHER, FILE_ANY_ACCESS)
   3068 #define FSCTL_ADD_OVERLAY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 204, METHOD_BUFFERED, FILE_WRITE_DATA)
   3069 #define FSCTL_REMOVE_OVERLAY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 205, METHOD_BUFFERED, FILE_WRITE_DATA)
   3070 #define FSCTL_UPDATE_OVERLAY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 206, METHOD_BUFFERED, FILE_WRITE_DATA)
   3071 #define FSCTL_GET_WOF_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 218, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3072 #define FSCTL_SUSPEND_OVERLAY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 225, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3073 
   3074 typedef struct _CSV_NAMESPACE_INFO {
   3075   ULONG Version;
   3076   ULONG DeviceNumber;
   3077   LARGE_INTEGER StartingOffset;
   3078   ULONG SectorSize;
   3079 } CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
   3080 
   3081 #define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
   3082 #define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
   3083 
   3084 #endif /*(_WIN32_WINNT >= 0x0601)*/
   3085 
   3086 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
   3087 #define FSCTL_FILE_LEVEL_TRIM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 130, METHOD_BUFFERED, FILE_WRITE_DATA)
   3088 #define FSCTL_CORRUPTION_HANDLING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 152, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3089 #define FSCTL_OFFLOAD_READ CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 153, METHOD_BUFFERED, FILE_READ_ACCESS)
   3090 #define FSCTL_OFFLOAD_WRITE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 154, METHOD_BUFFERED, FILE_WRITE_ACCESS)
   3091 #define FSCTL_SET_PURGE_FAILURE_MODE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 156, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3092 #define FSCTL_QUERY_FILE_LAYOUT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 157, METHOD_NEITHER, FILE_ANY_ACCESS)
   3093 #define FSCTL_IS_VOLUME_OWNED_BYCSVFS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 158, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3094 #define FSCTL_GET_INTEGRITY_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 159, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3095 #define FSCTL_SET_INTEGRITY_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 160, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
   3096 #define FSCTL_QUERY_FILE_REGIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 161, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3097 #define FSCTL_RKF_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 171, METHOD_NEITHER, FILE_ANY_ACCESS)
   3098 #define FSCTL_SCRUB_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 172, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3099 #define FSCTL_REPAIR_COPIES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 173, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
   3100 #define FSCTL_DISABLE_LOCAL_BUFFERING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 174, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3101 #define FSCTL_CSV_MGMT_LOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 175, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3102 #define FSCTL_CSV_QUERY_DOWN_LEVEL_FILE_SYSTEM_CHARACTERISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 176, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3103 #define FSCTL_ADVANCE_FILE_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 177, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3104 #define FSCTL_CSV_SYNC_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 178, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3105 #define FSCTL_CSV_QUERY_VETO_FILE_DIRECT_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 179, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3106 #define FSCTL_WRITE_USN_REASON CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 180, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3107 #define FSCTL_CSV_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 181, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3108 #define FSCTL_GET_REFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 182, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3109 #define FSCTL_CSV_H_BREAKING_SYNC_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 185, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3110 #define FSCTL_SHUFFLE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 208, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   3111 #endif /*_WIN32_WINNT >= _WIN32_WINNT_WIN8 */
   3112 
   3113 #if (_WIN32_WINNT >= _WIN32_WINNT_WINBLUE)
   3114 #define FSCTL_QUERY_STORAGE_CLASSES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 187, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3115 #define FSCTL_QUERY_REGION_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 188, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3116 #define FSCTL_USN_TRACK_MODIFIED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 189, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3117 #define FSCTL_QUERY_SHARED_VIRTUAL_DISK_SUPPORT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 192, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3118 #define FSCTL_SVHDX_SYNC_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 193, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3119 #define FSCTL_SVHDX_SET_INITIATOR_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 194, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3120 #define FSCTL_DUPLICATE_EXTENTS_TO_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 209, METHOD_BUFFERED, FILE_WRITE_DATA)
   3121 #define FSCTL_SPARSE_OVERALLOCATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 211, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3122 #define FSCTL_STORAGE_QOS_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 212, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3123 #define FSCTL_SVHDX_ASYNC_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 217, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3124 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WINBLUE) */
   3125 
   3126 #if (_WIN32_WINNT >= _WIN32_WINNT_WINTHRESHOLD)
   3127 #define FSCTL_INITIATE_FILE_METADATA_OPTIMIZATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 215, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3128 #define FSCTL_QUERY_FILE_METADATA_OPTIMIZATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 216, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3129 #define FSCTL_HCS_SYNC_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 219, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3130 #define FSCTL_HCS_ASYNC_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 220, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3131 #define FSCTL_QUERY_EXTENT_READ_CACHE_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 221, METHOD_NEITHER, FILE_ANY_ACCESS)
   3132 #define FSCTL_QUERY_REFS_VOLUME_COUNTER_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 222, METHOD_NEITHER, FILE_ANY_ACCESS)
   3133 #define FSCTL_CLEAN_VOLUME_METADATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 223, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3134 #define FSCTL_SET_INTEGRITY_INFORMATION_EX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 224, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3135 #define FSCTL_VIRTUAL_STORAGE_QUERY_PROPERTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 226, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3136 #define FSCTL_FILESYSTEM_GET_STATISTICS_EX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 227, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3137 #define FSCTL_QUERY_VOLUME_CONTAINER_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 228, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3138 #define FSCTL_SET_LAYER_ROOT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 229, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3139 #define FSCTL_HCS_SYNC_NO_WRITE_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 238, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3140 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WINTHRESHOLD) */
   3141 
   3142 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_TH2)
   3143 #define FSCTL_QUERY_DIRECT_ACCESS_EXTENTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 230, METHOD_NEITHER, FILE_ANY_ACCESS)
   3144 #define FSCTL_NOTIFY_STORAGE_SPACE_ALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 231, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3145 #define FSCTL_SSDI_STORAGE_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 232, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3146 #define FSCTL_GHOST_FILE_EXTENTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 235, METHOD_BUFFERED, FILE_WRITE_ACCESS)
   3147 #define FSCTL_QUERY_GHOSTED_FILE_EXTENTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 236, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3148 #define FSCTL_UNMAP_SPACE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 237, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3149 #define FSCTL_QUERY_REFS_SMR_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 247, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3150 #define FSCTL_SET_REFS_SMR_VOLUME_GC_PARAMETERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 248, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3151 #define FSCTL_SET_REFS_FILE_STRICTLY_SEQUENTIAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 249, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3152 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WIN10_TH2) */
   3153 
   3154 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS1)
   3155 #define FSCTL_QUERY_DIRECT_IMAGE_ORIGINAL_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 233, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3156 #define FSCTL_READ_UNPRIVILEGED_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 234, METHOD_NEITHER, FILE_ANY_ACCESS)
   3157 #define FSCTL_START_VIRTUALIZATION_INSTANCE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 240, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3158 #define FSCTL_GET_FILTER_FILE_IDENTIFIER CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 241, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3159 #define FSCTL_START_VIRTUALIZATION_INSTANCE_EX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 256, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3160 #define FSCTL_SET_REPARSE_POINT_EX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 259, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3161 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS1) */
   3162 
   3163 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS2)
   3164 #define FSCTL_STREAMS_QUERY_PARAMETERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 241, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3165 #define FSCTL_STREAMS_ASSOCIATE_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 242, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3166 #define FSCTL_STREAMS_QUERY_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 243, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3167 #define FSCTL_GET_RETRIEVAL_POINTERS_AND_REFCOUNT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 244, METHOD_NEITHER, FILE_ANY_ACCESS)
   3168 #define FSCTL_QUERY_VOLUME_NUMA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 245, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3169 #define FSCTL_REFS_DEALLOCATE_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 246, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3170 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS2) */
   3171 
   3172 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS3)
   3173 #define FSCTL_DUPLICATE_EXTENTS_TO_FILE_EX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_WRITE_DATA)
   3174 #define FSCTL_QUERY_BAD_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 251, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3175 #define FSCTL_SET_DAX_ALLOC_ALIGNMENT_HINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 252, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3176 #define FSCTL_DELETE_CORRUPTED_REFS_CONTAINER CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 253, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3177 #define FSCTL_SCRUB_UNDISCOVERABLE_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 254, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3178 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS3) */
   3179 
   3180 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS4)
   3181 #define FSCTL_NOTIFY_DATA_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 255, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3182 #define FSCTL_ENCRYPTION_KEY_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 257, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3183 #define FSCTL_VIRTUAL_STORAGE_SET_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 258, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3184 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS4) */
   3185 
   3186 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS5)
   3187 #define FSCTL_REARRANGE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 264, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   3188 #define FSCTL_VIRTUAL_STORAGE_PASSTHROUGH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 265, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3189 #define FSCTL_GET_RETRIEVAL_POINTER_COUNT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 266, METHOD_NEITHER, FILE_ANY_ACCESS)
   3190 #if defined(_WIN64)
   3191 #define FSCTL_ENABLE_PER_IO_FLAGS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 267, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3192 #endif
   3193 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS5) */
   3194 
   3195 #if (NTDDI_VERSION >= NTDDI_WIN10_RS5)
   3196 #define FSCTL_QUERY_ASYNC_DUPLICATE_EXTENTS_STATUS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 268, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3197 #endif
   3198 #if (NTDDI_VERSION >= NTDDI_WIN10_MN)
   3199 #define FSCTL_SMB_SHARE_FLUSH_AND_PURGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 271, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3200 #endif
   3201 #if (NTDDI_VERSION >= NTDDI_WIN10_FE)
   3202 #define FSCTL_REFS_STREAM_SNAPSHOT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 272, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3203 #endif
   3204 #if (NTDDI_VERSION >= NTDDI_WIN10_CO)
   3205 #define FSCTL_MANAGE_BYPASS_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 274, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3206 #endif
   3207 #if (NTDDI_VERSION >= NTDDI_WIN10_FE)
   3208 #define FSCTL_REFS_DEALLOCATE_RANGES_EX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 275, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3209 #endif
   3210 #if (NTDDI_VERSION >= NTDDI_WIN10_FE)
   3211 #define FSCTL_SET_CACHED_RUNS_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 276, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3212 #endif
   3213 #if (NTDDI_VERSION >= NTDDI_WIN10_NI)
   3214 #define FSCTL_REFS_SET_VOLUME_COMPRESSION_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 277, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3215 #define FSCTL_REFS_QUERY_VOLUME_COMPRESSION_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 278, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3216 #endif
   3217 #if (NTDDI_VERSION >= NTDDI_WIN10_NI)
   3218 #define FSCTL_DUPLICATE_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 279, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3219 #define FSCTL_CREATE_LCN_WEAK_REFERENCE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 280, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3220 #define FSCTL_DELETE_LCN_WEAK_REFERENCE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 281, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3221 #define FSCTL_QUERY_LCN_WEAK_REFERENCE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 282, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3222 #define FSCTL_DELETE_LCN_WEAK_REFERENCES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 283, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3223 #endif
   3224 #if (NTDDI_VERSION >= NTDDI_WIN10_NI)
   3225 #define FSCTL_REFS_SET_VOLUME_DEDUP_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 284, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3226 #define FSCTL_REFS_QUERY_VOLUME_DEDUP_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 285, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3227 #endif
   3228 #if (NTDDI_VERSION >= NTDDI_WIN10_RS5)
   3229 #define FSCTL_LMR_QUERY_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 286, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3230 #endif
   3231 
   3232 #if (_WIN32_WINNT >= _WIN32_WINNT_WINBLUE)
   3233 typedef struct _DUPLICATE_EXTENTS_DATA {
   3234   HANDLE FileHandle;
   3235   LARGE_INTEGER SourceFileOffset;
   3236   LARGE_INTEGER TargetFileOffset;
   3237   LARGE_INTEGER ByteCount;
   3238 } DUPLICATE_EXTENTS_DATA, *PDUPLICATE_EXTENTS_DATA;
   3239 
   3240 #if ((NTDDI_VERSION >= NTDDI_WIN10_RS2) && defined(_WIN64))
   3241 typedef struct _DUPLICATE_EXTENTS_DATA32 {
   3242   UINT32 FileHandle;
   3243   LARGE_INTEGER SourceFileOffset;
   3244   LARGE_INTEGER TargetFileOffset;
   3245   LARGE_INTEGER ByteCount;
   3246 } DUPLICATE_EXTENTS_DATA32, *PDUPLICATE_EXTENTS_DATA32;
   3247 #endif /* ((NTDDI_VERSION >= NTDDI_WIN10_RS2) && defined(_WIN64)) */
   3248 
   3249 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WINBLUE) */
   3250 
   3251 #if (NTDDI_VERSION >= NTDDI_WIN10_RS3)
   3252 #define DUPLICATE_EXTENTS_DATA_EX_SOURCE_ATOMIC 0x00000001
   3253 
   3254 #if (NTDDI_VERSION >= NTDDI_WIN10_VB)
   3255 #define DUPLICATE_EXTENTS_DATA_EX_ASYNC 0x00000002
   3256 #endif /* (NTDDI_VERSION >= NTDDI_WIN10_VB) */
   3257 
   3258 typedef struct _DUPLICATE_EXTENTS_DATA_EX {
   3259   SIZE_T Size;
   3260   HANDLE FileHandle;
   3261   LARGE_INTEGER SourceFileOffset;
   3262   LARGE_INTEGER TargetFileOffset;
   3263   LARGE_INTEGER ByteCount;
   3264   DWORD Flags;
   3265 } DUPLICATE_EXTENTS_DATA_EX, *PDUPLICATE_EXTENTS_DATA_EX;
   3266 
   3267 #if ((NTDDI_VERSION >= NTDDI_WIN10_RS3) && defined(_WIN64))
   3268 typedef struct _DUPLICATE_EXTENTS_DATA_EX32 {
   3269   DWORD32 Size;
   3270   DWORD32 FileHandle;
   3271   LARGE_INTEGER SourceFileOffset;
   3272   LARGE_INTEGER TargetFileOffset;
   3273   LARGE_INTEGER ByteCount;
   3274   DWORD Flags;
   3275 } DUPLICATE_EXTENTS_DATA_EX32, *PDUPLICATE_EXTENTS_DATA_EX32;
   3276 #endif /* ((NTDDI_VERSION >= NTDDI_WIN10_RS3) && defined(_WIN64)) */
   3277 
   3278 #endif /* (NTDDI_VERSION >= NTDDI_WIN10_RS3) */
   3279 
   3280 #endif /* _FILESYSTEMFSCTL_ */
   3281 
   3282 
   3283 #define IOCTL_VOLUME_BASE ((DWORD) 'V')
   3284 
   3285 #define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3286 #define IOCTL_VOLUME_SUPPORTS_ONLINE_OFFLINE CTL_CODE(IOCTL_VOLUME_BASE,1,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3287 #define IOCTL_VOLUME_ONLINE                  CTL_CODE(IOCTL_VOLUME_BASE,2,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   3288 #define IOCTL_VOLUME_OFFLINE                 CTL_CODE(IOCTL_VOLUME_BASE,3,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
   3289 #define IOCTL_VOLUME_IS_OFFLINE              CTL_CODE(IOCTL_VOLUME_BASE,4,METHOD_BUFFERED, FILE_ANY_ACCESS)
   3290 #define IOCTL_VOLUME_IS_IO_CAPABLE           CTL_CODE(IOCTL_VOLUME_BASE,5,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3291 #define IOCTL_VOLUME_QUERY_FAILOVER_SET      CTL_CODE(IOCTL_VOLUME_BASE,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3292 #define IOCTL_VOLUME_QUERY_VOLUME_NUMBER     CTL_CODE(IOCTL_VOLUME_BASE,7,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3293 #define IOCTL_VOLUME_LOGICAL_TO_PHYSICAL     CTL_CODE(IOCTL_VOLUME_BASE,8,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3294 #define IOCTL_VOLUME_PHYSICAL_TO_LOGICAL     CTL_CODE(IOCTL_VOLUME_BASE,9,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3295 #define IOCTL_VOLUME_IS_CLUSTERED            CTL_CODE(IOCTL_VOLUME_BASE,12,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3296 #define IOCTL_VOLUME_GET_GPT_ATTRIBUTES      CTL_CODE(IOCTL_VOLUME_BASE,14,METHOD_BUFFERED,FILE_ANY_ACCESS)
   3297 
   3298 typedef struct _DISK_EXTENT {
   3299   DWORD DiskNumber;
   3300   LARGE_INTEGER StartingOffset;
   3301   LARGE_INTEGER ExtentLength;
   3302 } DISK_EXTENT,*PDISK_EXTENT;
   3303 
   3304 typedef struct _VOLUME_DISK_EXTENTS {
   3305   DWORD NumberOfDiskExtents;
   3306   DISK_EXTENT Extents[1];
   3307 } VOLUME_DISK_EXTENTS,*PVOLUME_DISK_EXTENTS;
   3308 
   3309 #if (_WIN32_WINNT >= 0x0603)
   3310 
   3311 #define WOF_CURRENT_VERSION 1
   3312 
   3313 typedef struct _WOF_EXTERNAL_INFO {
   3314   DWORD Version;
   3315   DWORD Provider;
   3316 } WOF_EXTERNAL_INFO, *PWOF_EXTERNAL_INFO;
   3317 
   3318 #endif /*(_WIN32_WINNT >= 0x0603)*/
   3319 
   3320 #if (_WIN32_WINNT >= 0x0A00)
   3321 
   3322 #define WOF_PROVIDER_FILE 2
   3323 
   3324 #define FILE_PROVIDER_CURRENT_VERSION 1
   3325 
   3326 #define FILE_PROVIDER_COMPRESSION_XPRESS4K 0
   3327 #define FILE_PROVIDER_COMPRESSION_LZX 1
   3328 #define FILE_PROVIDER_COMPRESSION_XPRESS8K 2
   3329 #define FILE_PROVIDER_COMPRESSION_XPRESS16K 3
   3330 
   3331 typedef struct _FILE_PROVIDER_EXTERNAL_INFO_V0 {
   3332   DWORD Version;
   3333   DWORD Algorithm;
   3334 } FILE_PROVIDER_EXTERNAL_INFO_V0, *PFILE_PROVIDER_EXTERNAL_INFO_V0;
   3335 
   3336 typedef struct _FILE_PROVIDER_EXTERNAL_INFO_V1 {
   3337   DWORD Version;
   3338   DWORD Algorithm;
   3339   DWORD Flags;
   3340 } FILE_PROVIDER_EXTERNAL_INFO_V1, *PFILE_PROVIDER_EXTERNAL_INFO_V1;
   3341 
   3342 #endif /*(_WIN32_WINNT >= 0x0A00)*/
   3343 
   3344 #endif /* _WINIOCTL_ */
   3345