Mercurial > games > semicongine
diff fuhtark_test/include/winapi/winioctl.h @ 1500:91c8c3b7cbf0
add: futhark tests for generating vulkan api
| author | sam <sam@basx.dev> |
|---|---|
| date | Wed, 26 Nov 2025 21:36:48 +0700 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fuhtark_test/include/winapi/winioctl.h Wed Nov 26 21:36:48 2025 +0700 @@ -0,0 +1,1605 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ +#ifdef DEFINE_GUID + +#ifndef FAR +#define FAR +#endif + +DEFINE_GUID(GUID_DEVINTERFACE_DISK,0x53f56307L,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_CDROM,0x53f56308L,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,0x53f5630aL,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_TAPE,0x53f5630bL,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,0x53f5630cL,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,0x53f5630dL,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,0x53f56310L,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,0x53f56311L,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,0x53f56312L,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,0x2accfe60L,0xc130,0x11d2,0xb0,0x82,0x00,0xa0,0xc9,0x1e,0xfb,0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_COMPORT,0x86e0d1e0L,0x8089,0x11d0,0x9c,0xe4,0x08,0x00,0x3e,0x30,0x1f,0x73); +DEFINE_GUID(GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR,0x4D36E978L,0xE325,0x11CE,0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18); + +#define DiskClassGuid GUID_DEVINTERFACE_DISK +#define CdRomClassGuid GUID_DEVINTERFACE_CDROM +#define PartitionClassGuid GUID_DEVINTERFACE_PARTITION +#define TapeClassGuid GUID_DEVINTERFACE_TAPE +#define WriteOnceDiskClassGuid GUID_DEVINTERFACE_WRITEONCEDISK +#define VolumeClassGuid GUID_DEVINTERFACE_VOLUME +#define MediumChangerClassGuid GUID_DEVINTERFACE_MEDIUMCHANGER +#define FloppyClassGuid GUID_DEVINTERFACE_FLOPPY +#define CdChangerClassGuid GUID_DEVINTERFACE_CDCHANGER +#define StoragePortClassGuid GUID_DEVINTERFACE_STORAGEPORT +#define GUID_CLASS_COMPORT GUID_DEVINTERFACE_COMPORT +#define GUID_SERENUM_BUS_ENUMERATOR GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR +#endif + +#ifndef _WINIOCTL_ +#define _WINIOCTL_ + +#ifndef _DEVIOCTL_ +#define _DEVIOCTL_ + +#define DEVICE_TYPE DWORD + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_FIPS 0x0000003A +#define FILE_DEVICE_INFINIBAND 0x0000003B + +#define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) + +#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((DWORD)(ctrlCode & 0xffff0000)) >> 16) + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 + +#define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT +#define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT + +#define FILE_ANY_ACCESS 0 +#define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) +#define FILE_READ_ACCESS (0x0001) +#define FILE_WRITE_ACCESS (0x0002) +#endif + +#ifndef _NTDDSTOR_H_ +#define _NTDDSTOR_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE + +#define IOCTL_STORAGE_CHECK_VERIFY CTL_CODE(IOCTL_STORAGE_BASE,0x0200,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE,0x0200,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE,0x0201,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE,0x0202,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_STORAGE_LOAD_MEDIA CTL_CODE(IOCTL_STORAGE_BASE,0x0203,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_STORAGE_LOAD_MEDIA2 CTL_CODE(IOCTL_STORAGE_BASE,0x0203,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_RESERVE CTL_CODE(IOCTL_STORAGE_BASE,0x0204,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_STORAGE_RELEASE CTL_CODE(IOCTL_STORAGE_BASE,0x0205,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_STORAGE_FIND_NEW_DEVICES CTL_CODE(IOCTL_STORAGE_BASE,0x0206,METHOD_BUFFERED,FILE_READ_ACCESS) + +#define IOCTL_STORAGE_EJECTION_CONTROL CTL_CODE(IOCTL_STORAGE_BASE,0x0250,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_MCN_CONTROL CTL_CODE(IOCTL_STORAGE_BASE,0x0251,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_GET_MEDIA_TYPES CTL_CODE(IOCTL_STORAGE_BASE,0x0300,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE,0x0301,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE,0x0304,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_GET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE,0x0305,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_SET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE,0x0306,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE,0x0400,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_STORAGE_BREAK_RESERVATION CTL_CODE(IOCTL_STORAGE_BASE,0x0405,METHOD_BUFFERED,FILE_READ_ACCESS) + +#define IOCTL_STORAGE_GET_DEVICE_NUMBER CTL_CODE(IOCTL_STORAGE_BASE,0x0420,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_PREDICT_FAILURE CTL_CODE(IOCTL_STORAGE_BASE,0x0440,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_STORAGE_READ_CAPACITY CTL_CODE(IOCTL_STORAGE_BASE,0x0450,METHOD_BUFFERED,FILE_READ_ACCESS) + +#define OBSOLETE_IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE,0x0400,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) + + typedef struct _STORAGE_HOTPLUG_INFO { + DWORD Size; + BOOLEAN MediaRemovable; + BOOLEAN MediaHotplug; + BOOLEAN DeviceHotplug; + BOOLEAN WriteCacheEnableOverride; + } STORAGE_HOTPLUG_INFO,*PSTORAGE_HOTPLUG_INFO; + + typedef struct _STORAGE_DEVICE_NUMBER { + DEVICE_TYPE DeviceType; + DWORD DeviceNumber; + DWORD PartitionNumber; + } STORAGE_DEVICE_NUMBER,*PSTORAGE_DEVICE_NUMBER; + + typedef struct _STORAGE_BUS_RESET_REQUEST { + BYTE PathId; + } STORAGE_BUS_RESET_REQUEST,*PSTORAGE_BUS_RESET_REQUEST; + + typedef struct STORAGE_BREAK_RESERVATION_REQUEST { + DWORD Length; + BYTE _unused; + BYTE PathId; + BYTE TargetId; + BYTE Lun; + } STORAGE_BREAK_RESERVATION_REQUEST,*PSTORAGE_BREAK_RESERVATION_REQUEST; + + typedef struct _PREVENT_MEDIA_REMOVAL { + BOOLEAN PreventMediaRemoval; + } PREVENT_MEDIA_REMOVAL,*PPREVENT_MEDIA_REMOVAL; + + typedef struct _CLASS_MEDIA_CHANGE_CONTEXT { + DWORD MediaChangeCount; + DWORD NewState; + } CLASS_MEDIA_CHANGE_CONTEXT,*PCLASS_MEDIA_CHANGE_CONTEXT; + + typedef struct _TAPE_STATISTICS { + DWORD Version; + DWORD Flags; + LARGE_INTEGER RecoveredWrites; + LARGE_INTEGER UnrecoveredWrites; + LARGE_INTEGER RecoveredReads; + LARGE_INTEGER UnrecoveredReads; + BYTE CompressionRatioReads; + BYTE CompressionRatioWrites; + } TAPE_STATISTICS,*PTAPE_STATISTICS; + +#define RECOVERED_WRITES_VALID 0x00000001 +#define UNRECOVERED_WRITES_VALID 0x00000002 +#define RECOVERED_READS_VALID 0x00000004 +#define UNRECOVERED_READS_VALID 0x00000008 +#define WRITE_COMPRESSION_INFO_VALID 0x00000010 +#define READ_COMPRESSION_INFO_VALID 0x00000020 + + typedef struct _TAPE_GET_STATISTICS { + DWORD Operation; + } TAPE_GET_STATISTICS,*PTAPE_GET_STATISTICS; + +#define TAPE_RETURN_STATISTICS 0L +#define TAPE_RETURN_ENV_INFO 1L +#define TAPE_RESET_STATISTICS 2L + + typedef enum _STORAGE_MEDIA_TYPE { + DDS_4mm = 0x20,MiniQic,Travan,QIC,MP_8mm,AME_8mm,AIT1_8mm,DLT,NCTP,IBM_3480,IBM_3490E,IBM_Magstar_3590,IBM_Magstar_MP,STK_DATA_D3,SONY_DTF, + DV_6mm,DMI,SONY_D2,CLEANER_CARTRIDGE,CD_ROM,CD_R,CD_RW,DVD_ROM,DVD_R,DVD_RW,MO_3_RW,MO_5_WO,MO_5_RW,MO_5_LIMDOW,PC_5_WO,PC_5_RW,PD_5_RW, + ABL_5_WO,PINNACLE_APEX_5_RW,SONY_12_WO,PHILIPS_12_WO,HITACHI_12_WO,CYGNET_12_WO,KODAK_14_WO,MO_NFR_525,NIKON_12_RW,IOMEGA_ZIP,IOMEGA_JAZ, + SYQUEST_EZ135,SYQUEST_EZFLYER,SYQUEST_SYJET,AVATAR_F2,MP2_8mm,DST_S,DST_M,DST_L,VXATape_1,VXATape_2,STK_9840,LTO_Ultrium,LTO_Accelis,DVD_RAM, + AIT_8mm,ADR_1,ADR_2,STK_9940,SAIT + } STORAGE_MEDIA_TYPE,*PSTORAGE_MEDIA_TYPE; + +#define MEDIA_ERASEABLE 0x00000001 +#define MEDIA_WRITE_ONCE 0x00000002 +#define MEDIA_READ_ONLY 0x00000004 +#define MEDIA_READ_WRITE 0x00000008 + +#define MEDIA_WRITE_PROTECTED 0x00000100 +#define MEDIA_CURRENTLY_MOUNTED 0x80000000 + + typedef enum _STORAGE_BUS_TYPE { + BusTypeUnknown = 0x00,BusTypeScsi,BusTypeAtapi,BusTypeAta,BusType1394,BusTypeSsa,BusTypeFibre,BusTypeUsb,BusTypeRAID,BusTypeiScsi, + BusTypeSas,BusTypeSata,BusTypeMaxReserved = 0x7F + } STORAGE_BUS_TYPE,*PSTORAGE_BUS_TYPE; + + typedef struct _DEVICE_MEDIA_INFO { + union { + struct { + LARGE_INTEGER Cylinders; + STORAGE_MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; + DWORD NumberMediaSides; + DWORD MediaCharacteristics; + } DiskInfo; + struct { + LARGE_INTEGER Cylinders; + STORAGE_MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; + DWORD NumberMediaSides; + DWORD MediaCharacteristics; + } RemovableDiskInfo; + struct { + STORAGE_MEDIA_TYPE MediaType; + DWORD MediaCharacteristics; + DWORD CurrentBlockSize; + STORAGE_BUS_TYPE BusType; + union { + struct { + BYTE MediumType; + BYTE DensityCode; + } ScsiInformation; + } BusSpecificData; + } TapeInfo; + } DeviceSpecific; + } DEVICE_MEDIA_INFO,*PDEVICE_MEDIA_INFO; + + typedef struct _GET_MEDIA_TYPES { + DWORD DeviceType; + DWORD MediaInfoCount; + DEVICE_MEDIA_INFO MediaInfo[1]; + } GET_MEDIA_TYPES,*PGET_MEDIA_TYPES; + + typedef struct _STORAGE_PREDICT_FAILURE { + DWORD PredictFailure; + BYTE VendorSpecific[512]; + } STORAGE_PREDICT_FAILURE,*PSTORAGE_PREDICT_FAILURE; + +#ifdef __cplusplus +} +#endif +#endif + +#define IOCTL_DISK_BASE FILE_DEVICE_DISK +#define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE,0x0000,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,0x0001,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,0x0002,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0003,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0004,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x0005,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE,0x0006,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE,0x0007,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE,0x0008,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE,0x0009,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE,0x000a,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE,0x000b,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,0x000c,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE,0x000d,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE,0x000e,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,0x000f,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE,0x0010,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_PERFORMANCE_OFF CTL_CODE(IOCTL_DISK_BASE,0x0018,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_CONTROLLER_NUMBER CTL_CODE(IOCTL_DISK_BASE,0x0011,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE,0x0020,METHOD_BUFFERED,FILE_READ_ACCESS) +#define SMART_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE,0x0021,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE,0x0022,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_GET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x0012,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_SET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x0013,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x0014,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x0015,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_CREATE_DISK CTL_CODE(IOCTL_DISK_BASE,0x0016,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE,0x0017,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE,0x0028,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_DISK_REASSIGN_BLOCKS_EX CTL_CODE(IOCTL_DISK_BASE,0x0029,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE,0x0032,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE,0x0034,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x0035,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x0036,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define OBSOLETE_DISK_GET_WRITE_CACHE_STATE CTL_CODE(IOCTL_DISK_BASE,0x0037,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0040,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE,0x0050,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE,0x00f3,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE,0x00f8,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x0200,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE,0x0201,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x0202,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x0203,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE,0x0204,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE,0x0205,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE,0x0206,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE,0x0300,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define PARTITION_ENTRY_UNUSED 0x00 +#define PARTITION_FAT_12 0x01 +#define PARTITION_XENIX_1 0x02 +#define PARTITION_XENIX_2 0x03 +#define PARTITION_FAT_16 0x04 +#define PARTITION_EXTENDED 0x05 +#define PARTITION_HUGE 0x06 +#define PARTITION_IFS 0x07 +#define PARTITION_OS2BOOTMGR 0x0A +#define PARTITION_FAT32 0x0B +#define PARTITION_FAT32_XINT13 0x0C +#define PARTITION_XINT13 0x0E +#define PARTITION_XINT13_EXTENDED 0x0F +#define PARTITION_PREP 0x41 +#define PARTITION_LDM 0x42 +#define PARTITION_UNIX 0x63 + +#define VALID_NTFT 0xC0 + +#define PARTITION_NTFT 0x80 + +#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)) +#define IsContainerPartition(PartitionType) ((PartitionType==PARTITION_EXTENDED) || (PartitionType==PARTITION_XINT13_EXTENDED)) +#define IsFTPartition(PartitionType) (((PartitionType)&PARTITION_NTFT) && IsRecognizedPartition(PartitionType)) + +typedef enum _MEDIA_TYPE { + 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, + 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, + F3_230Mb_512,F8_256_128,F3_200Mb_512,F3_240M_512,F3_32M_512 +} MEDIA_TYPE,*PMEDIA_TYPE; + +typedef struct _FORMAT_PARAMETERS { + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; +} FORMAT_PARAMETERS,*PFORMAT_PARAMETERS; + +typedef WORD BAD_TRACK_NUMBER; +typedef WORD *PBAD_TRACK_NUMBER; + +typedef struct _FORMAT_EX_PARAMETERS { + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; + WORD FormatGapLength; + WORD SectorsPerTrack; + WORD SectorNumber[1]; +} FORMAT_EX_PARAMETERS,*PFORMAT_EX_PARAMETERS; + +typedef struct _DISK_GEOMETRY { + LARGE_INTEGER Cylinders; + MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; +} DISK_GEOMETRY,*PDISK_GEOMETRY; + +#define WMI_DISK_GEOMETRY_GUID { 0x25007f51,0x57c2,0x11d1,{ 0xa5,0x28,0x0,0xa0,0xc9,0x6,0x29,0x10 } } + +typedef struct _PARTITION_INFORMATION { + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + DWORD HiddenSectors; + DWORD PartitionNumber; + BYTE PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + BOOLEAN RewritePartition; +} PARTITION_INFORMATION,*PPARTITION_INFORMATION; + +typedef struct _SET_PARTITION_INFORMATION { + BYTE PartitionType; +} SET_PARTITION_INFORMATION,*PSET_PARTITION_INFORMATION; + +typedef struct _DRIVE_LAYOUT_INFORMATION { + DWORD PartitionCount; + DWORD Signature; + PARTITION_INFORMATION PartitionEntry[1]; +} DRIVE_LAYOUT_INFORMATION,*PDRIVE_LAYOUT_INFORMATION; + +typedef struct _VERIFY_INFORMATION { + LARGE_INTEGER StartingOffset; + DWORD Length; +} VERIFY_INFORMATION,*PVERIFY_INFORMATION; + +typedef struct _REASSIGN_BLOCKS { + WORD Reserved; + WORD Count; + DWORD BlockNumber[1]; +} REASSIGN_BLOCKS,*PREASSIGN_BLOCKS; + +#include <pshpack1.h> +typedef struct _REASSIGN_BLOCKS_EX { + WORD Reserved; + WORD Count; + LARGE_INTEGER BlockNumber[1]; +} REASSIGN_BLOCKS_EX,*PREASSIGN_BLOCKS_EX; +#include <poppack.h> + +typedef enum _PARTITION_STYLE { + PARTITION_STYLE_MBR,PARTITION_STYLE_GPT,PARTITION_STYLE_RAW +} PARTITION_STYLE; + +typedef struct _PARTITION_INFORMATION_GPT { + GUID PartitionType; + GUID PartitionId; + DWORD64 Attributes; + WCHAR Name [36]; +} PARTITION_INFORMATION_GPT,*PPARTITION_INFORMATION_GPT; + +#define GPT_ATTRIBUTE_PLATFORM_REQUIRED (0x0000000000000001) + +#define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER (0x8000000000000000) +#define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN (0x4000000000000000) +#define GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY (0x2000000000000000) +#define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY (0x1000000000000000) + +typedef struct _PARTITION_INFORMATION_MBR { + BYTE PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + DWORD HiddenSectors; +} PARTITION_INFORMATION_MBR,*PPARTITION_INFORMATION_MBR; + +typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR; +typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT; + +typedef struct _SET_PARTITION_INFORMATION_EX { + PARTITION_STYLE PartitionStyle; + __MINGW_EXTENSION union { + SET_PARTITION_INFORMATION_MBR Mbr; + SET_PARTITION_INFORMATION_GPT Gpt; + }; +} SET_PARTITION_INFORMATION_EX,*PSET_PARTITION_INFORMATION_EX; + +typedef struct _CREATE_DISK_GPT { + GUID DiskId; + DWORD MaxPartitionCount; +} CREATE_DISK_GPT,*PCREATE_DISK_GPT; + +typedef struct _CREATE_DISK_MBR { + DWORD Signature; +} CREATE_DISK_MBR,*PCREATE_DISK_MBR; + +typedef struct _CREATE_DISK { + PARTITION_STYLE PartitionStyle; + __MINGW_EXTENSION union { + CREATE_DISK_MBR Mbr; + CREATE_DISK_GPT Gpt; + }; +} CREATE_DISK,*PCREATE_DISK; + +typedef struct _GET_LENGTH_INFORMATION { + LARGE_INTEGER Length; +} GET_LENGTH_INFORMATION,*PGET_LENGTH_INFORMATION; + +typedef struct _PARTITION_INFORMATION_EX { + PARTITION_STYLE PartitionStyle; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + DWORD PartitionNumber; + BOOLEAN RewritePartition; + __MINGW_EXTENSION union { + PARTITION_INFORMATION_MBR Mbr; + PARTITION_INFORMATION_GPT Gpt; + }; +} PARTITION_INFORMATION_EX,*PPARTITION_INFORMATION_EX; + +typedef struct _DRIVE_LAYOUT_INFORMATION_GPT { + GUID DiskId; + LARGE_INTEGER StartingUsableOffset; + LARGE_INTEGER UsableLength; + DWORD MaxPartitionCount; +} DRIVE_LAYOUT_INFORMATION_GPT,*PDRIVE_LAYOUT_INFORMATION_GPT; + +typedef struct _DRIVE_LAYOUT_INFORMATION_MBR { + DWORD Signature; +} DRIVE_LAYOUT_INFORMATION_MBR,*PDRIVE_LAYOUT_INFORMATION_MBR; + +typedef struct _DRIVE_LAYOUT_INFORMATION_EX { + DWORD PartitionStyle; + DWORD PartitionCount; + __MINGW_EXTENSION union { + DRIVE_LAYOUT_INFORMATION_MBR Mbr; + DRIVE_LAYOUT_INFORMATION_GPT Gpt; + }; + PARTITION_INFORMATION_EX PartitionEntry[1]; +} DRIVE_LAYOUT_INFORMATION_EX,*PDRIVE_LAYOUT_INFORMATION_EX; + +typedef enum _DETECTION_TYPE { + DetectNone,DetectInt13,DetectExInt13 +} DETECTION_TYPE; + +typedef struct _DISK_INT13_INFO { + WORD DriveSelect; + DWORD MaxCylinders; + WORD SectorsPerTrack; + WORD MaxHeads; + WORD NumberDrives; +} DISK_INT13_INFO,*PDISK_INT13_INFO; + +typedef struct _DISK_EX_INT13_INFO { + WORD ExBufferSize; + WORD ExFlags; + DWORD ExCylinders; + DWORD ExHeads; + DWORD ExSectorsPerTrack; + DWORD64 ExSectorsPerDrive; + WORD ExSectorSize; + WORD ExReserved; +} DISK_EX_INT13_INFO,*PDISK_EX_INT13_INFO; + +typedef struct _DISK_DETECTION_INFO { + DWORD SizeOfDetectInfo; + DETECTION_TYPE DetectionType; + __MINGW_EXTENSION union { + __MINGW_EXTENSION struct { + DISK_INT13_INFO Int13; + DISK_EX_INT13_INFO ExInt13; + }; + }; +} DISK_DETECTION_INFO,*PDISK_DETECTION_INFO; + +typedef struct _DISK_PARTITION_INFO { + DWORD SizeOfPartitionInfo; + PARTITION_STYLE PartitionStyle; + __MINGW_EXTENSION union { + struct { + DWORD Signature; + DWORD CheckSum; + } Mbr; + struct { + GUID DiskId; + } Gpt; + }; +} DISK_PARTITION_INFO,*PDISK_PARTITION_INFO; + +#define DiskGeometryGetPartition(Geometry) ((PDISK_PARTITION_INFO)((Geometry)->Data)) +#define DiskGeometryGetDetect(Geometry) ((PDISK_DETECTION_INFO)(((DWORD_PTR)DiskGeometryGetPartition(Geometry)+ DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo))) + +typedef struct _DISK_GEOMETRY_EX { + DISK_GEOMETRY Geometry; + LARGE_INTEGER DiskSize; + BYTE Data[1]; +} DISK_GEOMETRY_EX,*PDISK_GEOMETRY_EX; + +typedef struct _DISK_CONTROLLER_NUMBER { + DWORD ControllerNumber; + DWORD DiskNumber; +} DISK_CONTROLLER_NUMBER,*PDISK_CONTROLLER_NUMBER; + +typedef enum { + EqualPriority,KeepPrefetchedData,KeepReadData +} DISK_CACHE_RETENTION_PRIORITY; + +typedef struct _DISK_CACHE_INFORMATION { + BOOLEAN ParametersSavable; + BOOLEAN ReadCacheEnabled; + BOOLEAN WriteCacheEnabled; + DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; + DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; + WORD DisablePrefetchTransferLength; + BOOLEAN PrefetchScalar; + __MINGW_EXTENSION union { + struct { + WORD Minimum; + WORD Maximum; + WORD MaximumBlocks; + } ScalarPrefetch; + struct { + WORD Minimum; + WORD Maximum; + } BlockPrefetch; + }; +} DISK_CACHE_INFORMATION,*PDISK_CACHE_INFORMATION; + +typedef struct _DISK_GROW_PARTITION { + DWORD PartitionNumber; + LARGE_INTEGER BytesToGrow; +} DISK_GROW_PARTITION,*PDISK_GROW_PARTITION; + +#define HIST_NO_OF_BUCKETS 24 + +typedef struct _HISTOGRAM_BUCKET { + DWORD Reads; + DWORD Writes; +} HISTOGRAM_BUCKET,*PHISTOGRAM_BUCKET; + +#define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET) + +typedef struct _DISK_HISTOGRAM { + LARGE_INTEGER DiskSize; + LARGE_INTEGER Start; + LARGE_INTEGER End; + LARGE_INTEGER Average; + LARGE_INTEGER AverageRead; + LARGE_INTEGER AverageWrite; + DWORD Granularity; + DWORD Size; + DWORD ReadCount; + DWORD WriteCount; + PHISTOGRAM_BUCKET Histogram; +} DISK_HISTOGRAM,*PDISK_HISTOGRAM; + +#define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM) + +typedef struct _DISK_PERFORMANCE { + LARGE_INTEGER BytesRead; + LARGE_INTEGER BytesWritten; + LARGE_INTEGER ReadTime; + LARGE_INTEGER WriteTime; + LARGE_INTEGER IdleTime; + DWORD ReadCount; + DWORD WriteCount; + DWORD QueueDepth; + DWORD SplitCount; + LARGE_INTEGER QueryTime; + DWORD StorageDeviceNumber; + WCHAR StorageManagerName[8]; +} DISK_PERFORMANCE,*PDISK_PERFORMANCE; + +typedef struct _DISK_RECORD { + LARGE_INTEGER ByteOffset; + LARGE_INTEGER StartTime; + LARGE_INTEGER EndTime; + PVOID VirtualAddress; + DWORD NumberOfBytes; + BYTE DeviceNumber; + BOOLEAN ReadRequest; +} DISK_RECORD,*PDISK_RECORD; + +typedef struct _DISK_LOGGING { + BYTE Function; + PVOID BufferAddress; + DWORD BufferSize; +} DISK_LOGGING,*PDISK_LOGGING; + +#define DISK_LOGGING_START 0 +#define DISK_LOGGING_STOP 1 +#define DISK_LOGGING_DUMP 2 +#define DISK_BINNING 3 + +typedef enum _BIN_TYPES { + RequestSize,RequestLocation +} BIN_TYPES; + +typedef struct _BIN_RANGE { + LARGE_INTEGER StartValue; + LARGE_INTEGER Length; +} BIN_RANGE,*PBIN_RANGE; + +typedef struct _PERF_BIN { + DWORD NumberOfBins; + DWORD TypeOfBin; + BIN_RANGE BinsRanges[1]; +} PERF_BIN,*PPERF_BIN; + +typedef struct _BIN_COUNT { + BIN_RANGE BinRange; + DWORD BinCount; +} BIN_COUNT,*PBIN_COUNT; + +typedef struct _BIN_RESULTS { + DWORD NumberOfBins; + BIN_COUNT BinCounts[1]; +} BIN_RESULTS,*PBIN_RESULTS; + +#include <pshpack1.h> +typedef struct _GETVERSIONINPARAMS { + BYTE bVersion; + BYTE bRevision; + BYTE bReserved; + BYTE bIDEDeviceMap; + DWORD fCapabilities; + DWORD dwReserved[4]; +} GETVERSIONINPARAMS,*PGETVERSIONINPARAMS,*LPGETVERSIONINPARAMS; +#include <poppack.h> + +#define CAP_ATA_ID_CMD 1 +#define CAP_ATAPI_ID_CMD 2 +#define CAP_SMART_CMD 4 + +#include <pshpack1.h> +typedef struct _IDEREGS { + BYTE bFeaturesReg; + BYTE bSectorCountReg; + BYTE bSectorNumberReg; + BYTE bCylLowReg; + BYTE bCylHighReg; + BYTE bDriveHeadReg; + BYTE bCommandReg; + BYTE bReserved; +} IDEREGS,*PIDEREGS,*LPIDEREGS; +#include <poppack.h> + +#define ATAPI_ID_CMD 0xA1 +#define ID_CMD 0xEC +#define SMART_CMD 0xB0 + +#define SMART_CYL_LOW 0x4F +#define SMART_CYL_HI 0xC2 + +#include <pshpack1.h> +typedef struct _SENDCMDINPARAMS { + DWORD cBufferSize; + IDEREGS irDriveRegs; + BYTE bDriveNumber; + BYTE bReserved[3]; + DWORD dwReserved[4]; + BYTE bBuffer[1]; +} SENDCMDINPARAMS,*PSENDCMDINPARAMS,*LPSENDCMDINPARAMS; +#include <poppack.h> + +#include <pshpack1.h> +typedef struct _DRIVERSTATUS { + BYTE bDriverError; + BYTE bIDEError; + BYTE bReserved[2]; + DWORD dwReserved[2]; +} DRIVERSTATUS,*PDRIVERSTATUS,*LPDRIVERSTATUS; +#include <poppack.h> + +#define SMART_NO_ERROR 0 +#define SMART_IDE_ERROR 1 +#define SMART_INVALID_FLAG 2 +#define SMART_INVALID_COMMAND 3 +#define SMART_INVALID_BUFFER 4 +#define SMART_INVALID_DRIVE 5 +#define SMART_INVALID_IOCTL 6 +#define SMART_ERROR_NO_MEM 7 +#define SMART_INVALID_REGISTER 8 +#define SMART_NOT_SUPPORTED 9 +#define SMART_NO_IDE_DEVICE 10 + +#define SMART_OFFLINE_ROUTINE_OFFLINE 0 +#define SMART_SHORT_SELFTEST_OFFLINE 1 +#define SMART_EXTENDED_SELFTEST_OFFLINE 2 +#define SMART_ABORT_OFFLINE_SELFTEST 127 +#define SMART_SHORT_SELFTEST_CAPTIVE 129 +#define SMART_EXTENDED_SELFTEST_CAPTIVE 130 + +#include <pshpack1.h> +typedef struct _SENDCMDOUTPARAMS { + DWORD cBufferSize; + DRIVERSTATUS DriverStatus; + BYTE bBuffer[1]; +} SENDCMDOUTPARAMS,*PSENDCMDOUTPARAMS,*LPSENDCMDOUTPARAMS; +#include <poppack.h> + +#define READ_ATTRIBUTE_BUFFER_SIZE 512 +#define IDENTIFY_BUFFER_SIZE 512 +#define READ_THRESHOLD_BUFFER_SIZE 512 +#define SMART_LOG_SECTOR_SIZE 512 + +#define READ_ATTRIBUTES 0xD0 +#define READ_THRESHOLDS 0xD1 +#define ENABLE_DISABLE_AUTOSAVE 0xD2 +#define SAVE_ATTRIBUTE_VALUES 0xD3 +#define EXECUTE_OFFLINE_DIAGS 0xD4 +#define SMART_READ_LOG 0xD5 +#define SMART_WRITE_LOG 0xd6 +#define ENABLE_SMART 0xD8 +#define DISABLE_SMART 0xD9 +#define RETURN_SMART_STATUS 0xDA +#define ENABLE_DISABLE_AUTO_OFFLINE 0xDB + +#define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER +#define IOCTL_CHANGER_GET_PARAMETERS CTL_CODE(IOCTL_CHANGER_BASE,0x0000,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_CHANGER_GET_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0001,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_CHANGER_GET_PRODUCT_DATA CTL_CODE(IOCTL_CHANGER_BASE,0x0002,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_CHANGER_SET_ACCESS CTL_CODE(IOCTL_CHANGER_BASE,0x0004,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_CHANGER_GET_ELEMENT_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0005,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0006,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_CHANGER_SET_POSITION CTL_CODE(IOCTL_CHANGER_BASE,0x0007,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_CHANGER_EXCHANGE_MEDIUM CTL_CODE(IOCTL_CHANGER_BASE,0x0008,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_CHANGER_MOVE_MEDIUM CTL_CODE(IOCTL_CHANGER_BASE,0x0009,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_CHANGER_REINITIALIZE_TRANSPORT CTL_CODE(IOCTL_CHANGER_BASE,0x000A,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_CHANGER_QUERY_VOLUME_TAGS CTL_CODE(IOCTL_CHANGER_BASE,0x000B,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define MAX_VOLUME_ID_SIZE 36 +#define MAX_VOLUME_TEMPLATE_SIZE 40 + +#define VENDOR_ID_LENGTH 8 +#define PRODUCT_ID_LENGTH 16 +#define REVISION_LENGTH 4 +#define SERIAL_NUMBER_LENGTH 32 + +typedef enum _ELEMENT_TYPE { + AllElements,ChangerTransport,ChangerSlot,ChangerIEPort,ChangerDrive,ChangerDoor,ChangerKeypad,ChangerMaxElement +} ELEMENT_TYPE,*PELEMENT_TYPE; + +typedef struct _CHANGER_ELEMENT { + ELEMENT_TYPE ElementType; + DWORD ElementAddress; +} CHANGER_ELEMENT,*PCHANGER_ELEMENT; + +typedef struct _CHANGER_ELEMENT_LIST { + CHANGER_ELEMENT Element; + DWORD NumberOfElements; +} CHANGER_ELEMENT_LIST ,*PCHANGER_ELEMENT_LIST; + +#define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001 +#define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002 +#define CHANGER_CLOSE_IEPORT 0x00000004 +#define CHANGER_OPEN_IEPORT 0x00000008 + +#define CHANGER_STATUS_NON_VOLATILE 0x00000010 +#define CHANGER_EXCHANGE_MEDIA 0x00000020 +#define CHANGER_CLEANER_SLOT 0x00000040 +#define CHANGER_LOCK_UNLOCK 0x00000080 + +#define CHANGER_CARTRIDGE_MAGAZINE 0x00000100 +#define CHANGER_MEDIUM_FLIP 0x00000200 +#define CHANGER_POSITION_TO_ELEMENT 0x00000400 +#define CHANGER_REPORT_IEPORT_STATE 0x00000800 + +#define CHANGER_STORAGE_DRIVE 0x00001000 +#define CHANGER_STORAGE_IEPORT 0x00002000 +#define CHANGER_STORAGE_SLOT 0x00004000 +#define CHANGER_STORAGE_TRANSPORT 0x00008000 + +#define CHANGER_DRIVE_CLEANING_REQUIRED 0x00010000 + +#define CHANGER_PREDISMOUNT_EJECT_REQUIRED 0x00020000 + +#define CHANGER_CLEANER_ACCESS_NOT_VALID 0x00040000 +#define CHANGER_PREMOUNT_EJECT_REQUIRED 0x00080000 + +#define CHANGER_VOLUME_IDENTIFICATION 0x00100000 +#define CHANGER_VOLUME_SEARCH 0x00200000 +#define CHANGER_VOLUME_ASSERT 0x00400000 +#define CHANGER_VOLUME_REPLACE 0x00800000 +#define CHANGER_VOLUME_UNDEFINE 0x01000000 + +#define CHANGER_SERIAL_NUMBER_VALID 0x04000000 + +#define CHANGER_DEVICE_REINITIALIZE_CAPABLE 0x08000000 +#define CHANGER_KEYPAD_ENABLE_DISABLE 0x10000000 +#define CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS 0x20000000 + +#define CHANGER_RESERVED_BIT 0x80000000 + +#define CHANGER_PREDISMOUNT_ALIGN_TO_SLOT 0x80000001 +#define CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE 0x80000002 +#define CHANGER_CLEANER_AUTODISMOUNT 0x80000004 +#define CHANGER_TRUE_EXCHANGE_CAPABLE 0x80000008 +#define CHANGER_SLOTS_USE_TRAYS 0x80000010 +#define CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR 0x80000020 +#define CHANGER_CLEANER_OPS_NOT_SUPPORTED 0x80000040 +#define CHANGER_IEPORT_USER_CONTROL_OPEN 0x80000080 +#define CHANGER_IEPORT_USER_CONTROL_CLOSE 0x80000100 +#define CHANGER_MOVE_EXTENDS_IEPORT 0x80000200 +#define CHANGER_MOVE_RETRACTS_IEPORT 0x80000400 + +#define CHANGER_TO_TRANSPORT 0x01 +#define CHANGER_TO_SLOT 0x02 +#define CHANGER_TO_IEPORT 0x04 +#define CHANGER_TO_DRIVE 0x08 + +#define LOCK_UNLOCK_IEPORT 0x01 +#define LOCK_UNLOCK_DOOR 0x02 +#define LOCK_UNLOCK_KEYPAD 0x04 + +typedef struct _GET_CHANGER_PARAMETERS { + DWORD Size; + WORD NumberTransportElements; + WORD NumberStorageElements; + WORD NumberCleanerSlots; + WORD NumberIEElements; + WORD NumberDataTransferElements; + WORD NumberOfDoors; + WORD FirstSlotNumber; + WORD FirstDriveNumber; + WORD FirstTransportNumber; + WORD FirstIEPortNumber; + WORD FirstCleanerSlotAddress; + WORD MagazineSize; + DWORD DriveCleanTimeout; + DWORD Features0; + DWORD Features1; + BYTE MoveFromTransport; + BYTE MoveFromSlot; + BYTE MoveFromIePort; + BYTE MoveFromDrive; + BYTE ExchangeFromTransport; + BYTE ExchangeFromSlot; + BYTE ExchangeFromIePort; + BYTE ExchangeFromDrive; + BYTE LockUnlockCapabilities; + BYTE PositionCapabilities; + BYTE Reserved1[2]; + DWORD Reserved2[2]; +} GET_CHANGER_PARAMETERS,*PGET_CHANGER_PARAMETERS; + +typedef struct _CHANGER_PRODUCT_DATA { + BYTE VendorId[VENDOR_ID_LENGTH]; + BYTE ProductId[PRODUCT_ID_LENGTH]; + BYTE Revision[REVISION_LENGTH]; + BYTE SerialNumber[SERIAL_NUMBER_LENGTH]; + BYTE DeviceType; +} CHANGER_PRODUCT_DATA,*PCHANGER_PRODUCT_DATA; + +#define LOCK_ELEMENT 0 +#define UNLOCK_ELEMENT 1 +#define EXTEND_IEPORT 2 +#define RETRACT_IEPORT 3 + +typedef struct _CHANGER_SET_ACCESS { + CHANGER_ELEMENT Element; + DWORD Control; +} CHANGER_SET_ACCESS,*PCHANGER_SET_ACCESS; + +typedef struct _CHANGER_READ_ELEMENT_STATUS { + CHANGER_ELEMENT_LIST ElementList; + BOOLEAN VolumeTagInfo; +} CHANGER_READ_ELEMENT_STATUS,*PCHANGER_READ_ELEMENT_STATUS; + +typedef struct _CHANGER_ELEMENT_STATUS { + CHANGER_ELEMENT Element; + CHANGER_ELEMENT SrcElementAddress; + DWORD Flags; + DWORD ExceptionCode; + BYTE TargetId; + BYTE Lun; + WORD Reserved; + BYTE PrimaryVolumeID[MAX_VOLUME_ID_SIZE]; + BYTE AlternateVolumeID[MAX_VOLUME_ID_SIZE]; +} CHANGER_ELEMENT_STATUS,*PCHANGER_ELEMENT_STATUS; + +typedef struct _CHANGER_ELEMENT_STATUS_EX { + CHANGER_ELEMENT Element; + CHANGER_ELEMENT SrcElementAddress; + DWORD Flags; + DWORD ExceptionCode; + BYTE TargetId; + BYTE Lun; + WORD Reserved; + BYTE PrimaryVolumeID[MAX_VOLUME_ID_SIZE]; + BYTE AlternateVolumeID[MAX_VOLUME_ID_SIZE]; + BYTE VendorIdentification[VENDOR_ID_LENGTH]; + BYTE ProductIdentification[PRODUCT_ID_LENGTH]; + BYTE SerialNumber[SERIAL_NUMBER_LENGTH]; +} CHANGER_ELEMENT_STATUS_EX,*PCHANGER_ELEMENT_STATUS_EX; + +#define ELEMENT_STATUS_FULL 0x00000001 +#define ELEMENT_STATUS_IMPEXP 0x00000002 +#define ELEMENT_STATUS_EXCEPT 0x00000004 +#define ELEMENT_STATUS_ACCESS 0x00000008 +#define ELEMENT_STATUS_EXENAB 0x00000010 +#define ELEMENT_STATUS_INENAB 0x00000020 + +#define ELEMENT_STATUS_PRODUCT_DATA 0x00000040 + +#define ELEMENT_STATUS_LUN_VALID 0x00001000 +#define ELEMENT_STATUS_ID_VALID 0x00002000 +#define ELEMENT_STATUS_NOT_BUS 0x00008000 +#define ELEMENT_STATUS_INVERT 0x00400000 +#define ELEMENT_STATUS_SVALID 0x00800000 + +#define ELEMENT_STATUS_PVOLTAG 0x10000000 +#define ELEMENT_STATUS_AVOLTAG 0x20000000 + +#define ERROR_LABEL_UNREADABLE 0x00000001 +#define ERROR_LABEL_QUESTIONABLE 0x00000002 +#define ERROR_SLOT_NOT_PRESENT 0x00000004 +#define ERROR_DRIVE_NOT_INSTALLED 0x00000008 +#define ERROR_TRAY_MALFUNCTION 0x00000010 +#define ERROR_INIT_STATUS_NEEDED 0x00000011 +#define ERROR_UNHANDLED_ERROR 0xFFFFFFFF + +typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS { + CHANGER_ELEMENT_LIST ElementList; + BOOLEAN BarCodeScan; +} CHANGER_INITIALIZE_ELEMENT_STATUS,*PCHANGER_INITIALIZE_ELEMENT_STATUS; + +typedef struct _CHANGER_SET_POSITION { + CHANGER_ELEMENT Transport; + CHANGER_ELEMENT Destination; + BOOLEAN Flip; +} CHANGER_SET_POSITION,*PCHANGER_SET_POSITION; + +typedef struct _CHANGER_EXCHANGE_MEDIUM { + CHANGER_ELEMENT Transport; + CHANGER_ELEMENT Source; + CHANGER_ELEMENT Destination1; + CHANGER_ELEMENT Destination2; + BOOLEAN Flip1; + BOOLEAN Flip2; +} CHANGER_EXCHANGE_MEDIUM,*PCHANGER_EXCHANGE_MEDIUM; + +typedef struct _CHANGER_MOVE_MEDIUM { + CHANGER_ELEMENT Transport; + CHANGER_ELEMENT Source; + CHANGER_ELEMENT Destination; + BOOLEAN Flip; +} CHANGER_MOVE_MEDIUM,*PCHANGER_MOVE_MEDIUM; + +typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION { + CHANGER_ELEMENT StartingElement; + DWORD ActionCode; + BYTE VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE]; +} CHANGER_SEND_VOLUME_TAG_INFORMATION,*PCHANGER_SEND_VOLUME_TAG_INFORMATION; + +typedef struct _READ_ELEMENT_ADDRESS_INFO { + DWORD NumberOfElements; + CHANGER_ELEMENT_STATUS ElementStatus[1]; +} READ_ELEMENT_ADDRESS_INFO,*PREAD_ELEMENT_ADDRESS_INFO; + +#define SEARCH_ALL 0x0 +#define SEARCH_PRIMARY 0x1 +#define SEARCH_ALTERNATE 0x2 +#define SEARCH_ALL_NO_SEQ 0x4 +#define SEARCH_PRI_NO_SEQ 0x5 +#define SEARCH_ALT_NO_SEQ 0x6 + +#define ASSERT_PRIMARY 0x8 +#define ASSERT_ALTERNATE 0x9 + +#define REPLACE_PRIMARY 0xA +#define REPLACE_ALTERNATE 0xB + +#define UNDEFINE_PRIMARY 0xC +#define UNDEFINE_ALTERNATE 0xD + +typedef enum _CHANGER_DEVICE_PROBLEM_TYPE { + DeviceProblemNone,DeviceProblemHardware,DeviceProblemCHMError,DeviceProblemDoorOpen,DeviceProblemCalibrationError,DeviceProblemTargetFailure, + DeviceProblemCHMMoveError,DeviceProblemCHMZeroError,DeviceProblemCartridgeInsertError,DeviceProblemPositionError,DeviceProblemSensorError, + DeviceProblemCartridgeEjectError,DeviceProblemGripperError,DeviceProblemDriveError +} CHANGER_DEVICE_PROBLEM_TYPE,*PCHANGER_DEVICE_PROBLEM_TYPE; + +#define IOCTL_SERIAL_LSRMST_INSERT CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_SERENUM_EXPOSE_HARDWARE CTL_CODE(FILE_DEVICE_SERENUM,128,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_SERENUM_REMOVE_HARDWARE CTL_CODE(FILE_DEVICE_SERENUM,129,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_SERENUM_PORT_DESC CTL_CODE(FILE_DEVICE_SERENUM,130,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_SERENUM_GET_PORT_NAME CTL_CODE(FILE_DEVICE_SERENUM,131,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define SERIAL_LSRMST_ESCAPE ((BYTE)0x00) + +#define SERIAL_LSRMST_LSR_DATA ((BYTE)0x01) + +#define SERIAL_LSRMST_LSR_NODATA ((BYTE)0x02) + +#define SERIAL_LSRMST_MST ((BYTE)0x03) + +#define SERIAL_IOC_FCR_FIFO_ENABLE ((DWORD)0x00000001) +#define SERIAL_IOC_FCR_RCVR_RESET ((DWORD)0x00000002) +#define SERIAL_IOC_FCR_XMIT_RESET ((DWORD)0x00000004) +#define SERIAL_IOC_FCR_DMA_MODE ((DWORD)0x00000008) +#define SERIAL_IOC_FCR_RES1 ((DWORD)0x00000010) +#define SERIAL_IOC_FCR_RES2 ((DWORD)0x00000020) +#define SERIAL_IOC_FCR_RCVR_TRIGGER_LSB ((DWORD)0x00000040) +#define SERIAL_IOC_FCR_RCVR_TRIGGER_MSB ((DWORD)0x00000080) + +#define SERIAL_IOC_MCR_DTR ((DWORD)0x00000001) +#define SERIAL_IOC_MCR_RTS ((DWORD)0x00000002) +#define SERIAL_IOC_MCR_OUT1 ((DWORD)0x00000004) +#define SERIAL_IOC_MCR_OUT2 ((DWORD)0x00000008) +#define SERIAL_IOC_MCR_LOOP ((DWORD)0x00000010) + +#ifndef _FILESYSTEMFSCTL_ +#define _FILESYSTEMFSCTL_ + +#define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,0,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,1,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,2,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,3,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,4,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,5,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,6,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,7,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,8,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,10,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,11,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,12,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,14,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,15,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,16,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) + +#define FSCTL_MARK_AS_SYSTEM_HIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,19,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,20,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,21,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM,22,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,23,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,24,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,25,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM,26,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM,27,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,28,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,29,METHOD_BUFFERED,FILE_SPECIAL_ACCESS) +#define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,30,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,32,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,35,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,38,METHOD_BUFFERED,FILE_SPECIAL_ACCESS) +#define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,39,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,40,METHOD_BUFFERED,FILE_SPECIAL_ACCESS) +#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,41,METHOD_BUFFERED,FILE_SPECIAL_ACCESS) +#define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,42,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,43,METHOD_BUFFERED,FILE_SPECIAL_ACCESS) +#define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,44,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,45,METHOD_NEITHER,FILE_READ_DATA) +#define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,46,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,47,METHOD_BUFFERED,FILE_SPECIAL_ACCESS) +#define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,48,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,49,METHOD_BUFFERED,FILE_SPECIAL_ACCESS) +#define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,50,METHOD_BUFFERED,FILE_WRITE_DATA) +#define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,51,METHOD_NEITHER,FILE_READ_DATA) +#define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,53,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,54,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,55,METHOD_NEITHER,FILE_SPECIAL_ACCESS) +#define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,56,METHOD_NEITHER,FILE_SPECIAL_ACCESS) +#define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,57,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,58,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM,59,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,61,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,62,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,63,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,64,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,65,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_HSM_MSG CTL_CODE(FILE_DEVICE_FILE_SYSTEM,66,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_HSM_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,68,METHOD_NEITHER,FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,69,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM,71,METHOD_OUT_DIRECT,FILE_READ_DATA) +#define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM,72,METHOD_BUFFERED,FILE_SPECIAL_ACCESS) + +typedef struct _PATHNAME_BUFFER { + DWORD PathNameLength; + WCHAR Name[1]; +} PATHNAME_BUFFER,*PPATHNAME_BUFFER; + +typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER { + BYTE First0x24BytesOfBootSector[0x24]; +} FSCTL_QUERY_FAT_BPB_BUFFER,*PFSCTL_QUERY_FAT_BPB_BUFFER; + +typedef struct { + LARGE_INTEGER VolumeSerialNumber; + LARGE_INTEGER NumberSectors; + LARGE_INTEGER TotalClusters; + LARGE_INTEGER FreeClusters; + LARGE_INTEGER TotalReserved; + DWORD BytesPerSector; + DWORD BytesPerCluster; + DWORD BytesPerFileRecordSegment; + DWORD ClustersPerFileRecordSegment; + LARGE_INTEGER MftValidDataLength; + LARGE_INTEGER MftStartLcn; + LARGE_INTEGER Mft2StartLcn; + LARGE_INTEGER MftZoneStart; + LARGE_INTEGER MftZoneEnd; +} NTFS_VOLUME_DATA_BUFFER,*PNTFS_VOLUME_DATA_BUFFER; + +typedef struct { + DWORD ByteCount; + WORD MajorVersion; + WORD MinorVersion; +} NTFS_EXTENDED_VOLUME_DATA,*PNTFS_EXTENDED_VOLUME_DATA; + +typedef struct { + LARGE_INTEGER StartingLcn; +} STARTING_LCN_INPUT_BUFFER,*PSTARTING_LCN_INPUT_BUFFER; + +typedef struct { + LARGE_INTEGER StartingLcn; + LARGE_INTEGER BitmapSize; + BYTE Buffer[1]; +} VOLUME_BITMAP_BUFFER,*PVOLUME_BITMAP_BUFFER; + +typedef struct { + LARGE_INTEGER StartingVcn; +} STARTING_VCN_INPUT_BUFFER,*PSTARTING_VCN_INPUT_BUFFER; + +typedef struct RETRIEVAL_POINTERS_BUFFER { + DWORD ExtentCount; + LARGE_INTEGER StartingVcn; + struct { + LARGE_INTEGER NextVcn; + LARGE_INTEGER Lcn; + } Extents[1]; +} RETRIEVAL_POINTERS_BUFFER,*PRETRIEVAL_POINTERS_BUFFER; + +typedef struct { + LARGE_INTEGER FileReferenceNumber; +} NTFS_FILE_RECORD_INPUT_BUFFER,*PNTFS_FILE_RECORD_INPUT_BUFFER; + +typedef struct { + LARGE_INTEGER FileReferenceNumber; + DWORD FileRecordLength; + BYTE FileRecordBuffer[1]; +} NTFS_FILE_RECORD_OUTPUT_BUFFER,*PNTFS_FILE_RECORD_OUTPUT_BUFFER; + +typedef struct { + HANDLE FileHandle; + LARGE_INTEGER StartingVcn; + LARGE_INTEGER StartingLcn; + DWORD ClusterCount; +} MOVE_FILE_DATA,*PMOVE_FILE_DATA; + +#ifdef _WIN64 +typedef struct _MOVE_FILE_DATA32 { + UINT32 FileHandle; + LARGE_INTEGER StartingVcn; + LARGE_INTEGER StartingLcn; + DWORD ClusterCount; +} MOVE_FILE_DATA32,*PMOVE_FILE_DATA32; +#endif + +typedef struct { + DWORD Restart; + SID Sid; +} FIND_BY_SID_DATA,*PFIND_BY_SID_DATA; + +typedef struct { + DWORD NextEntryOffset; + DWORD FileIndex; + DWORD FileNameLength; + WCHAR FileName[1]; +} FIND_BY_SID_OUTPUT,*PFIND_BY_SID_OUTPUT; + +typedef struct { + DWORDLONG StartFileReferenceNumber; + USN LowUsn; + USN HighUsn; +} MFT_ENUM_DATA,*PMFT_ENUM_DATA; + +typedef struct { + DWORDLONG MaximumSize; + DWORDLONG AllocationDelta; +} CREATE_USN_JOURNAL_DATA,*PCREATE_USN_JOURNAL_DATA; + +typedef struct { + USN StartUsn; + DWORD ReasonMask; + DWORD ReturnOnlyOnClose; + DWORDLONG Timeout; + DWORDLONG BytesToWaitFor; + DWORDLONG UsnJournalID; +} READ_USN_JOURNAL_DATA,*PREAD_USN_JOURNAL_DATA; + +typedef struct { + DWORD RecordLength; + WORD MajorVersion; + WORD MinorVersion; + DWORDLONG FileReferenceNumber; + DWORDLONG ParentFileReferenceNumber; + USN Usn; + LARGE_INTEGER TimeStamp; + DWORD Reason; + DWORD SourceInfo; + DWORD SecurityId; + DWORD FileAttributes; + WORD FileNameLength; + WORD FileNameOffset; + WCHAR FileName[1]; +} USN_RECORD,*PUSN_RECORD; + +#define USN_PAGE_SIZE (0x1000) + +#define USN_REASON_DATA_OVERWRITE (0x00000001) +#define USN_REASON_DATA_EXTEND (0x00000002) +#define USN_REASON_DATA_TRUNCATION (0x00000004) +#define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010) +#define USN_REASON_NAMED_DATA_EXTEND (0x00000020) +#define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040) +#define USN_REASON_FILE_CREATE (0x00000100) +#define USN_REASON_FILE_DELETE (0x00000200) +#define USN_REASON_EA_CHANGE (0x00000400) +#define USN_REASON_SECURITY_CHANGE (0x00000800) +#define USN_REASON_RENAME_OLD_NAME (0x00001000) +#define USN_REASON_RENAME_NEW_NAME (0x00002000) +#define USN_REASON_INDEXABLE_CHANGE (0x00004000) +#define USN_REASON_BASIC_INFO_CHANGE (0x00008000) +#define USN_REASON_HARD_LINK_CHANGE (0x00010000) +#define USN_REASON_COMPRESSION_CHANGE (0x00020000) +#define USN_REASON_ENCRYPTION_CHANGE (0x00040000) +#define USN_REASON_OBJECT_ID_CHANGE (0x00080000) +#define USN_REASON_REPARSE_POINT_CHANGE (0x00100000) +#define USN_REASON_STREAM_CHANGE (0x00200000) + +#define USN_REASON_CLOSE (0x80000000) + +typedef struct { + DWORDLONG UsnJournalID; + USN FirstUsn; + USN NextUsn; + USN LowestValidUsn; + USN MaxUsn; + DWORDLONG MaximumSize; + DWORDLONG AllocationDelta; +} USN_JOURNAL_DATA,*PUSN_JOURNAL_DATA; + +typedef struct { + DWORDLONG UsnJournalID; + DWORD DeleteFlags; +} DELETE_USN_JOURNAL_DATA,*PDELETE_USN_JOURNAL_DATA; + +#define USN_DELETE_FLAG_DELETE (0x00000001) +#define USN_DELETE_FLAG_NOTIFY (0x00000002) + +#define USN_DELETE_VALID_FLAGS (0x00000003) + +typedef struct { + DWORD UsnSourceInfo; + HANDLE VolumeHandle; + DWORD HandleInfo; +} MARK_HANDLE_INFO,*PMARK_HANDLE_INFO; + +#ifdef _WIN64 + +typedef struct { + DWORD UsnSourceInfo; + UINT32 VolumeHandle; + DWORD HandleInfo; + +} MARK_HANDLE_INFO32,*PMARK_HANDLE_INFO32; +#endif + +#define USN_SOURCE_DATA_MANAGEMENT (0x00000001) +#define USN_SOURCE_AUXILIARY_DATA (0x00000002) +#define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004) + +#define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001) +#define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004) +#define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008) + +typedef struct { + ACCESS_MASK DesiredAccess; + DWORD SecurityIds[1]; +} BULK_SECURITY_TEST_DATA,*PBULK_SECURITY_TEST_DATA; + +#define VOLUME_IS_DIRTY (0x00000001) +#define VOLUME_UPGRADE_SCHEDULED (0x00000002) + +typedef struct _FILE_PREFETCH { + DWORD Type; + DWORD Count; + DWORDLONG Prefetch[1]; +} FILE_PREFETCH,*PFILE_PREFETCH; + +#define FILE_PREFETCH_TYPE_FOR_CREATE 0x1 + +typedef struct _FILESYSTEM_STATISTICS { + WORD FileSystemType; + WORD Version; + DWORD SizeOfCompleteStructure; + DWORD UserFileReads; + DWORD UserFileReadBytes; + DWORD UserDiskReads; + DWORD UserFileWrites; + DWORD UserFileWriteBytes; + DWORD UserDiskWrites; + DWORD MetaDataReads; + DWORD MetaDataReadBytes; + DWORD MetaDataDiskReads; + DWORD MetaDataWrites; + DWORD MetaDataWriteBytes; + DWORD MetaDataDiskWrites; +} FILESYSTEM_STATISTICS,*PFILESYSTEM_STATISTICS; + +#define FILESYSTEM_STATISTICS_TYPE_NTFS 1 +#define FILESYSTEM_STATISTICS_TYPE_FAT 2 + +typedef struct _FAT_STATISTICS { + DWORD CreateHits; + DWORD SuccessfulCreates; + DWORD FailedCreates; + DWORD NonCachedReads; + DWORD NonCachedReadBytes; + DWORD NonCachedWrites; + DWORD NonCachedWriteBytes; + DWORD NonCachedDiskReads; + DWORD NonCachedDiskWrites; +} FAT_STATISTICS,*PFAT_STATISTICS; + +typedef struct _NTFS_STATISTICS { + DWORD LogFileFullExceptions; + DWORD OtherExceptions; + DWORD MftReads; + DWORD MftReadBytes; + DWORD MftWrites; + DWORD MftWriteBytes; + struct { + WORD Write; + WORD Create; + WORD SetInfo; + WORD Flush; + } MftWritesUserLevel; + WORD MftWritesFlushForLogFileFull; + WORD MftWritesLazyWriter; + WORD MftWritesUserRequest; + DWORD Mft2Writes; + DWORD Mft2WriteBytes; + struct { + WORD Write; + WORD Create; + WORD SetInfo; + WORD Flush; + } Mft2WritesUserLevel; + WORD Mft2WritesFlushForLogFileFull; + WORD Mft2WritesLazyWriter; + WORD Mft2WritesUserRequest; + DWORD RootIndexReads; + DWORD RootIndexReadBytes; + DWORD RootIndexWrites; + DWORD RootIndexWriteBytes; + DWORD BitmapReads; + DWORD BitmapReadBytes; + DWORD BitmapWrites; + DWORD BitmapWriteBytes; + WORD BitmapWritesFlushForLogFileFull; + WORD BitmapWritesLazyWriter; + WORD BitmapWritesUserRequest; + struct { + WORD Write; + WORD Create; + WORD SetInfo; + } BitmapWritesUserLevel; + DWORD MftBitmapReads; + DWORD MftBitmapReadBytes; + DWORD MftBitmapWrites; + DWORD MftBitmapWriteBytes; + WORD MftBitmapWritesFlushForLogFileFull; + WORD MftBitmapWritesLazyWriter; + WORD MftBitmapWritesUserRequest; + struct { + WORD Write; + WORD Create; + WORD SetInfo; + WORD Flush; + } MftBitmapWritesUserLevel; + DWORD UserIndexReads; + DWORD UserIndexReadBytes; + DWORD UserIndexWrites; + DWORD UserIndexWriteBytes; + DWORD LogFileReads; + DWORD LogFileReadBytes; + DWORD LogFileWrites; + DWORD LogFileWriteBytes; + struct { + DWORD Calls; + DWORD Clusters; + DWORD Hints; + DWORD RunsReturned; + DWORD HintsHonored; + DWORD HintsClusters; + DWORD Cache; + DWORD CacheClusters; + DWORD CacheMiss; + DWORD CacheMissClusters; + } Allocate; +} NTFS_STATISTICS,*PNTFS_STATISTICS; + +typedef struct _FILE_OBJECTID_BUFFER { + BYTE ObjectId[16]; + __MINGW_EXTENSION union { + __MINGW_EXTENSION struct { + BYTE BirthVolumeId[16]; + BYTE BirthObjectId[16]; + BYTE DomainId[16]; + }; + BYTE ExtendedInfo[48]; + }; +} FILE_OBJECTID_BUFFER,*PFILE_OBJECTID_BUFFER; + +typedef struct _FILE_SET_SPARSE_BUFFER { + BOOLEAN SetSparse; +} FILE_SET_SPARSE_BUFFER,*PFILE_SET_SPARSE_BUFFER; + +typedef struct _FILE_ZERO_DATA_INFORMATION { + LARGE_INTEGER FileOffset; + LARGE_INTEGER BeyondFinalZero; +} FILE_ZERO_DATA_INFORMATION,*PFILE_ZERO_DATA_INFORMATION; + +typedef struct _FILE_ALLOCATED_RANGE_BUFFER { + LARGE_INTEGER FileOffset; + LARGE_INTEGER Length; +} FILE_ALLOCATED_RANGE_BUFFER,*PFILE_ALLOCATED_RANGE_BUFFER; + +typedef struct _ENCRYPTION_BUFFER { + DWORD EncryptionOperation; + BYTE Private[1]; +} ENCRYPTION_BUFFER,*PENCRYPTION_BUFFER; + +#define FILE_SET_ENCRYPTION 0x00000001 +#define FILE_CLEAR_ENCRYPTION 0x00000002 +#define STREAM_SET_ENCRYPTION 0x00000003 +#define STREAM_CLEAR_ENCRYPTION 0x00000004 + +#define MAXIMUM_ENCRYPTION_VALUE 0x00000004 + +typedef struct _DECRYPTION_STATUS_BUFFER { + BOOLEAN NoEncryptedStreams; +} DECRYPTION_STATUS_BUFFER,*PDECRYPTION_STATUS_BUFFER; + +#define ENCRYPTION_FORMAT_DEFAULT (0x01) +#define COMPRESSION_FORMAT_SPARSE (0x4000) + +typedef struct _REQUEST_RAW_ENCRYPTED_DATA { + LONGLONG FileOffset; + DWORD Length; +} REQUEST_RAW_ENCRYPTED_DATA,*PREQUEST_RAW_ENCRYPTED_DATA; + +typedef struct _ENCRYPTED_DATA_INFO { + DWORDLONG StartingFileOffset; + DWORD OutputBufferOffset; + DWORD BytesWithinFileSize; + DWORD BytesWithinValidDataLength; + WORD CompressionFormat; + BYTE DataUnitShift; + BYTE ChunkShift; + BYTE ClusterShift; + BYTE EncryptionFormat; + WORD NumberOfDataBlocks; + DWORD DataBlockSize[ANYSIZE_ARRAY]; +} ENCRYPTED_DATA_INFO; +typedef ENCRYPTED_DATA_INFO *PENCRYPTED_DATA_INFO; + +typedef struct _PLEX_READ_DATA_REQUEST { + LARGE_INTEGER ByteOffset; + DWORD ByteLength; + DWORD PlexNumber; +} PLEX_READ_DATA_REQUEST,*PPLEX_READ_DATA_REQUEST; + +typedef struct _SI_COPYFILE { + DWORD SourceFileNameLength; + DWORD DestinationFileNameLength; + DWORD Flags; + WCHAR FileNameBuffer[1]; +} SI_COPYFILE,*PSI_COPYFILE; + +#define COPYFILE_SIS_LINK 0x0001 +#define COPYFILE_SIS_REPLACE 0x0002 +#define COPYFILE_SIS_FLAGS 0x0003 +#endif + +#define IOCTL_VOLUME_BASE ((DWORD) 'V') + +#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE,0,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_VOLUME_IS_CLUSTERED CTL_CODE(IOCTL_VOLUME_BASE,12,METHOD_BUFFERED,FILE_ANY_ACCESS) + +typedef struct _DISK_EXTENT { + DWORD DiskNumber; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER ExtentLength; +} DISK_EXTENT,*PDISK_EXTENT; + +typedef struct _VOLUME_DISK_EXTENTS { + DWORD NumberOfDiskExtents; + DISK_EXTENT Extents[1]; +} VOLUME_DISK_EXTENTS,*PVOLUME_DISK_EXTENTS; +#endif
