home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 November
/
Chip_2002-11_cd1.bin
/
zkuste
/
delphi
/
unity
/
d56
/
DW
/
DW10242.ZIP
/
DriveWorksEx.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-09-25
|
9KB
|
230 lines
unit DriveWorksEx;
interface
uses Windows;
type
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
);
DISK_GEOMETRY = record
Cylinders: int64;
MediaType: MEDIA_TYPE;
TracksPerCylinder,
SectorsPerTrack,
BytesPerSector: LongWord;
end;
DISK_PERFORMANCE = record
BytesRead,
BytesWritten,
ReadTime,
WriteTime: Int64;
ReadCount,
WriteCount,
QueueDepth: DWord;
end;
PARTITION_INFORMATION = record
StartingOffset,
PartitionLength: Int64;
HiddenSectors,
PartitionNumber: DWord;
PartitionType: Byte;
BootIndicator,
RecognizedPartition,
RewritePartition: Boolean;
end;
DRIVE_LAYOUT_INFORMATION = record
PartitionCount,
Signature: DWord;
PartitionEntry: Array of PARTITION_INFORMATION;
end;
REASSIGN_BLOCKS = record
Reserved,
Count: DWord;
BlockNumber: Array of DWord;
end;
PREVENT_MEDIA_REMOVAL = record
PreventMediaRemoval: Boolean;
end;
VERIFY_INFORMATION = record
StartingOffset: Int64;
Length: DWord;
end;
TCtlCode = array[0..3] of integer;
const
METHOD_BUFFERED = 0;
METHOD_IN_DIRECT = 1;
METHOD_OUT_DIRECT = 2;
METHOD_NEITHER = 3;
FILE_DEVICE_BEEP = $00000001;
FILE_DEVICE_CD_ROM = $00000002;
FILE_DEVICE_CD_ROM_FILE_SYSTEM = $00000003;
FILE_DEVICE_CONTROLLER = $00000004;
FILE_DEVICE_DATALINK = $00000005;
FILE_DEVICE_DFS = $00000006;
FILE_DEVICE_DISK = $00000007;
FILE_DEVICE_DISK_FILE_SYSTEM = $00000008;
FILE_DEVICE_FILE_SYSTEM = $00000009;
FILE_DEVICE_INPORT_PORT = $0000000A;
FILE_DEVICE_KEYBOARD = $0000000B;
FILE_DEVICE_MAILSLOT = $0000000C;
FILE_DEVICE_MIDI_IN = $0000000D;
FILE_DEVICE_MIDI_OUT = $0000000E;
FILE_DEVICE_MOUSE = $0000000F;
FILE_DEVICE_MULTI_UNC_PROVIDER = $00000010;
FILE_DEVICE_NAMED_PIPE = $00000011;
FILE_DEVICE_NETWORK = $00000012;
FILE_DEVICE_NETWORK_BROWSER = $00000013;
FILE_DEVICE_NETWORK_FILE_SYSTEM = $00000014;
FILE_DEVICE_NULL = $00000015;
FILE_DEVICE_PARALLEL_PORT = $00000016;
FILE_DEVICE_PHYSICAL_NETCARD = $00000017;
FILE_DEVICE_PRINTER = $00000018;
FILE_DEVICE_SCANNER = $00000019;
FILE_DEVICE_SERIAL_MOUSE_PORT = $0000001A;
FILE_DEVICE_SERIAL_PORT = $0000001B;
FILE_DEVICE_SCREEN = $0000001C;
FILE_DEVICE_SOUND = $0000001D;
FILE_DEVICE_STREAMS = $0000001E;
FILE_DEVICE_TAPE = $0000001F;
FILE_DEVICE_TAPE_FILE_SYSTEM = $00000020;
FILE_DEVICE_TRANSPORT = $00000021;
FILE_DEVICE_UNKNOWN = $00000022;
FILE_DEVICE_VIDEO = $00000023;
FILE_DEVICE_VIRTUAL_DISK = $00000024;
FILE_DEVICE_WAVE_IN = $00000025;
FILE_DEVICE_WAVE_OUT = $00000026;
FILE_DEVICE_8042_PORT = $00000027;
FILE_DEVICE_NETWORK_REDIRECTOR = $00000028;
FILE_DEVICE_BATTERY = $00000029;
FILE_DEVICE_BUS_EXTENDER = $0000002A;
FILE_DEVICE_MODEM = $0000002B;
FILE_DEVICE_VDM = $0000002C;
FILE_DEVICE_MASS_STORAGE = $0000002D;
FILE_DEVICE_SMB = $0000002E;
FILE_DEVICE_KS = $0000002F;
FILE_DEVICE_CHANGER = $00000030;
FILE_DEVICE_SMARTCARD = $00000031;
FILE_DEVICE_ACPI = $00000032;
FILE_DEVICE_DVD = $00000033;
FILE_DEVICE_FULLSCREEN_VIDEO = $00000034;
FILE_DEVICE_DFS_FILE_SYSTEM = $00000035;
FILE_DEVICE_DFS_VOLUME = $00000036;
FILE_DEVICE_SERENUM = $00000037;
FILE_DEVICE_TERMSRV = $00000038;
FILE_DEVICE_KSEC = $00000039;
FILE_ANY_ACCESS = 0;
FILE_SPECIAL_ACCESS = FILE_ANY_ACCESS;
FILE_READ_ACCESS = $0001;
FILE_WRITE_ACCESS = $0002;
IOCTL_DISK_BASE = FILE_DEVICE_DISK;
IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;
var
IOCTL_DISK_GET_DRIVE_GEOMETRY: TCtlCode = (IOCTL_DISK_BASE, $0000, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_GET_PARTITION_INFO: TCtlCode = (IOCTL_DISK_BASE, $0001, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_DISK_SET_PARTITION_INFO: TCtlCode = (IOCTL_DISK_BASE, $0002, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
IOCTL_DISK_GET_DRIVE_LAYOUT: TCtlCode = (IOCTL_DISK_BASE, $0003, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_DISK_SET_DRIVE_LAYOUT: TCtlCode = (IOCTL_DISK_BASE, $0004, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
IOCTL_DISK_VERIFY: TCtlCode = (IOCTL_DISK_BASE, $0005, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_FORMAT_TRACKS: TCtlCode = (IOCTL_DISK_BASE, $0006, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
IOCTL_DISK_REASSIGN_BLOCKS: TCtlCode = (IOCTL_DISK_BASE, $0007, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
IOCTL_DISK_PERFORMANCE: TCtlCode = (IOCTL_DISK_BASE, $0008, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_IS_WRITABLE: TCtlCode = (IOCTL_DISK_BASE, $0009, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_LOGGING: TCtlCode = (IOCTL_DISK_BASE, $000A, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_FORMAT_TRACKS_EX: TCtlCode = (IOCTL_DISK_BASE, $000B, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
IOCTL_DISK_HISTOGRAM_STRUCTURE: TCtlCode = (IOCTL_DISK_BASE, $000C, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_HISTOGRAM_DATA: TCtlCode = (IOCTL_DISK_BASE, $000D, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_HISTOGRAM_RESET: TCtlCode = (IOCTL_DISK_BASE, $000E, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_REQUEST_STRUCTURE: TCtlCode = (IOCTL_DISK_BASE, $000F, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_REQUEST_DATA: TCtlCode = (IOCTL_DISK_BASE, $0010, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_DISK_CONTROLLER_NUMBER: TCtlCode = (IOCTL_DISK_BASE, $0011, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_STORAGE_CHECK_VERIFY: TCtlCode = (IOCTL_STORAGE_BASE, $0200, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_CHECK_VERIFY2: TCtlCode = (IOCTL_STORAGE_BASE, $0200, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_STORAGE_MEDIA_REMOVAL: TCtlCode = (IOCTL_STORAGE_BASE, $0201, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_EJECT_MEDIA: TCtlCode = (IOCTL_STORAGE_BASE, $0202, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_LOAD_MEDIA: TCtlCode = (IOCTL_STORAGE_BASE, $0203, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_LOAD_MEDIA2: TCtlCode = (IOCTL_STORAGE_BASE, $0203, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_STORAGE_RESERVE: TCtlCode = (IOCTL_STORAGE_BASE, $0204, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_RELEASE: TCtlCode = (IOCTL_STORAGE_BASE, $0205, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_FIND_NEW_DEVICES: TCtlCode = (IOCTL_STORAGE_BASE, $0206, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_EJECTION_CONTROL: TCtlCode = (IOCTL_STORAGE_BASE, $0250, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_STORAGE_MCN_CONTROL: TCtlCode = (IOCTL_STORAGE_BASE, $0251, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_STORAGE_GET_MEDIA_TYPES: TCtlCode = (IOCTL_STORAGE_BASE, $0300, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_STORAGE_GET_MEDIA_TYPES_EX: TCtlCode = (IOCTL_STORAGE_BASE, $0301, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_STORAGE_RESET_BUS: TCtlCode = (IOCTL_STORAGE_BASE, $0400, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_RESET_DEVICE: TCtlCode = (IOCTL_STORAGE_BASE, $0401, METHOD_BUFFERED, FILE_READ_ACCESS);
IOCTL_STORAGE_GET_DEVICE_NUMBER: TCtlCode = (IOCTL_STORAGE_BASE, $0420, METHOD_BUFFERED, FILE_ANY_ACCESS);
IOCTL_STORAGE_PREDICT_FAILURE: TCtlCode = (IOCTL_STORAGE_BASE, $0440, METHOD_BUFFERED, FILE_ANY_ACCESS);
function CTL_CODE(inp: TCtlCode): Cardinal;
function DEVICE_TYPE_FROM_CTL_CODE(ctrlCode: Cardinal): Cardinal;
function GetDriveGeometry(var dg: DISK_GEOMETRY): boolean;
implementation
function CTL_CODE(inp: TCtlCode): Cardinal;
begin
result := (inp[0] shl 16) or (inp[3] shl 14) or (inp[1] shl 2) or inp[2];
end;
function DEVICE_TYPE_FROM_CTL_CODE(ctrlCode: Cardinal): Cardinal;
begin
result := (ctrlCode and $FFFF0000) shr 16;
end;
function GetDriveGeometry(var dg: DISK_GEOMETRY): boolean;
var
hDevice: Cardinal;
junk: LongWord;
begin
result := false;
hDevice := CreateFile('\\.\A:', 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
case hDevice of
INVALID_HANDLE_VALUE: exit;
else
begin
case DeviceIoControl(hDevice, CTL_CODE(IOCTL_DISK_GET_DRIVE_GEOMETRY), nil, 0, @dg, sizeof(dg), junk, nil) of
FALSE: exit;
end;
CloseHandle(hDevice);
result := true;
end;
end;
end;
end.