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 >
Pascal/Delphi Source File  |  2001-09-25  |  9KB  |  230 lines

  1. unit DriveWorksEx;
  2.  
  3. interface
  4.  
  5. uses Windows;
  6.  
  7. type
  8.   MEDIA_TYPE = (
  9.     Unknown,
  10.     F5_1Pt2_512,
  11.     F3_1Pt44_512,
  12.     F3_2Pt88_512,
  13.     F3_20Pt8_512,
  14.     F3_720_512,
  15.     F5_360_512,
  16.     F5_320_512,
  17.     F5_320_1024,
  18.     F5_180_512,
  19.     F5_160_512,
  20.     RemovableMedia,
  21.     FixedMedia,
  22.     F3_120M_512,
  23.     F3_640_512,
  24.     F5_640_512,
  25.     F5_720_512,
  26.     F3_1Pt2_512,
  27.     F3_1Pt23_1024,
  28.     F5_1Pt23_1024,
  29.     F3_128Mb_512,
  30.     F3_230Mb_512,
  31.     F8_256_128,
  32.     F3_200Mb_512
  33.     );
  34.  
  35.   DISK_GEOMETRY = record
  36.     Cylinders: int64;
  37.     MediaType: MEDIA_TYPE;
  38.     TracksPerCylinder,
  39.       SectorsPerTrack,
  40.       BytesPerSector: LongWord;
  41.   end;
  42.  
  43.   DISK_PERFORMANCE = record
  44.     BytesRead,
  45.     BytesWritten,
  46.     ReadTime,
  47.     WriteTime: Int64;
  48.     ReadCount,
  49.     WriteCount,
  50.     QueueDepth: DWord;
  51.   end;
  52.  
  53.   PARTITION_INFORMATION = record
  54.     StartingOffset,
  55.     PartitionLength: Int64;
  56.     HiddenSectors,
  57.     PartitionNumber: DWord;
  58.     PartitionType: Byte;
  59.     BootIndicator,
  60.     RecognizedPartition,
  61.     RewritePartition: Boolean;
  62.   end;
  63.  
  64.   DRIVE_LAYOUT_INFORMATION = record
  65.     PartitionCount,
  66.     Signature: DWord;
  67.     PartitionEntry: Array of PARTITION_INFORMATION;
  68.   end;
  69.  
  70.   REASSIGN_BLOCKS = record
  71.     Reserved,
  72.     Count: DWord;
  73.     BlockNumber: Array of DWord;
  74.   end;
  75.  
  76.   PREVENT_MEDIA_REMOVAL = record
  77.     PreventMediaRemoval: Boolean;
  78.   end;
  79.  
  80.   VERIFY_INFORMATION = record
  81.     StartingOffset: Int64;
  82.     Length: DWord;
  83.   end;
  84.  
  85.   TCtlCode = array[0..3] of integer;
  86.  
  87. const
  88.   METHOD_BUFFERED = 0;
  89.   METHOD_IN_DIRECT = 1;
  90.   METHOD_OUT_DIRECT = 2;
  91.   METHOD_NEITHER = 3;
  92.   FILE_DEVICE_BEEP = $00000001;
  93.   FILE_DEVICE_CD_ROM = $00000002;
  94.   FILE_DEVICE_CD_ROM_FILE_SYSTEM = $00000003;
  95.   FILE_DEVICE_CONTROLLER = $00000004;
  96.   FILE_DEVICE_DATALINK = $00000005;
  97.   FILE_DEVICE_DFS = $00000006;
  98.   FILE_DEVICE_DISK = $00000007;
  99.   FILE_DEVICE_DISK_FILE_SYSTEM = $00000008;
  100.   FILE_DEVICE_FILE_SYSTEM = $00000009;
  101.   FILE_DEVICE_INPORT_PORT = $0000000A;
  102.   FILE_DEVICE_KEYBOARD = $0000000B;
  103.   FILE_DEVICE_MAILSLOT = $0000000C;
  104.   FILE_DEVICE_MIDI_IN = $0000000D;
  105.   FILE_DEVICE_MIDI_OUT = $0000000E;
  106.   FILE_DEVICE_MOUSE = $0000000F;
  107.   FILE_DEVICE_MULTI_UNC_PROVIDER = $00000010;
  108.   FILE_DEVICE_NAMED_PIPE = $00000011;
  109.   FILE_DEVICE_NETWORK = $00000012;
  110.   FILE_DEVICE_NETWORK_BROWSER = $00000013;
  111.   FILE_DEVICE_NETWORK_FILE_SYSTEM = $00000014;
  112.   FILE_DEVICE_NULL = $00000015;
  113.   FILE_DEVICE_PARALLEL_PORT = $00000016;
  114.   FILE_DEVICE_PHYSICAL_NETCARD = $00000017;
  115.   FILE_DEVICE_PRINTER = $00000018;
  116.   FILE_DEVICE_SCANNER = $00000019;
  117.   FILE_DEVICE_SERIAL_MOUSE_PORT = $0000001A;
  118.   FILE_DEVICE_SERIAL_PORT = $0000001B;
  119.   FILE_DEVICE_SCREEN = $0000001C;
  120.   FILE_DEVICE_SOUND = $0000001D;
  121.   FILE_DEVICE_STREAMS = $0000001E;
  122.   FILE_DEVICE_TAPE = $0000001F;
  123.   FILE_DEVICE_TAPE_FILE_SYSTEM = $00000020;
  124.   FILE_DEVICE_TRANSPORT = $00000021;
  125.   FILE_DEVICE_UNKNOWN = $00000022;
  126.   FILE_DEVICE_VIDEO = $00000023;
  127.   FILE_DEVICE_VIRTUAL_DISK = $00000024;
  128.   FILE_DEVICE_WAVE_IN = $00000025;
  129.   FILE_DEVICE_WAVE_OUT = $00000026;
  130.   FILE_DEVICE_8042_PORT = $00000027;
  131.   FILE_DEVICE_NETWORK_REDIRECTOR = $00000028;
  132.   FILE_DEVICE_BATTERY = $00000029;
  133.   FILE_DEVICE_BUS_EXTENDER = $0000002A;
  134.   FILE_DEVICE_MODEM = $0000002B;
  135.   FILE_DEVICE_VDM = $0000002C;
  136.   FILE_DEVICE_MASS_STORAGE = $0000002D;
  137.   FILE_DEVICE_SMB = $0000002E;
  138.   FILE_DEVICE_KS = $0000002F;
  139.   FILE_DEVICE_CHANGER = $00000030;
  140.   FILE_DEVICE_SMARTCARD = $00000031;
  141.   FILE_DEVICE_ACPI = $00000032;
  142.   FILE_DEVICE_DVD = $00000033;
  143.   FILE_DEVICE_FULLSCREEN_VIDEO = $00000034;
  144.   FILE_DEVICE_DFS_FILE_SYSTEM = $00000035;
  145.   FILE_DEVICE_DFS_VOLUME = $00000036;
  146.   FILE_DEVICE_SERENUM = $00000037;
  147.   FILE_DEVICE_TERMSRV = $00000038;
  148.   FILE_DEVICE_KSEC = $00000039;
  149.   FILE_ANY_ACCESS = 0;
  150.   FILE_SPECIAL_ACCESS = FILE_ANY_ACCESS;
  151.   FILE_READ_ACCESS = $0001;
  152.   FILE_WRITE_ACCESS = $0002;
  153.   IOCTL_DISK_BASE = FILE_DEVICE_DISK;
  154.   IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;
  155.  
  156. var
  157.   IOCTL_DISK_GET_DRIVE_GEOMETRY: TCtlCode = (IOCTL_DISK_BASE, $0000, METHOD_BUFFERED, FILE_ANY_ACCESS);
  158.   IOCTL_DISK_GET_PARTITION_INFO: TCtlCode = (IOCTL_DISK_BASE, $0001, METHOD_BUFFERED, FILE_READ_ACCESS);
  159.   IOCTL_DISK_SET_PARTITION_INFO: TCtlCode = (IOCTL_DISK_BASE, $0002, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
  160.   IOCTL_DISK_GET_DRIVE_LAYOUT: TCtlCode = (IOCTL_DISK_BASE, $0003, METHOD_BUFFERED, FILE_READ_ACCESS);
  161.   IOCTL_DISK_SET_DRIVE_LAYOUT: TCtlCode = (IOCTL_DISK_BASE, $0004, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
  162.   IOCTL_DISK_VERIFY: TCtlCode = (IOCTL_DISK_BASE, $0005, METHOD_BUFFERED, FILE_ANY_ACCESS);
  163.   IOCTL_DISK_FORMAT_TRACKS: TCtlCode = (IOCTL_DISK_BASE, $0006, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
  164.   IOCTL_DISK_REASSIGN_BLOCKS: TCtlCode = (IOCTL_DISK_BASE, $0007, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
  165.   IOCTL_DISK_PERFORMANCE: TCtlCode = (IOCTL_DISK_BASE, $0008, METHOD_BUFFERED, FILE_ANY_ACCESS);
  166.   IOCTL_DISK_IS_WRITABLE: TCtlCode = (IOCTL_DISK_BASE, $0009, METHOD_BUFFERED, FILE_ANY_ACCESS);
  167.   IOCTL_DISK_LOGGING: TCtlCode = (IOCTL_DISK_BASE, $000A, METHOD_BUFFERED, FILE_ANY_ACCESS);
  168.   IOCTL_DISK_FORMAT_TRACKS_EX: TCtlCode = (IOCTL_DISK_BASE, $000B, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
  169.   IOCTL_DISK_HISTOGRAM_STRUCTURE: TCtlCode = (IOCTL_DISK_BASE, $000C, METHOD_BUFFERED, FILE_ANY_ACCESS);
  170.   IOCTL_DISK_HISTOGRAM_DATA: TCtlCode = (IOCTL_DISK_BASE, $000D, METHOD_BUFFERED, FILE_ANY_ACCESS);
  171.   IOCTL_DISK_HISTOGRAM_RESET: TCtlCode = (IOCTL_DISK_BASE, $000E, METHOD_BUFFERED, FILE_ANY_ACCESS);
  172.   IOCTL_DISK_REQUEST_STRUCTURE: TCtlCode = (IOCTL_DISK_BASE, $000F, METHOD_BUFFERED, FILE_ANY_ACCESS);
  173.   IOCTL_DISK_REQUEST_DATA: TCtlCode = (IOCTL_DISK_BASE, $0010, METHOD_BUFFERED, FILE_ANY_ACCESS);
  174.   IOCTL_DISK_CONTROLLER_NUMBER: TCtlCode = (IOCTL_DISK_BASE, $0011, METHOD_BUFFERED, FILE_ANY_ACCESS);
  175.   IOCTL_STORAGE_CHECK_VERIFY: TCtlCode = (IOCTL_STORAGE_BASE, $0200, METHOD_BUFFERED, FILE_READ_ACCESS);
  176.   IOCTL_STORAGE_CHECK_VERIFY2: TCtlCode = (IOCTL_STORAGE_BASE, $0200, METHOD_BUFFERED, FILE_ANY_ACCESS);
  177.   IOCTL_STORAGE_MEDIA_REMOVAL: TCtlCode = (IOCTL_STORAGE_BASE, $0201, METHOD_BUFFERED, FILE_READ_ACCESS);
  178.   IOCTL_STORAGE_EJECT_MEDIA: TCtlCode = (IOCTL_STORAGE_BASE, $0202, METHOD_BUFFERED, FILE_READ_ACCESS);
  179.   IOCTL_STORAGE_LOAD_MEDIA: TCtlCode = (IOCTL_STORAGE_BASE, $0203, METHOD_BUFFERED, FILE_READ_ACCESS);
  180.   IOCTL_STORAGE_LOAD_MEDIA2: TCtlCode = (IOCTL_STORAGE_BASE, $0203, METHOD_BUFFERED, FILE_ANY_ACCESS);
  181.   IOCTL_STORAGE_RESERVE: TCtlCode = (IOCTL_STORAGE_BASE, $0204, METHOD_BUFFERED, FILE_READ_ACCESS);
  182.   IOCTL_STORAGE_RELEASE: TCtlCode = (IOCTL_STORAGE_BASE, $0205, METHOD_BUFFERED, FILE_READ_ACCESS);
  183.   IOCTL_STORAGE_FIND_NEW_DEVICES: TCtlCode = (IOCTL_STORAGE_BASE, $0206, METHOD_BUFFERED, FILE_READ_ACCESS);
  184.   IOCTL_STORAGE_EJECTION_CONTROL: TCtlCode = (IOCTL_STORAGE_BASE, $0250, METHOD_BUFFERED, FILE_ANY_ACCESS);
  185.   IOCTL_STORAGE_MCN_CONTROL: TCtlCode = (IOCTL_STORAGE_BASE, $0251, METHOD_BUFFERED, FILE_ANY_ACCESS);
  186.   IOCTL_STORAGE_GET_MEDIA_TYPES: TCtlCode = (IOCTL_STORAGE_BASE, $0300, METHOD_BUFFERED, FILE_ANY_ACCESS);
  187.   IOCTL_STORAGE_GET_MEDIA_TYPES_EX: TCtlCode = (IOCTL_STORAGE_BASE, $0301, METHOD_BUFFERED, FILE_ANY_ACCESS);
  188.   IOCTL_STORAGE_RESET_BUS: TCtlCode = (IOCTL_STORAGE_BASE, $0400, METHOD_BUFFERED, FILE_READ_ACCESS);
  189.   IOCTL_STORAGE_RESET_DEVICE: TCtlCode = (IOCTL_STORAGE_BASE, $0401, METHOD_BUFFERED, FILE_READ_ACCESS);
  190.   IOCTL_STORAGE_GET_DEVICE_NUMBER: TCtlCode = (IOCTL_STORAGE_BASE, $0420, METHOD_BUFFERED, FILE_ANY_ACCESS);
  191.   IOCTL_STORAGE_PREDICT_FAILURE: TCtlCode = (IOCTL_STORAGE_BASE, $0440, METHOD_BUFFERED, FILE_ANY_ACCESS);
  192.  
  193.   function CTL_CODE(inp: TCtlCode): Cardinal;
  194.   function DEVICE_TYPE_FROM_CTL_CODE(ctrlCode: Cardinal): Cardinal;
  195.   function GetDriveGeometry(var dg: DISK_GEOMETRY): boolean;
  196.  
  197. implementation
  198.  
  199. function CTL_CODE(inp: TCtlCode): Cardinal;
  200. begin
  201.   result := (inp[0] shl 16) or (inp[3] shl 14) or (inp[1] shl 2) or inp[2];
  202. end;
  203.  
  204. function DEVICE_TYPE_FROM_CTL_CODE(ctrlCode: Cardinal): Cardinal;
  205. begin
  206.   result := (ctrlCode and $FFFF0000) shr 16;
  207. end;
  208.  
  209. function GetDriveGeometry(var dg: DISK_GEOMETRY): boolean;
  210. var
  211.   hDevice: Cardinal;
  212.   junk: LongWord;
  213. begin
  214.   result := false;
  215.   hDevice := CreateFile('\\.\A:', 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  216.   case hDevice of
  217.     INVALID_HANDLE_VALUE: exit;
  218.   else
  219.     begin
  220.       case DeviceIoControl(hDevice, CTL_CODE(IOCTL_DISK_GET_DRIVE_GEOMETRY), nil, 0, @dg, sizeof(dg), junk, nil) of
  221.         FALSE: exit;
  222.       end;
  223.       CloseHandle(hDevice);
  224.       result := true;
  225.     end;
  226.   end;
  227. end;
  228.  
  229. end.
  230.