home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2004 February
/
Chip_2004-02_cd1.bin
/
zkuste
/
konfig
/
download
/
msic
/
Help
/
Int
/
MiTeC_WinIOCTL.int
< prev
next >
Wrap
Text File
|
2003-08-26
|
15KB
|
373 lines
{*******************************************************}
{ }
{ MiTeC System Information Component }
{ Windows IOCTL }
{ version 8.3 for Delphi 5,6,7 }
{ }
{ Copyright ⌐ 1997,2003 Michal Mutl }
{ }
{*******************************************************}
{$INCLUDE MITEC_DEF.INC}
unit MiTeC_WinIOCTL;
interface
uses Windows, SysUtils;
type
TSrbIoControl = packed record
HeaderLength : ULONG;
Signature : Array[0..7] of Char;
Timeout : ULONG;
ControlCode : ULONG;
ReturnCode : ULONG;
Length : ULONG;
end;
SRB_IO_CONTROL = TSrbIoControl;
PSrbIoControl = ^TSrbIoControl;
TIDERegs = 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. Must be zero.
end;
IDEREGS = TIDERegs;
PIDERegs = ^TIDERegs;
TSendCmdInParams = packed record
cBufferSize : DWORD;
irDriveRegs : TIDERegs;
bDriveNumber : Byte;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte;
end;
SENDCMDINPARAMS = TSendCmdInParams;
PSendCmdInParams = ^TSendCmdInParams;
// Status returned from driver
TDriverStatus = record
bDriverError, // Error code from driver, or 0 if no error.
bIDEStatus: 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;
DRIVERSTATUS = TDriverStatus;
PDriverStatus = ^TDriverStatus;
// Structure returned by PhysicalDrive IOCTL for several commands
TSendCmdOutParams = record
cBufferSize: DWORD; // Size of bBuffer in bytes
DriverStatus: TDriverStatus; // Driver status structure.
bBuffer: array[0..0] of BYTE; // Buffer of arbitrary length in which to store the data read from the // drive.
end;
SENDCMDOUTPARAMS = TSendCmdOutParams;
PSendCmdOutParams = ^TSendCmdOutParams;
TIdSector = packed record
wGenConfig : Word;
wNumCyls : Word;
wReserved : Word;
wNumHeads : Word;
wUnformattedBytesPerTrack : Word;
wUnformattedBytesPerSector : Word;
wSectorsPerTrack : Word;
wVendorUnique : Array[0..2] of Word;
sSerialNumber : Array[0..19] of Char;
wBufferType : Word;
wBufferSize : Word;
wECCSize : Word;
sFirmwareRev : Array[0..7] of Char;
sModelNumber : Array[0..39] of Char;
wMoreVendorUnique : Word;
wDoubleWordIO : Word;
wCapabilities : Word;
wReserved1 : Word;
wPIOTiming : Word;
wDMATiming : Word;
wBS : Word;
wNumCurrentCyls : Word;
wNumCurrentHeads : Word;
wNumCurrentSectorsPerTrack : Word;
ulCurrentSectorCapacity : ULONG;
wMultSectorStuff : Word;
ulTotalAddressableSectors : ULONG;
wSingleWordDMA : Word;
wMultiWordDMA : Word;
AdvancedPIOModes,
Reserved4,
MinimumMWXferCycleTime,
RecommendedMWXferCycleTime,
MinimumPIOCycleTime,
MinimumPIOCycleTimeIORDY: Word;
Reserved5: array[0..1] of Word;
ReleaseTimeOverlapped,
ReleaseTimeServiceCommand,
MajorRevision,
MinorRevision: Word;
Reserved6: array[0..49] of Word;
SpecialFunctionsEnabled: Word;
Reserved7: array[0..127] of Word;
end;
PIdSector = ^TIdSector;
TGetVersionOutParams = record
bVersion, // Binary driver version.
bRevision, // Binary driver revision.
bReserved, // 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;
GETVERSIONOUTPARAMS = TGetVersionOutParams;
PGetVersionOutParams = ^TGetVersionOutParams;
TMediaType = (
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
F3_120M_512, // 3.5", 120M Floppy
F3_640_512, // 3.5" , 640KB, 512 bytes/sector
F5_640_512, // 5.25", 640KB, 512 bytes/sector
F5_720_512, // 5.25", 720KB, 512 bytes/sector
F3_1Pt2_512, // 3.5" , 1.2Mb, 512 bytes/sector
F3_1Pt23_1024, // 3.5" , 1.23Mb, 1024 bytes/sector
F5_1Pt23_1024, // 5.25", 1.23MB, 1024 bytes/sector
F3_128Mb_512, // 3.5" MO 128Mb 512 bytes/sector
F3_230Mb_512, // 3.5" MO 230Mb 512 bytes/sector
F8_256_128, // 8", 256KB, 128 bytes/sector
F3_200Mb_512, // 3.5", 200M Floppy (HiFD)
F3_240M_512, // 3.5", 240Mb Floppy (HiFD)
F3_32M_512); // 3.5", 32Mb Floppy
MEDIA_TYPE = TMediaType;
PMediaType = ^TMediaType;
TPartitionInformation = record
StartingOffset: LARGE_INTEGER;
PartitionLength: LARGE_INTEGER;
HiddenSectors: DWORD;
PartitionNumber: DWORD;
PartitionType: BYTE;
BootIndicator: ByteBool;
RecognizedPartition: ByteBool;
RewritePartition: ByteBool;
end;
PARTITION_INFORMATION = TPartitionInformation;
PPartitionInformation = ^TPartitionInformation;
TDriveLayoutInformation = record
PartitionCount: DWORD;
Signature: DWORD;
PartitionEntry: array [0..0] of TPartitionInformation;
end;
DRIVE_LAYOUT_INFORMATION = TDriveLayoutInformation;
PDriveLayoutInformation = ^TDriveLayoutInformation;
TDiskGeometry = record
Cylinders: LARGE_INTEGER;
MediaType: TMediaType;
TracksPerCylinder: DWORD;
SectorsPerTrack: DWORD;
BytesPerSector: DWORD;
end;
DISK_GEOMETRY = TDiskGeometry;
PDiskGeometry = ^TDiskGeometry;
TDiskControllerNumber = record
ControllerNumber: DWORD;
DiskNumber: DWORD;
end;
DISK_CONTROLLER_NUMBER = TDiskControllerNumber;
PDiskControllerNumber = ^TDiskControllerNumber;
TScsiPassThrough = record
Length : Word;
ScsiStatus : Byte;
PathId : Byte;
TargetId : Byte;
Lun : Byte;
CdbLength : Byte;
SenseInfoLength : Byte;
DataIn : Byte;
DataTransferLength : ULONG;
TimeOutValue : ULONG;
DataBufferOffset : DWORD;
SenseInfoOffset : ULONG;
Cdb : Array[0..15] of Byte;
end;
TScsiPassThroughWithBuffers = record
spt : TScsiPassThrough;
bSenseBuf : Array[0..31] of Byte;
bDataBuf : Array[0..191] of Byte;
end;
TCDB6GENERIC = record
OperationCode: Byte;
Immediate: Byte;
CommandUniqueBits: Byte;
LogicalUnitNumber: Byte;
CommandUniqueBytes: array[0..2] of Byte;
Link: Byte;
Flag: Byte;
Reserved: Byte;
VendorUnique: Byte;
end;
const
// Valid values for the bCommandReg member of IDEREGS.
IDE_ATAPI_IDENTIFY = $A1; // Returns ID sector for ATAPI.
IDE_ATA_IDENTIFY = $EC; // Returns ID sector for ATA.
IDENTIFY_BUFFER_SIZE = 512;
DFP_GET_VERSION = $00074080;
DFP_SEND_DRIVE_COMMAND = $0007c084;
DFP_RECEIVE_DRIVE_DATA = $0007c088;
METHOD_BUFFERED = 0;
FILE_DEVICE_UNKNOWN = $00000022;
FILE_DEVICE_SCSI = $0000001B;
FILE_DEVICE_DISK = $00000007;
FILE_DEVICE_FILE_SYSTEM = $00000009;
FILE_DEVICE_CONTROLLER = $00000004;
FILE_ANY_ACCESS = 0;
FILE_SPECIAL_ACCESS = FILE_ANY_ACCESS;
FILE_READ_ACCESS = $0001; // file & pipe
FILE_WRITE_ACCESS = $0002; // file & pipe
SCSI_IOCTL_DATA_OUT = 0;
SCSI_IOCTL_DATA_IN = 1;
SCSI_IOCTL_DATA_UNSPECIFIED = 2;
CDB_INQUIRY_EVPD = 1;
SCSIOP_INQUIRY = $12;
CDB6GENERIC_LENGTH = 6;
IOCTL_SCSI_BASE = FILE_DEVICE_CONTROLLER;
IOCTL_SCSI_MINIPORT_IDENTIFY = ((FILE_DEVICE_SCSI shl 16) + $0501); //$001b0501
IOCTL_SCSI_MINIPORT = ((IOCTL_SCSI_BASE shl 16) or ($0402 shl 2) or METHOD_BUFFERED or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14));
IOCTL_SCSI_PASS_THROUGH = ((IOCTL_SCSI_BASE shl 16) or ($0401 shl 2) or METHOD_BUFFERED or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14));
IOCTL_SCSI_GET_INQUIRY_DATA = ((IOCTL_SCSI_BASE shl 16) or ($0403 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14));
IOCTL_SCSI_GET_CAPABILITIES = ((IOCTL_SCSI_BASE shl 16) or ($0404 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14));
IOCTL_SCSI_PASS_THROUGH_DIRECT = ((IOCTL_SCSI_BASE shl 16) or ($0405 shl 2) or METHOD_BUFFERED or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14));
IOCTL_SCSI_GET_ADDRESS = ((IOCTL_SCSI_BASE shl 16) or ($0406 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14));
IOCTL_SCSI_RESCAN_BUS = ((IOCTL_SCSI_BASE shl 16) or ($0407 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14));
IOCTL_SCSI_GET_DUMP_POINTERS = ((IOCTL_SCSI_BASE shl 16) or ($0408 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14));
IOCTL_DISK_BASE = FILE_DEVICE_DISK;
IOCTL_DISK_GET_DRIVE_GEOMETRY = (
(IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
($0000 shl 2) or METHOD_BUFFERED);
IOCTL_DISK_GET_PARTITION_INFO = (
(IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
($0001 shl 2) or METHOD_BUFFERED);
IOCTL_DISK_GET_DRIVE_LAYOUT = (
(IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
($0003 shl 2) or METHOD_BUFFERED);
IOCTL_VOLUME_BASE = DWORD('V');
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = (
(IOCTL_VOLUME_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
(0 shl 2) or METHOD_BUFFERED);
IOCTL_DISK_CONTROLLER_NUMBER = (
(IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
($0011 shl 2) or METHOD_BUFFERED);
FSCTL_LOCK_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (6 shl 2) or METHOD_BUFFERED);
FSCTL_UNLOCK_VOLUME = (
(FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or
(7 shl 2) or METHOD_BUFFERED);
VWIN32_DIOC_DOS_IOCTL21 = 1; // INT 21h - 4400h, 4411h
VWIN32_DIOC_DOS_IOCTL25 = 2; // INT 25h - Disk Read
VWIN32_DIOC_DOS_IOCTL26 = 3; // INT 26h - Disk Write
VWIN32_DIOC_DOS_IOCTL13 = 4; // INT 13h
VWIN32_DIOC_DOS_DRIVEINFO = 6; // INT 21h - Function 730X commands
// Bits returned in the fCapabilities member of GETVERSIONOUTPARAMS
CAP_IDE_ID_FUNCTION = 1; // ATA ID command supported
CAP_IDE_ATAPI_ID = 2; // ATAPI ID command supported
CAP_IDE_EXECUTE_SMART_FUNCTION = 4; // SMART commannds supported
DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
PARTITION_ENTRY_UNUSED = $00; // Entry unused
PARTITION_FAT_12 = $01; // 12-bit FAT entries
PARTITION_XENIX_1 = $02; // Xenix
PARTITION_XENIX_2 = $03; // Xenix
PARTITION_FAT_16 = $04; // 16-bit FAT entries
PARTITION_EXTENDED = $05; // Extended partition entry
PARTITION_HUGE = $06; // Huge partition MS-DOS V4
PARTITION_IFS = $07; // IFS Partition
PARTITION_OS2BOOTMGR = $0A; // OS/2 Boot Manager/OPUS/Coherent swap
PARTITION_FAT32 = $0B; // FAT32
PARTITION_FAT32_XINT13 = $0C; // FAT32 using extended int13 services
PARTITION_XINT13 = $0E; // Win95 partition using extended int13 services
PARTITION_XINT13_EXTENDED = $0F; // Same as type 5 but uses extended int13 services
PARTITION_PREP = $41; // PowerPC Reference Platform (PReP) Boot Partition
PARTITION_LDM = $42; // Logical Disk Manager partition
PARTITION_UNIX = $63; // Unix
VALID_NTFT = $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.
PARTITION_NTFT = $80; // NTFT partition
bBytesPerSector = 512;
type
TDiskLayout = array of TPartitionInformation;
TDriveInfo = record
SerialNumber,
Model,
Revision: string;
Capacity: Int64;
end;
function IsRecognizedPartition(PartitionType: DWORD): Boolean;
function IsContainerPartition(PartitionType: DWORD): Boolean;
function IsFTPartition(PartitionType: DWORD): Boolean;
function GetPartitionSystem(PartitionType: DWORD): string;
function GetPartitionType(PartitionNumber,PartitionType: DWORD): string;
function GetMediaTypeStr(Value: TMediaType): string;
function GetDeviceHandle(sDeviceName: string): THandle;
function GetSCSIDeviceInfo(DeviceHandle: THandle; out DI: TDriveInfo): integer;
function GetSCSIDiskInfo(DeviceHandle: THandle; DeviceNumber: Byte; out DI: TDriveInfo; out DG: TDiskGeometry): Integer;
function GetPhysicalDiskInfo(DeviceHandle: THandle; out DI: TDriveInfo; out DG: TDiskGeometry): Integer;
function GetSMARTDiskInfo(Drive: Byte; out DI: TDriveInfo; out DG: TDiskGeometry): Integer;
function GetDiskGeometry(DeviceHandle: THandle; out DG: TDiskGeometry): Integer;
function GetDiskLayout(DeviceHandle: THandle; out DL: TDiskLayout): Integer;
function GetDiskController(Drive: Byte; out DC: TDiskControllerNumber): Integer;
function ReadPhysicalSector(Drive: Byte; StartSector: DWORD; SectorsToRead: byte; Dump: Pointer): Integer;
implementation