📄 winioctl.pas
字号:
SectorsPerTrack : DWORD;
BytesPerSector : DWORD;
end;
PDISK_GEOMETRY = ^TDISK_GEOMETRY;
//
// 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.
//
TPARTITION_INFORMATION = record
StartingOffset : _LARGE_INTEGER;//TLargeInteger;
PartitionLength : _LARGE_INTEGER;//TLargeInteger;
HiddenSectors : DWORD;
PartitionNumber : DWORD;
PartitionType : BYTE;
BootIndicator : BOOLEAN;
RecognizedPartition : BOOLEAN;
RewritePartition : BOOLEAN;
end;
PPARTITION_INFORMATION = ^TPARTITION_INFORMATION;
//
// The following structure is used to change the partition type of a
// specified disk partition using an IOCTL_DISK_SET_PARTITION_INFO
// request.
//
TSET_PARTITION_INFORMATION = record
PartitionType : BYTE;
end;
PSET_PARTITION_INFORMATION = ^TSET_PARTITION_INFORMATION;
//
// 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.
//
TDRIVE_LAYOUT_INFORMATION = record
PartitionCount : DWORD;
Signature : DWORD;
PartitionEntry : array[0..0] of TPARTITION_INFORMATION;
end;
PDRIVE_LAYOUT_INFORMATION = ^TDRIVE_LAYOUT_INFORMATION;
//
// The following structure is passed in on an IOCTL_DISK_VERIFY request.
// The offset and length parameters are both given in bytes.
//
{$ifdef xxx}
typedef struct _VERIFY_INFORMATION {
LARGE_INTEGER StartingOffset;
DWORD Length;
} VERIFY_INFORMATION, *PVERIFY_INFORMATION;
//
// The following structure is passed in on an IOCTL_DISK_REASSIGN_BLOCKS
// request.
//
typedef struct _REASSIGN_BLOCKS {
WORD Reserved;
WORD Count;
DWORD BlockNumber[1];
} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
//
// 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.
//
typedef struct _PREVENT_MEDIA_REMOVAL {
BOOLEAN PreventMediaRemoval;
} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
///////////////////////////////////////////////////////
// //
// 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.
//
typedef struct _DISK_PERFORMANCE {
LARGE_INTEGER BytesRead;
LARGE_INTEGER BytesWritten;
LARGE_INTEGER ReadTime;
LARGE_INTEGER WriteTime;
DWORD ReadCount;
DWORD WriteCount;
DWORD QueueDepth;
} DISK_PERFORMANCE, *PDISK_PERFORMANCE;
//
// 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.
//
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;
//
// The following structure is exchanged on an IOCTL_DISK_LOG request.
// Not all fields are valid with each function type.
//
typedef struct _DISK_LOGGING {
BYTE Function;
PVOID BufferAddress;
DWORD BufferSize;
} DISK_LOGGING, *PDISK_LOGGING;
//
// Disk logging functions
//
// Start disk logging. Only the Function and BufferSize fields are valid.
//
#define DISK_LOGGING_START 0
//
// Stop disk logging. Only the Function field is valid.
//
#define 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.
//
#define 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+.
//
#define DISK_BINNING 3
//
// Bin types
//
typedef enum _BIN_TYPES {
RequestSize,
RequestLocation
} BIN_TYPES;
//
// Bin ranges
//
typedef struct _BIN_RANGE {
LARGE_INTEGER StartValue;
LARGE_INTEGER Length;
} BIN_RANGE, *PBIN_RANGE;
//
// Bin definition
//
typedef struct _PERF_BIN {
DWORD NumberOfBins;
DWORD TypeOfBin;
BIN_RANGE BinsRanges[1];
} PERF_BIN, *PPERF_BIN ;
//
// Bin count
//
typedef struct _BIN_COUNT {
BIN_RANGE BinRange;
DWORD BinCount;
} BIN_COUNT, *PBIN_COUNT;
//
// Bin results
//
typedef struct _BIN_RESULTS {
DWORD NumberOfBins;
BIN_COUNT BinCounts[1];
} BIN_RESULTS, *PBIN_RESULTS;
#define IOCTL_SERIAL_LSRMST_INSERT CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS)
//
// The following values follow the escape designator in the
// data stream if the LSRMST_INSERT mode has been turned on.
//
#define SERIAL_LSRMST_ESCAPE ((BYTE )0x00)
//
// 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.
//
#define SERIAL_LSRMST_LSR_DATA ((BYTE )0x01)
//
// Following this value is the contents of the line status
// register. No error character follows
//
#define SERIAL_LSRMST_LSR_NODATA ((BYTE )0x02)
//
// Following this value is the contents of the modem status
// register.
//
#define SERIAL_LSRMST_MST ((BYTE )0x03)
#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_MOUNT_DBLS_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,13, METHOD_BUFFERED, 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_ANY_ACCESS)
#define FSCTL_READ_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,17, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_WRITE_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,18, METHOD_NEITHER, FILE_ANY_ACCESS)
#endif // _WINIOCTL_
{$endif}
function CtlCode(DeviceType : DWORD; Func : DWord; Method : DWord; Access : DWord) : DWORD;
//#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
// ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
function MediaDescription(Media : Integer) : String;
implementation
// like div but rounds up
function div2(a : LongInt; b : LongInt) : LongInt;
begin
Result := a div b;
if (a mod b) > 0 then
begin
Inc(Result);
end;
end;
function CtlCode(DeviceType : DWORD; Func : DWord; Method : DWord; Access : DWord) : DWORD;
begin
result := (DeviceType shl 16) or (Access shl 14) or (Func shl 2) or (Method);
end;
function DeviceIoControl; external 'kernel32.dll';
function ReadFile2; external kernel32 name 'ReadFile';
function WriteFile2; external kernel32 name 'WriteFile';
function MediaDescription(Media : Integer) : String;
begin
case Media of
Media_Type_F5_1Pt2_512: Result := '5.25, 1.2MB, 512 bytes/sector';
Media_Type_F3_1Pt44_512: Result := '3.5, 1.44MB, 512 bytes/sector';
Media_Type_F3_2Pt88_512: Result := '3.5, 2.88MB, 512 bytes/sector';
Media_Type_F3_20Pt8_512: Result := '3.5, 20.8MB, 512 bytes/sector';
Media_Type_F3_720_512: Result := '3.5, 720KB, 512 bytes/sector';
Media_Type_F5_360_512: Result := '5.25, 360KB, 512 bytes/sector';
Media_Type_F5_320_512: Result := '5.25, 320KB, 512 bytes/sector';
Media_Type_F5_320_1024: Result := '5.25, 320KB, 1024 bytes/sector';
Media_Type_F5_180_512: Result := '5.25, 180KB, 512 bytes/sector';
Media_Type_F5_160_512: Result := '5.25, 160KB, 512 bytes/sector';
Media_Type_RemovableMedia: Result := 'Removable media other than floppy';
Media_Type_FixedMedia: Result := 'Fixed hard disk media';
else
Result := 'Unknown';
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -