INTERFACEWinIoctl ;
Corresponds to build version 0013 of winioctl.h
Abstract: This module defines the 32-Bit Windows Device I/O control codes.
Define the various device type values. Note that values used by Microsoft Corporation are in the range 0-32767, and 32768-65535 are reserved for use by customers.
IMPORT WinNT; FROM WinDef IMPORT BYTE, WORD, DWORD; TYPE DEVICE_TYPE = DWORD; CONST FILE_DEVICE_BEEP = 16_00000001; FILE_DEVICE_CD_ROM = 16_00000002; FILE_DEVICE_CD_ROM_FILE_SYSTEM = 16_00000003; FILE_DEVICE_CONTROLLER = 16_00000004; FILE_DEVICE_DATALINK = 16_00000005; FILE_DEVICE_DFS = 16_00000006; FILE_DEVICE_DISK = 16_00000007; FILE_DEVICE_DISK_FILE_SYSTEM = 16_00000008; FILE_DEVICE_FILE_SYSTEM = 16_00000009; FILE_DEVICE_INPORT_PORT = 16_0000000A; FILE_DEVICE_KEYBOARD = 16_0000000B; FILE_DEVICE_MAILSLOT = 16_0000000C; FILE_DEVICE_MIDI_IN = 16_0000000D; FILE_DEVICE_MIDI_OUT = 16_0000000E; FILE_DEVICE_MOUSE = 16_0000000F; FILE_DEVICE_MULTI_UNC_PROVIDER = 16_00000010; FILE_DEVICE_NAMED_PIPE = 16_00000011; FILE_DEVICE_NETWORK = 16_00000012; FILE_DEVICE_NETWORK_BROWSER = 16_00000013; FILE_DEVICE_NETWORK_FILE_SYSTEM = 16_00000014; FILE_DEVICE_NULL = 16_00000015; FILE_DEVICE_PARALLEL_PORT = 16_00000016; FILE_DEVICE_PHYSICAL_NETCARD = 16_00000017; FILE_DEVICE_PRINTER = 16_00000018; FILE_DEVICE_SCANNER = 16_00000019; FILE_DEVICE_SERIAL_MOUSE_PORT = 16_0000001A; FILE_DEVICE_SERIAL_PORT = 16_0000001B; FILE_DEVICE_SCREEN = 16_0000001C; FILE_DEVICE_SOUND = 16_0000001D; FILE_DEVICE_STREAMS = 16_0000001E; FILE_DEVICE_TAPE = 16_0000001F; FILE_DEVICE_TAPE_FILE_SYSTEM = 16_00000020; FILE_DEVICE_TRANSPORT = 16_00000021; FILE_DEVICE_UNKNOWN = 16_00000022; FILE_DEVICE_VIDEO = 16_00000023; FILE_DEVICE_VIRTUAL_DISK = 16_00000024; FILE_DEVICE_WAVE_IN = 16_00000025; FILE_DEVICE_WAVE_OUT = 16_00000026; FILE_DEVICE_8042_PORT = 16_00000027; FILE_DEVICE_NETWORK_REDIRECTOR = 16_00000028; FILE_DEVICE_BATTERY = 16_00000029; FILE_DEVICE_BUS_EXTENDER = 16_0000002A;
Macro definition for defining IOCTL and FSCTL function control codes. Note that function codes 0-2047 are reserved for Microsoft Corporation, and 2048-4095 are reserved for customers.
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ )
TYPE
CTL_CODE = RECORD
Method : BITS 2 FOR [METHOD_BUFFERED..METHOD_NEITHER];
Function : BITS 12 FOR [0..4095];
Access : BITS 2 FOR [0..3];
DeviceType: BITS 16 FOR WORD;
END;
CONST
IOCTL_USER_CODES = 16_0800;
Define the method codes for how buffers are passed for I/O and FS controls
CONST METHOD_BUFFERED = 0; METHOD_IN_DIRECT = 1; METHOD_OUT_DIRECT = 2; METHOD_NEITHER = 3;Define the access check value for any access
The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these constants *MUST* always be in sync.
CONST FILE_ANY_ACCESS = 0; FILE_READ_ACCESS = 1; (* file & pipe *) FILE_WRITE_ACCESS = 2; (* file & pipe *) FILE_READ_DATA = FILE_READ_ACCESS; FILE_WRITE_DATA = FILE_WRITE_ACCESS;end_ntddk end_nthal end_ntifs
IoControlCode values for disk devices.
CONST
IOCTL_DISK_BASE = FILE_DEVICE_DISK;
IOCTL_DISK_GET_DRIVE_GEOMETRY = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0000, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_GET_PARTITION_INFO = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0001, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_SET_PARTITION_INFO = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0002, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS + FILE_WRITE_ACCESS };
IOCTL_DISK_GET_DRIVE_LAYOUT = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0003, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_SET_DRIVE_LAYOUT = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0004, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS + FILE_WRITE_ACCESS };
IOCTL_DISK_VERIFY = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0005, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_FORMAT_TRACKS = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0006, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS + FILE_WRITE_ACCESS };
IOCTL_DISK_REASSIGN_BLOCKS = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0007, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS + FILE_WRITE_ACCESS };
IOCTL_DISK_PERFORMANCE = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0008, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_IS_WRITABLE = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0009, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_LOGGING = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_000A, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_FORMAT_TRACKS_EX = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_000B, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS + FILE_WRITE_ACCESS };
IOCTL_DISK_HISTOGRAM_STRUCTURE = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_000C, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_HISTOGRAM_DATA = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_000D, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_HISTOGRAM_RESET = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_000E, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_REQUEST_STRUCTURE = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_000F, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
IOCTL_DISK_REQUEST_DATA = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0010, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
The following device control codes are common for all class drivers. The functions codes defined here must match all of the other class drivers.
CONST
IOCTL_DISK_CHECK_VERIFY = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0200, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_MEDIA_REMOVAL = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0201, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_EJECT_MEDIA = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0202, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_LOAD_MEDIA = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0203, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_RESERVE = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0204, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_RELEASE = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0205, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_FIND_NEW_DEVICES = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0206, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_REMOVE_DEVICE = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0207, Method:= METHOD_BUFFERED, Access:= FILE_READ_ACCESS };
IOCTL_DISK_GET_MEDIA_TYPES = CTL_CODE{ DeviceType:= IOCTL_DISK_BASE, Function:= 16_0300, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
Define the partition types returnable by known disk drivers.
CONST PARTITION_ENTRY_UNUSED = 16_00; (* Entry unused *) PARTITION_FAT_12 = 16_01; (* 12-bit FAT entries *) PARTITION_XENIX_1 = 16_02; (* Xenix *) PARTITION_XENIX_2 = 16_03; (* Xenix *) PARTITION_FAT_16 = 16_04; (* 16-bit FAT entries *) PARTITION_EXTENDED = 16_05; (* Extended partition entry *) PARTITION_HUGE = 16_06; (* Huge partition MS-DOS V4 *) PARTITION_IFS = 16_07; (* IFS Partition *) PARTITION_PREP = 16_41; (* PowerPC Reference Platform (PReP) Boot Partition *) PARTITION_UNIX = 16_63; (* Unix *) VALID_NTFT = 16_C0; (* NTFT uses high order bits *)
// The high bit of the partition type code indicates that a partition // is part of an NTFT mirror or striped array.
CONST PARTITION_NTFT = 16_80; (* NTFT partition *)
// The following macro is used to determine which partitions should be // assigned drive letters.
PROCEDURE IsRecognizedPartition (partitionType: DWORD): BOOLEAN;
// // Routine Description: // // This macro is used to determine to which partitions drive letters // should be assigned. // // Arguments: // // PartitionType - Supplies the type of the partition being examined. // // Return Value: // // The return value is TRUE if the partition type is recognized, // otherwise FALSE is returned. //
Define the media types supported by the driver.
TYPE
PMEDIA_TYPE = UNTRACED REF MEDIA_TYPE;
MEDIA_TYPE =
{
Unknown, (* Format is unknown *)
F5_1Pt2_512, (* 5.25", 1.2MB, 512 bytes/sector *)
F3_1Pt44_512, (* 3.5", 1.44MB, 512 bytes/sector *)
F3_2Pt88_512, (* 3.5", 2.88MB, 512 bytes/sector *)
F3_20Pt8_512, (* 3.5", 20.8MB, 512 bytes/sector *)
F3_720_512, (* 3.5", 720KB, 512 bytes/sector *)
F5_360_512, (* 5.25", 360KB, 512 bytes/sector *)
F5_320_512, (* 5.25", 320KB, 512 bytes/sector *)
F5_320_1024, (* 5.25", 320KB, 1024 bytes/sector *)
F5_180_512, (* 5.25", 180KB, 512 bytes/sector *)
F5_160_512, (* 5.25", 160KB, 512 bytes/sector *)
RemovableMedia, (* Removable media other than floppy *)
FixedMedia (* Fixed hard disk media *)
};
// Define the input buffer structure for the driver, when // it is called with IOCTL_DISK_FORMAT_TRACKS.
TYPE
PFORMAT_PARAMETERS = UNTRACED REF FORMAT_PARAMETERS;
FORMAT_PARAMETERS = RECORD
MediaType: MEDIA_TYPE;
StartCylinderNumber: DWORD;
EndCylinderNumber: DWORD;
StartHeadNumber: DWORD;
EndHeadNumber: DWORD;
END;
// Define the BAD_TRACK_NUMBER type. An array of elements of this type is // returned by the driver on IOCTL_DISK_FORMAT_TRACKS requests, to indicate // what tracks were bad during formatting. The length of that array is // reported in the `Information' field of the I/O Status Block.
TYPE BAD_TRACK_NUMBER = WORD; PBAD_TRACK_NUMBER = UNTRACED REF BAD_TRACK_NUMBER;
// Define the input buffer structure for the driver, when // it is called with IOCTL_DISK_FORMAT_TRACKS_EX.
TYPE
PFORMAT_EX_PARAMETERS = UNTRACED REF FORMAT_EX_PARAMETERS;
FORMAT_EX_PARAMETERS = RECORD
MediaType : MEDIA_TYPE;
StartCylinderNumber: DWORD;
EndCylinderNumber: DWORD;
StartHeadNumber: DWORD;
EndHeadNumber: DWORD;
FormatGapLength: WORD;
SectorsPerTrack: WORD;
SectorNumber: ARRAY [0..0] OF WORD;
END;
// The following structure is returned on an IOCTL_DISK_GET_DRIVE_GEOMETRY // request and an array of them is returned on an IOCTL_DISK_GET_MEDIA_TYPES // request.
TYPE
PDISK_GEOMETRY = UNTRACED REF DISK_GEOMETRY;
DISK_GEOMETRY = RECORD
Cylinders: WinNT.LARGE_INTEGER;
MediaType: MEDIA_TYPE;
TracksPerCylinder: DWORD;
SectorsPerTrack : DWORD;
BytesPerSector : DWORD;
END;
// The following structure is returned on an IOCTL_DISK_GET_PARTITION_INFO // and an IOCTL_DISK_GET_DRIVE_LAYOUT request. It is also used in a request // to change the drive layout, IOCTL_DISK_SET_DRIVE_LAYOUT.
TYPE
PPARTITION_INFORMATION = UNTRACED REF PARTITION_INFORMATION;
PARTITION_INFORMATION = RECORD
StartingOffset: WinNT.LARGE_INTEGER;
PartitionLength: WinNT.LARGE_INTEGER;
HiddenSectors: DWORD;
PartitionNumber: DWORD;
PartitionType: BYTE;
BootIndicator: WinNT.WBOOLEAN;
RecognizedPartition: WinNT.WBOOLEAN;
RewritePartition: WinNT.WBOOLEAN;
END;
// The following structure is used to change the partition type of a // specified disk partition using an IOCTL_DISK_SET_PARTITION_INFO // request.
TYPE
PSET_PARTITION_INFORMATION = UNTRACED REF SET_PARTITION_INFORMATION;
SET_PARTITION_INFORMATION = RECORD
PartitionType: BYTE;
END;
// The following structures is returned on an IOCTL_DISK_GET_DRIVE_LAYOUT // request and given as input to an IOCTL_DISK_SET_DRIVE_LAYOUT request.
TYPE
PDRIVE_LAYOUT_INFORMATION = UNTRACED REF DRIVE_LAYOUT_INFORMATION;
DRIVE_LAYOUT_INFORMATION = RECORD
PartitionCount: DWORD;
Signature: DWORD;
PartitionEntry: ARRAY [0..0] OF PARTITION_INFORMATION;
END;
// The following structure is passed in on an IOCTL_DISK_VERIFY request. // The offset and length parameters are both given in bytes.
TYPE
PVERIFY_INFORMATION = UNTRACED REF VERIFY_INFORMATION;
VERIFY_INFORMATION = RECORD
StartingOffset: WinNT.LARGE_INTEGER;
Length: DWORD;
END;
// The following structure is passed in on an IOCTL_DISK_REASSIGN_BLOCKS // request.
TYPE
PREASSIGN_BLOCKS = UNTRACED REF REASSIGN_BLOCKS;
REASSIGN_BLOCKS = RECORD
Reserved: WORD;
Count: WORD;
BlockNumber: ARRAY [0..0] OF DWORD;
END;
// IOCTL_DISK_MEDIA_REMOVAL disables the mechanism // on a SCSI device that ejects media. This function // may or may not be supported on SCSI devices that // support removable media. // // TRUE means prevent media from being removed. // FALSE means allow media removal.
TYPE
PPREVENT_MEDIA_REMOVAL = UNTRACED REF PREVENT_MEDIA_REMOVAL;
PREVENT_MEDIA_REMOVAL = RECORD
PreventMediaRemoval: WinNT.WBOOLEAN;
END;
/////////////////////////////////////////////////////// // // // The following structures define disk performance // // statistics: specifically the locations of all the // // reads and writes which have occured on the disk. // // // // To use these structures, you must issue an IOCTL_ // // DISK_HIST_STRUCTURE (with a DISK_HISTOGRAM) to // // obtain the basic histogram information. The // // number of buckets which must allocated is part of // // this structure. Allocate the required number of // // buckets and call an IOCTL_DISK_HIST_DATA to fill // // in the data // // // ///////////////////////////////////////////////////////
CONST HIST_NO_OF_BUCKETS = 24;
TYPE
PHISTOGRAM_BUCKET = UNTRACED REF HISTOGRAM_BUCKET;
HISTOGRAM_BUCKET = RECORD
Reads : DWORD;
Writes: DWORD;
END;
CONST HISTOGRAM_BUCKET_SIZE = BYTESIZE(HISTOGRAM_BUCKET);
TYPE
PDISK_HISTOGRAM = UNTRACED REF DISK_HISTOGRAM;
DISK_HISTOGRAM = RECORD
DiskSize: WinNT.LARGE_INTEGER;
Start: WinNT.LARGE_INTEGER;
End: WinNT.LARGE_INTEGER;
Average: WinNT.LARGE_INTEGER;
AverageRead: WinNT.LARGE_INTEGER;
AverageWrite: WinNT.LARGE_INTEGER;
Granularity: DWORD;
Size: DWORD;
ReadCount: DWORD;
WriteCount: DWORD;
Histogram: PHISTOGRAM_BUCKET;
END;
CONST DISK_HISTOGRAM_SIZE = BYTESIZE(DISK_HISTOGRAM);
/////////////////////////////////////////////////////// // // // The following structures define disk debugging // // capabilities. The IOCTLs are directed to one of // // the two disk filter drivers. // // // // DISKPERF is a utilty for collecting disk request // // statistics. // // // // SIMBAD is a utility for injecting faults in // // IO requests to disks. // // // ///////////////////////////////////////////////////////
// // The following structure is exchanged on an IOCTL_DISK_GET_PERFORMANCE // request. This ioctl collects summary disk request statistics used // in measuring performance. //
TYPE
PDISK_PERFORMANCE = UNTRACED REF DISK_PERFORMANCE;
DISK_PERFORMANCE = RECORD
BytesRead: WinNT.LARGE_INTEGER;
BytesWritten: WinNT.LARGE_INTEGER;
ReadTime: WinNT.LARGE_INTEGER;
WriteTime: WinNT.LARGE_INTEGER;
ReadCount: DWORD;
WriteCount: DWORD;
QueueDepth: DWORD;
END;
// This structure defines the disk logging record. When disk logging // is enabled, one of these is written to an internal buffer for each // disk request.
TYPE PDISK_RECORD = UNTRACED REF DISK_RECORD; DISK_RECORD = RECORD ByteOffset: WinNT.LARGE_INTEGER; StartTime: WinNT.LARGE_INTEGER; EndTime: WinNT.LARGE_INTEGER; VirtualAddress: WinNT.PVOID; NumberOfBytes: DWORD; DeviceNumber: BYTE; ReadRequest: WinNT.WBOOLEAN ; END;
// The following structure is exchanged on an IOCTL_DISK_LOG request. // Not all fields are valid with each function type.
TYPE
PDISK_LOGGING = UNTRACED REF DISK_LOGGING;
DISK_LOGGING = RECORD
Function: BYTE;
BufferAddress: WinNT.PVOID;
BufferSize: DWORD;
END;
// Disk logging functions // // Start disk logging. Only the Function and BufferSize fields are valid.
CONST DISK_LOGGING_START = 0;Stop disk logging. Only the Function field is valid.
CONST DISK_LOGGING_STOP = 1;
Return disk log. All fields are valid. Data will be copied from internal buffer to buffer specified for the number of bytes requested.
CONST DISK_LOGGING_DUMP = 2;
// DISK BINNING // // DISKPERF will keep counters for IO that falls in each of these ranges. // The application determines the number and size of the ranges. // Joe Lin wanted me to keep it flexible as possible, for instance, IO // sizes are interesting in ranges like 0-4096, 4097-16384, 16385-65536, 65537+.
CONST DISK_BINNING = 3;Bin types
TYPE
BIN_TYPES = { RequestSize, RequestLocation };
Bin ranges
TYPE
PBIN_RANGE = UNTRACED REF BIN_RANGE;
BIN_RANGE = RECORD
StartValue: WinNT.LARGE_INTEGER;
Length: WinNT.LARGE_INTEGER;
END;
Bin definition
TYPE
PPERF_BIN = UNTRACED REF PERF_BIN;
PERF_BIN = RECORD
NumberOfBins: DWORD;
TypeOfBin: DWORD;
BinsRanges: ARRAY [0..0] OF BIN_RANGE;
END;
Bin count
TYPE
PBIN_COUNT = UNTRACED REF BIN_COUNT;
BIN_COUNT = RECORD
BinRange: BIN_RANGE;
BinCount: DWORD;
END;
Bin results
TYPE
PBIN_RESULTS = UNTRACED REF BIN_RESULTS;
BIN_RESULTS = RECORD
NumberOfBins: DWORD;
BinCounts: ARRAY[0..0] OF BIN_COUNT;
END;
CONST
IOCTL_SERIAL_LSRMST_INSERT = CTL_CODE{ DeviceType:= FILE_DEVICE_SERIAL_PORT, Function:= 31, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
// The following values follow the escape designator in the // data stream if the LSRMST_INSERT mode has been turned on.
CONST SERIAL_LSRMST_ESCAPE : BYTE = 0;
// Following this value is the contents of the line status // register, and then the character in the RX hardware when // the line status register was encountered.
CONST SERIAL_LSRMST_LSR_DATA : BYTE = 1;
// Following this value is the contents of the line status // register. No error character follows
CONST SERIAL_LSRMST_LSR_NODATA : BYTE = 2;
// Following this value is the contents of the modem status // register.
CONST
SERIAL_LSRMST_MST : BYTE = 3;
FSCTL_LOCK_VOLUME = CTL_CODE{ DeviceType:= FILE_DEVICE_FILE_SYSTEM, Function:= 6, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
FSCTL_UNLOCK_VOLUME = CTL_CODE{ DeviceType:= FILE_DEVICE_FILE_SYSTEM, Function:= 7, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
FSCTL_DISMOUNT_VOLUME = CTL_CODE{ DeviceType:= FILE_DEVICE_FILE_SYSTEM, Function:= 8, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
FSCTL_MOUNT_DBLS_VOLUME = CTL_CODE{ DeviceType:= FILE_DEVICE_FILE_SYSTEM, Function:= 13, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
FSCTL_GET_COMPRESSION = CTL_CODE{ DeviceType:= FILE_DEVICE_FILE_SYSTEM, Function:= 15, Method:= METHOD_BUFFERED, Access:= FILE_ANY_ACCESS };
FSCTL_SET_COMPRESSION = CTL_CODE{ DeviceType:= FILE_DEVICE_FILE_SYSTEM, Function:= 16, Method:= METHOD_BUFFERED, Access:= FILE_READ_DATA + FILE_WRITE_DATA };
FSCTL_READ_COMPRESSION = CTL_CODE{ DeviceType:= FILE_DEVICE_FILE_SYSTEM, Function:= 17, Method:= METHOD_NEITHER, Access:= FILE_READ_DATA };
FSCTL_WRITE_COMPRESSION = CTL_CODE{ DeviceType:= FILE_DEVICE_FILE_SYSTEM, Function:= 18, Method:= METHOD_NEITHER, Access:= FILE_WRITE_DATA };
END WinIoctl.