📄 winioctl.pas
字号:
EndTime: LARGE_INTEGER;
VirtualAddress: PVOID;
NumberOfBytes: DWORD;
DeviceNumber: BYTE;
ReadRequest: ByteBool;
end;
{$EXTERNALSYM _DISK_RECORD}
DISK_RECORD = _DISK_RECORD;
{$EXTERNALSYM DISK_RECORD}
TDiskRecord = DISK_RECORD;
PDiskRecord = PDISK_RECORD;
//
// The following structure is exchanged on an IOCTL_DISK_LOG request.
// Not all fields are valid with each function type.
//
PDISK_LOGGING = ^DISK_LOGGING;
{$EXTERNALSYM PDISK_LOGGING}
_DISK_LOGGING = record
Function_: BYTE;
BufferAddress: PVOID;
BufferSize: DWORD;
end;
{$EXTERNALSYM _DISK_LOGGING}
DISK_LOGGING = _DISK_LOGGING;
{$EXTERNALSYM DISK_LOGGING}
TDiskLogging = DISK_LOGGING;
PDiskLogging = PDISK_LOGGING;
//
// Disk logging functions
//
// Start disk logging. Only the Function and BufferSize fields are valid.
//
const
DISK_LOGGING_START = 0;
{$EXTERNALSYM DISK_LOGGING_START}
//
// Stop disk logging. Only the Function field is valid.
//
DISK_LOGGING_STOP = 1;
{$EXTERNALSYM DISK_LOGGING_STOP}
//
// Return disk log. All fields are valid. Data will be copied from internal
// buffer to buffer specified for the number of bytes requested.
//
DISK_LOGGING_DUMP = 2;
{$EXTERNALSYM DISK_LOGGING_DUMP}
//
// 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+.
//
DISK_BINNING = 3;
{$EXTERNALSYM DISK_BINNING}
//
// Bin types
//
type
_BIN_TYPES = (RequestSize, RequestLocation);
{$EXTERNALSYM _BIN_TYPES}
BIN_TYPES = _BIN_TYPES;
{$EXTERNALSYM BIN_TYPES}
TBinTypes = _BIN_TYPES;
//
// Bin ranges
//
PBIN_RANGE = ^BIN_RANGE;
{$EXTERNALSYM PBIN_RANGE}
_BIN_RANGE = record
StartValue: LARGE_INTEGER;
Length: LARGE_INTEGER;
end;
{$EXTERNALSYM _BIN_RANGE}
BIN_RANGE = _BIN_RANGE;
{$EXTERNALSYM BIN_RANGE}
TBinRange = BIN_RANGE;
PBinRange = PBIN_RANGE;
//
// Bin definition
//
PPERF_BIN = ^PERF_BIN;
{$EXTERNALSYM PPERF_BIN}
_PERF_BIN = record
NumberOfBins: DWORD;
TypeOfBin: DWORD;
BinsRanges: array [0..0] of BIN_RANGE;
end;
{$EXTERNALSYM _PERF_BIN}
PERF_BIN = _PERF_BIN;
{$EXTERNALSYM PERF_BIN}
TPerfBin = PERF_BIN;
PPerfBin = PPERF_BIN;
//
// Bin count
//
PBIN_COUNT = ^BIN_COUNT;
{$EXTERNALSYM PBIN_COUNT}
_BIN_COUNT = record
BinRange: BIN_RANGE;
BinCount: DWORD;
end;
{$EXTERNALSYM _BIN_COUNT}
BIN_COUNT = _BIN_COUNT;
{$EXTERNALSYM BIN_COUNT}
TBinCount = BIN_COUNT;
PBinCount = PBIN_COUNT;
//
// Bin results
//
PBIN_RESULTS = ^BIN_RESULTS;
{$EXTERNALSYM PBIN_RESULTS}
_BIN_RESULTS = record
NumberOfBins: DWORD;
BinCounts: array [0..0] of BIN_COUNT;
end;
{$EXTERNALSYM _BIN_RESULTS}
BIN_RESULTS = _BIN_RESULTS;
{$EXTERNALSYM BIN_RESULTS}
TBinResults = BIN_RESULTS;
PBinResults = PBIN_RESULTS;
//
// Data structures for SMART drive fault prediction.
//
// GETVERSIONINPARAMS contains the data returned from the
// Get Driver Version function.
//
//#include <pshpack1.h>
LPGETVERSIONINPARAMS = ^GETVERSIONINPARAMS;
{$EXTERNALSYM LPGETVERSIONINPARAMS}
_GETVERSIONINPARAMS = packed record
bVersion: BYTE; // Binary driver version.
bRevision: BYTE; // Binary driver revision.
bReserved: BYTE; // Not used.
bIDEDeviceMap: BYTE; // Bit map of IDE devices.
fCapabilities: DWORD; // Bit mask of driver capabilities.
dwReserved: array [0..3] of DWORD; // For future use.
end;
{$EXTERNALSYM _GETVERSIONINPARAMS}
GETVERSIONINPARAMS = _GETVERSIONINPARAMS;
{$EXTERNALSYM GETVERSIONINPARAMS}
TGetVersionInParams = GETVERSIONINPARAMS;
PGetVersionInParams = LPGETVERSIONINPARAMS;
//#include <poppack.h>
//
// Bits returned in the fCapabilities member of GETVERSIONINPARAMS
//
const
CAP_ATA_ID_CMD = 1; // ATA ID command supported
{$EXTERNALSYM CAP_ATA_ID_CMD}
CAP_ATAPI_ID_CMD = 2; // ATAPI ID command supported
{$EXTERNALSYM CAP_ATAPI_ID_CMD}
CAP_SMART_CMD = 4; // SMART commannds supported
{$EXTERNALSYM CAP_SMART_CMD}
//
// IDE registers
//
//#include <pshpack1.h>
type
LPIDEREGS = ^IDEREGS;
{$EXTERNALSYM LPIDEREGS}
_IDEREGS = packed record
bFeaturesReg: BYTE; // Used for specifying SMART "commands".
bSectorCountReg: BYTE; // IDE sector count register
bSectorNumberReg: BYTE; // IDE sector number register
bCylLowReg: BYTE; // IDE low order cylinder value
bCylHighReg: BYTE; // IDE high order cylinder value
bDriveHeadReg: BYTE; // IDE drive/head register
bCommandReg: BYTE; // Actual IDE command.
bReserved: BYTE; // reserved for future use. Must be zero.
end;
{$EXTERNALSYM _IDEREGS}
IDEREGS = _IDEREGS;
{$EXTERNALSYM IDEREGS}
TIdeRegs = IDEREGS;
PIdeRegs = LPIDEREGS;
//#include <poppack.h>
//
// Valid values for the bCommandReg member of IDEREGS.
//
const
ATAPI_ID_CMD = $A1; // Returns ID sector for ATAPI.
{$EXTERNALSYM ATAPI_ID_CMD}
ID_CMD = $EC; // Returns ID sector for ATA.
{$EXTERNALSYM ID_CMD}
SMART_CMD = $B0; // Performs SMART cmd.
// Requires valid bFeaturesReg,
// bCylLowReg, and bCylHighReg
{$EXTERNALSYM SMART_CMD}
//
// Cylinder register defines for SMART command
//
SMART_CYL_LOW = $4F;
{$EXTERNALSYM SMART_CYL_LOW}
SMART_CYL_HI = $C2;
{$EXTERNALSYM SMART_CYL_HI}
//
// SENDCMDINPARAMS contains the input parameters for the
// Send Command to Drive function.
//
//#include <pshpack1.h>
type
LPSENDCMDINPARAMS = ^SENDCMDINPARAMS;
{$EXTERNALSYM LPSENDCMDINPARAMS}
_SENDCMDINPARAMS = packed record
cBufferSize: DWORD; // Buffer size in bytes
irDriveRegs: IDEREGS; // Structure with drive register values.
bDriveNumber: BYTE; // Physical drive number to send
// command to (0,1,2,3).
bReserved: array [0..2] of BYTE; // Reserved for future expansion.
dwReserved: array [0..3] of DWORD; // For future use.
bBuffer: array [0..0] of BYTE; // Input buffer.
end;
{$EXTERNALSYM _SENDCMDINPARAMS}
SENDCMDINPARAMS = _SENDCMDINPARAMS;
{$EXTERNALSYM SENDCMDINPARAMS}
TSendCmdInParams = SENDCMDINPARAMS;
PSendCmdInParams = LPSENDCMDINPARAMS;
//#include <poppack.h>
//
// Status returned from driver
//
//#include <pshpack1.h>
LPDRIVERSTATUS = ^DRIVERSTATUS;
{$EXTERNALSYM LPDRIVERSTATUS}
_DRIVERSTATUS = packed record
bDriverError: BYTE; // Error code from driver,
// or 0 if no error.
bIDEError: BYTE; // Contents of IDE Error register.
// Only valid when bDriverError
// is SMART_IDE_ERROR.
bReserved: array [0..1] of BYTE; // Reserved for future expansion.
dwReserved: array [0..1] of DWORD; // Reserved for future expansion.
end;
{$EXTERNALSYM _DRIVERSTATUS}
DRIVERSTATUS = _DRIVERSTATUS;
{$EXTERNALSYM DRIVERSTATUS}
TDriverStatus = DRIVERSTATUS;
PDriverStatus = LPDRIVERSTATUS;
//#include <poppack.h>
//
// bDriverError values
//
const
SMART_NO_ERROR = 0; // No error
{$EXTERNALSYM SMART_NO_ERROR}
SMART_IDE_ERROR = 1; // Error from IDE controller
{$EXTERNALSYM SMART_IDE_ERROR}
SMART_INVALID_FLAG = 2; // Invalid command flag
{$EXTERNALSYM SMART_INVALID_FLAG}
SMART_INVALID_COMMAND = 3; // Invalid command byte
{$EXTERNALSYM SMART_INVALID_COMMAND}
SMART_INVALID_BUFFER = 4; // Bad buffer (null, invalid addr..)
{$EXTERNALSYM SMART_INVALID_BUFFER}
SMART_INVALID_DRIVE = 5; // Drive number not valid
{$EXTERNALSYM SMART_INVALID_DRIVE}
SMART_INVALID_IOCTL = 6; // Invalid IOCTL
{$EXTERNALSYM SMART_INVALID_IOCTL}
SMART_ERROR_NO_MEM = 7; // Could not lock user's buffer
{$EXTERNALSYM SMART_ERROR_NO_MEM}
SMART_INVALID_REGISTER = 8; // Some IDE Register not valid
{$EXTERNALSYM SMART_INVALID_REGISTER}
SMART_NOT_SUPPORTED = 9; // Invalid cmd flag set
{$EXTERNALSYM SMART_NOT_SUPPORTED}
SMART_NO_IDE_DEVICE = 10; // Cmd issued to device not present
{$EXTERNALSYM SMART_NO_IDE_DEVICE}
// although drive number is valid
//#include <pshpack1.h>
type
LPSENDCMDOUTPARAMS = ^SENDCMDOUTPARAMS;
{$EXTERNALSYM LPSENDCMDOUTPARAMS}
_SENDCMDOUTPARAMS = packed record
cBufferSize: DWORD; // Size of bBuffer in bytes
DriverStatus: DRIVERSTATUS; // Driver status structure.
bBuffer: array [0..0] of BYTE; // Buffer of arbitrary length in which to store the data read from the // drive.
end;
{$EXTERNALSYM _SENDCMDOUTPARAMS}
SENDCMDOUTPARAMS = _SENDCMDOUTPARAMS;
{$EXTERNALSYM SENDCMDOUTPARAMS}
TSendCmdOutParams = SENDCMDOUTPARAMS;
PSendCmdOutParams = LPSENDCMDOUTPARAMS;
//#include <poppack.h>
const
READ_ATTRIBUTE_BUFFER_SIZE = 512;
{$EXTERNALSYM READ_ATTRIBUTE_BUFFER_SIZE}
IDENTIFY_BUFFER_SIZE = 512;
{$EXTERNALSYM IDENTIFY_BUFFER_SIZE}
READ_THRESHOLD_BUFFER_SIZE = 512;
{$EXTERNALSYM READ_THRESHOLD_BUFFER_SIZE}
//
// Feature register defines for SMART "sub commands"
//
READ_ATTRIBUTES = $D0;
{$EXTERNALSYM READ_ATTRIBUTES}
READ_THRESHOLDS = $D1;
{$EXTERNALSYM READ_THRESHOLDS}
ENABLE_DISABLE_AUTOSAVE = $D2;
{$EXTERNALSYM ENABLE_DISABLE_AUTOSAVE}
SAVE_ATTRIBUTE_VALUES = $D3;
{$EXTERNALSYM SAVE_ATTRIBUTE_VALUES}
EXECUTE_OFFLINE_DIAGS = $D4;
{$EXTERNALSYM EXECUTE_OFFLINE_DIAGS}
ENABLE_SMART = $D8;
{$EXTERNALSYM ENABLE_SMART}
DISABLE_SMART = $D9;
{$EXTERNALSYM DISABLE_SMART}
RETURN_SMART_STATUS = $DA;
{$EXTERNALSYM RETURN_SMART_STATUS}
ENABLE_DISABLE_AUTO_OFFLINE = $DB;
{$EXTERNALSYM ENABLE_DISABLE_AUTO_OFFLINE}
IOCTL_CHANGER_BASE = FILE_DEVICE_CHANGER;
{$EXTERNALSYM IOCTL_CHANGER_BASE}
IOCTL_CHANGER_GET_PARAMETERS = (
(IOCTL_CHANGER_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
($0000 shl 2) or METHOD_BUFFERED);
{$EXTERNALSYM IOCTL_CHANGER_GET_PARAMETERS}
IOCTL_CHANGER_GET_STATUS = (
(IOCTL_CHANGER_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
($0001 shl 2) or METHOD_BUFFERED)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -