JwaWinIoctl.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:173k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { I/O Control Codes API interface Unit for Object Pascal                       }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: winioctl.h, released June 2000. The original Pascal    }
  9. { code is: WinIoCtl.pas, released December 2000. The initial developer of the  }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaWinIoctl;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "WinIoCtl.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinNT, JwaWinType;
  52. //
  53. // Device interface class GUIDs.
  54. //
  55. // need these GUIDs outside conditional includes so that user can
  56. //   #include <winioctl.h> in precompiled header
  57. //   #include <initguid.h> in a single source file
  58. //   #include <winioctl.h> in that source file a second time to instantiate the GUIDs
  59. //
  60. const
  61.   GUID_DEVINTERFACE_DISK: TGUID = (
  62.     D1:$53f56307; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  63.   {$EXTERNALSYM GUID_DEVINTERFACE_DISK}
  64.   GUID_DEVINTERFACE_CDROM: TGUID = (
  65.     D1:$53f56308; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  66.   {$EXTERNALSYM GUID_DEVINTERFACE_CDROM}
  67.   GUID_DEVINTERFACE_PARTITION: TGUID = (
  68.     D1:$53f5630a; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  69.   {$EXTERNALSYM GUID_DEVINTERFACE_PARTITION}
  70.   GUID_DEVINTERFACE_TAPE: TGUID = (
  71.     D1:$53f5630b; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  72.   {$EXTERNALSYM GUID_DEVINTERFACE_TAPE}
  73.   GUID_DEVINTERFACE_WRITEONCEDISK: TGUID = (
  74.     D1:$53f5630c; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  75.   {$EXTERNALSYM GUID_DEVINTERFACE_WRITEONCEDISK}
  76.   GUID_DEVINTERFACE_VOLUME: TGUID = (
  77.     D1:$53f5630d; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  78.   {$EXTERNALSYM GUID_DEVINTERFACE_VOLUME}
  79.   GUID_DEVINTERFACE_MEDIUMCHANGER: TGUID = (
  80.     D1:$53f56310; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  81.   {$EXTERNALSYM GUID_DEVINTERFACE_MEDIUMCHANGER}
  82.   GUID_DEVINTERFACE_FLOPPY: TGUID = (
  83.     D1:$53f56311; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  84.   {$EXTERNALSYM GUID_DEVINTERFACE_FLOPPY}
  85.   GUID_DEVINTERFACE_CDCHANGER: TGUID = (
  86.     D1:$53f56312; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  87.   {$EXTERNALSYM GUID_DEVINTERFACE_CDCHANGER}
  88.   GUID_DEVINTERFACE_STORAGEPORT: TGUID = (
  89.     D1:$2accfe60; D2:$c130; D3:$11d2; D4:($b0, $82, $00, $a0, $c9, $1e, $fb, $8b));
  90.   {$EXTERNALSYM GUID_DEVINTERFACE_STORAGEPORT}
  91.   GUID_DEVINTERFACE_COMPORT: TGUID = (
  92.     D1:$86e0d1e0; D2:$8089; D3:$11d0; D4:($9c, $e4, $08, $00, $3e, $30, $1f, $73));
  93.   {$EXTERNALSYM GUID_DEVINTERFACE_COMPORT}
  94.   GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR: TGUID = (
  95.     D1:$4D36E978; D2:$E325; D3:$11CE; D4:($BF, $C1, $08, $00, $2B, $E1, $03, $18));
  96.   {$EXTERNALSYM GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR}
  97. //
  98. // Obsolete device interface class GUID names.
  99. // (use of above GUID_DEVINTERFACE_* names is recommended).
  100. //
  101.   // MVB: Note that these "constants" are in reality aliases for the list above. Unfortunately you can't
  102.   // define a GUID without using a type constant and you can't alias a type constant in Delphi...
  103.   DiskClassGuid: TGUID = (
  104.     D1:$53f56307; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  105.   {$EXTERNALSYM DiskClassGuid}
  106.   CdRomClassGuid: TGUID = (
  107.     D1:$53f56308; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  108.   {$EXTERNALSYM CdRomClassGuid}
  109.   PartitionClassGuid: TGUID = (
  110.     D1:$53f5630a; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  111.   {$EXTERNALSYM PartitionClassGuid}
  112.   TapeClassGuid: TGUID = (
  113.     D1:$53f5630b; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  114.   {$EXTERNALSYM TapeClassGuid}
  115.   WriteOnceDiskClassGuid: TGUID = (
  116.     D1:$53f5630c; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  117.   {$EXTERNALSYM WriteOnceDiskClassGuid}
  118.   VolumeClassGuid: TGUID = (
  119.     D1:$53f5630d; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  120.   {$EXTERNALSYM VolumeClassGuid}
  121.   MediumChangerClassGuid: TGUID = (
  122.     D1:$53f56310; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  123.   {$EXTERNALSYM MediumChangerClassGuid}
  124.   FloppyClassGuid: TGUID = (
  125.     D1:$53f56311; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  126.   {$EXTERNALSYM FloppyClassGuid}
  127.   CdChangerClassGuid: TGUID = (
  128.     D1:$53f56312; D2:$b6bf; D3:$11d0; D4:($94, $f2, $00, $a0, $c9, $1e, $fb, $8b));
  129.   {$EXTERNALSYM CdChangerClassGuid}
  130.   StoragePortClassGuid: TGUID = (
  131.     D1:$2accfe60; D2:$c130; D3:$11d2; D4:($b0, $82, $00, $a0, $c9, $1e, $fb, $8b));
  132.   {$EXTERNALSYM StoragePortClassGuid}
  133.   GUID_CLASS_COMPORT: TGUID = (
  134.     D1:$86e0d1e0; D2:$8089; D3:$11d0; D4:($9c, $e4, $08, $00, $3e, $30, $1f, $73));
  135.   {$EXTERNALSYM GUID_CLASS_COMPORT}
  136.   GUID_SERENUM_BUS_ENUMERATOR: TGUID = (
  137.     D1:$4D36E978; D2:$E325; D3:$11CE; D4:($BF, $C1, $08, $00, $2B, $E1, $03, $18));
  138.   {$EXTERNALSYM GUID_SERENUM_BUS_ENUMERATOR}
  139. //
  140. // Define the various device type values.  Note that values used by Microsoft
  141. // Corporation are in the range 0-32767, and 32768-65535 are reserved for use
  142. // by customers.
  143. //
  144. type
  145.   DEVICE_TYPE = DWORD;
  146.   {$EXTERNALSYM DEVICE_TYPE}
  147. const
  148.   FILE_DEVICE_BEEP                = $00000001;
  149.   {$EXTERNALSYM FILE_DEVICE_BEEP}
  150.   FILE_DEVICE_CD_ROM              = $00000002;
  151.   {$EXTERNALSYM FILE_DEVICE_CD_ROM}
  152.   FILE_DEVICE_CD_ROM_FILE_SYSTEM  = $00000003;
  153.   {$EXTERNALSYM FILE_DEVICE_CD_ROM_FILE_SYSTEM}
  154.   FILE_DEVICE_CONTROLLER          = $00000004;
  155.   {$EXTERNALSYM FILE_DEVICE_CONTROLLER}
  156.   FILE_DEVICE_DATALINK            = $00000005;
  157.   {$EXTERNALSYM FILE_DEVICE_DATALINK}
  158.   FILE_DEVICE_DFS                 = $00000006;
  159.   {$EXTERNALSYM FILE_DEVICE_DFS}
  160.   FILE_DEVICE_DISK                = $00000007;
  161.   {$EXTERNALSYM FILE_DEVICE_DISK}
  162.   FILE_DEVICE_DISK_FILE_SYSTEM    = $00000008;
  163.   {$EXTERNALSYM FILE_DEVICE_DISK_FILE_SYSTEM}
  164.   FILE_DEVICE_FILE_SYSTEM         = $00000009;
  165.   {$EXTERNALSYM FILE_DEVICE_FILE_SYSTEM}
  166.   FILE_DEVICE_INPORT_PORT         = $0000000a;
  167.   {$EXTERNALSYM FILE_DEVICE_INPORT_PORT}
  168.   FILE_DEVICE_KEYBOARD            = $0000000b;
  169.   {$EXTERNALSYM FILE_DEVICE_KEYBOARD}
  170.   FILE_DEVICE_MAILSLOT            = $0000000c;
  171.   {$EXTERNALSYM FILE_DEVICE_MAILSLOT}
  172.   FILE_DEVICE_MIDI_IN             = $0000000d;
  173.   {$EXTERNALSYM FILE_DEVICE_MIDI_IN}
  174.   FILE_DEVICE_MIDI_OUT            = $0000000e;
  175.   {$EXTERNALSYM FILE_DEVICE_MIDI_OUT}
  176.   FILE_DEVICE_MOUSE               = $0000000f;
  177.   {$EXTERNALSYM FILE_DEVICE_MOUSE}
  178.   FILE_DEVICE_MULTI_UNC_PROVIDER  = $00000010;
  179.   {$EXTERNALSYM FILE_DEVICE_MULTI_UNC_PROVIDER}
  180.   FILE_DEVICE_NAMED_PIPE          = $00000011;
  181.   {$EXTERNALSYM FILE_DEVICE_NAMED_PIPE}
  182.   FILE_DEVICE_NETWORK             = $00000012;
  183.   {$EXTERNALSYM FILE_DEVICE_NETWORK}
  184.   FILE_DEVICE_NETWORK_BROWSER     = $00000013;
  185.   {$EXTERNALSYM FILE_DEVICE_NETWORK_BROWSER}
  186.   FILE_DEVICE_NETWORK_FILE_SYSTEM = $00000014;
  187.   {$EXTERNALSYM FILE_DEVICE_NETWORK_FILE_SYSTEM}
  188.   FILE_DEVICE_NULL                = $00000015;
  189.   {$EXTERNALSYM FILE_DEVICE_NULL}
  190.   FILE_DEVICE_PARALLEL_PORT       = $00000016;
  191.   {$EXTERNALSYM FILE_DEVICE_PARALLEL_PORT}
  192.   FILE_DEVICE_PHYSICAL_NETCARD    = $00000017;
  193.   {$EXTERNALSYM FILE_DEVICE_PHYSICAL_NETCARD}
  194.   FILE_DEVICE_PRINTER             = $00000018;
  195.   {$EXTERNALSYM FILE_DEVICE_PRINTER}
  196.   FILE_DEVICE_SCANNER             = $00000019;
  197.   {$EXTERNALSYM FILE_DEVICE_SCANNER}
  198.   FILE_DEVICE_SERIAL_MOUSE_PORT   = $0000001a;
  199.   {$EXTERNALSYM FILE_DEVICE_SERIAL_MOUSE_PORT}
  200.   FILE_DEVICE_SERIAL_PORT         = $0000001b;
  201.   {$EXTERNALSYM FILE_DEVICE_SERIAL_PORT}
  202.   FILE_DEVICE_SCREEN              = $0000001c;
  203.   {$EXTERNALSYM FILE_DEVICE_SCREEN}
  204.   FILE_DEVICE_SOUND               = $0000001d;
  205.   {$EXTERNALSYM FILE_DEVICE_SOUND}
  206.   FILE_DEVICE_STREAMS             = $0000001e;
  207.   {$EXTERNALSYM FILE_DEVICE_STREAMS}
  208.   FILE_DEVICE_TAPE                = $0000001f;
  209.   {$EXTERNALSYM FILE_DEVICE_TAPE}
  210.   FILE_DEVICE_TAPE_FILE_SYSTEM    = $00000020;
  211.   {$EXTERNALSYM FILE_DEVICE_TAPE_FILE_SYSTEM}
  212.   FILE_DEVICE_TRANSPORT           = $00000021;
  213.   {$EXTERNALSYM FILE_DEVICE_TRANSPORT}
  214.   FILE_DEVICE_UNKNOWN             = $00000022;
  215.   {$EXTERNALSYM FILE_DEVICE_UNKNOWN}
  216.   FILE_DEVICE_VIDEO               = $00000023;
  217.   {$EXTERNALSYM FILE_DEVICE_VIDEO}
  218.   FILE_DEVICE_VIRTUAL_DISK        = $00000024;
  219.   {$EXTERNALSYM FILE_DEVICE_VIRTUAL_DISK}
  220.   FILE_DEVICE_WAVE_IN             = $00000025;
  221.   {$EXTERNALSYM FILE_DEVICE_WAVE_IN}
  222.   FILE_DEVICE_WAVE_OUT            = $00000026;
  223.   {$EXTERNALSYM FILE_DEVICE_WAVE_OUT}
  224.   FILE_DEVICE_8042_PORT           = $00000027;
  225.   {$EXTERNALSYM FILE_DEVICE_8042_PORT}
  226.   FILE_DEVICE_NETWORK_REDIRECTOR  = $00000028;
  227.   {$EXTERNALSYM FILE_DEVICE_NETWORK_REDIRECTOR}
  228.   FILE_DEVICE_BATTERY             = $00000029;
  229.   {$EXTERNALSYM FILE_DEVICE_BATTERY}
  230.   FILE_DEVICE_BUS_EXTENDER        = $0000002a;
  231.   {$EXTERNALSYM FILE_DEVICE_BUS_EXTENDER}
  232.   FILE_DEVICE_MODEM               = $0000002b;
  233.   {$EXTERNALSYM FILE_DEVICE_MODEM}
  234.   FILE_DEVICE_VDM                 = $0000002c;
  235.   {$EXTERNALSYM FILE_DEVICE_VDM}
  236.   FILE_DEVICE_MASS_STORAGE        = $0000002d;
  237.   {$EXTERNALSYM FILE_DEVICE_MASS_STORAGE}
  238.   FILE_DEVICE_SMB                 = $0000002e;
  239.   {$EXTERNALSYM FILE_DEVICE_SMB}
  240.   FILE_DEVICE_KS                  = $0000002f;
  241.   {$EXTERNALSYM FILE_DEVICE_KS}
  242.   FILE_DEVICE_CHANGER             = $00000030;
  243.   {$EXTERNALSYM FILE_DEVICE_CHANGER}
  244.   FILE_DEVICE_SMARTCARD           = $00000031;
  245.   {$EXTERNALSYM FILE_DEVICE_SMARTCARD}
  246.   FILE_DEVICE_ACPI                = $00000032;
  247.   {$EXTERNALSYM FILE_DEVICE_ACPI}
  248.   FILE_DEVICE_DVD                 = $00000033;
  249.   {$EXTERNALSYM FILE_DEVICE_DVD}
  250.   FILE_DEVICE_FULLSCREEN_VIDEO    = $00000034;
  251.   {$EXTERNALSYM FILE_DEVICE_FULLSCREEN_VIDEO}
  252.   FILE_DEVICE_DFS_FILE_SYSTEM     = $00000035;
  253.   {$EXTERNALSYM FILE_DEVICE_DFS_FILE_SYSTEM}
  254.   FILE_DEVICE_DFS_VOLUME          = $00000036;
  255.   {$EXTERNALSYM FILE_DEVICE_DFS_VOLUME}
  256.   FILE_DEVICE_SERENUM             = $00000037;
  257.   {$EXTERNALSYM FILE_DEVICE_SERENUM}
  258.   FILE_DEVICE_TERMSRV             = $00000038;
  259.   {$EXTERNALSYM FILE_DEVICE_TERMSRV}
  260.   FILE_DEVICE_KSEC                = $00000039;
  261.   {$EXTERNALSYM FILE_DEVICE_KSEC}
  262.   FILE_DEVICE_FIPS                = $0000003A;
  263.   {$EXTERNALSYM FILE_DEVICE_FIPS}
  264.   FILE_DEVICE_INFINIBAND          = $0000003B;
  265.   {$EXTERNALSYM FILE_DEVICE_INFINIBAND}
  266. //
  267. // Macro definition for defining IOCTL and FSCTL function control codes.  Note
  268. // that function codes 0-2047 are reserved for Microsoft Corporation, and
  269. // 2048-4095 are reserved for customers.
  270. //
  271. function CTL_CODE(DeviceType, Func, Method, Access: WORD): DWORD;
  272. {$EXTERNALSYM CTL_CODE}
  273. //
  274. // Macro to extract device type out of the device io control code
  275. //
  276. function DEVICE_TYPE_FROM_CTL_CODE(CtrlCode: DWORD): WORD;
  277. {$EXTERNALSYM DEVICE_TYPE_FROM_CTL_CODE}
  278. //
  279. // Define the method codes for how buffers are passed for I/O and FS controls
  280. //
  281. const
  282.   METHOD_BUFFERED   = 0;
  283.   {$EXTERNALSYM METHOD_BUFFERED}
  284.   METHOD_IN_DIRECT  = 1;
  285.   {$EXTERNALSYM METHOD_IN_DIRECT}
  286.   METHOD_OUT_DIRECT = 2;
  287.   {$EXTERNALSYM METHOD_OUT_DIRECT}
  288.   METHOD_NEITHER    = 3;
  289.   {$EXTERNALSYM METHOD_NEITHER}
  290. //
  291. // Define some easier to comprehend aliases:
  292. //   METHOD_DIRECT_TO_HARDWARE (writes, aka METHOD_IN_DIRECT)
  293. //   METHOD_DIRECT_FROM_HARDWARE (reads, aka METHOD_OUT_DIRECT)
  294. //
  295.   METHOD_DIRECT_TO_HARDWARE     = METHOD_OUT_DIRECT;
  296.   {$EXTERNALSYM METHOD_DIRECT_TO_HARDWARE}
  297.   METHOD_DIRECT_FROM_HARDWARE   = METHOD_IN_DIRECT;
  298.   {$EXTERNALSYM METHOD_DIRECT_FROM_HARDWARE}
  299. //
  300. // Define the access check value for any access
  301. //
  302. //
  303. // The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in
  304. // ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these
  305. // constants *MUST* always be in sync.
  306. //
  307. //
  308. // FILE_SPECIAL_ACCESS is checked by the NT I/O system the same as FILE_ANY_ACCESS.
  309. // The file systems, however, may add additional access checks for I/O and FS controls
  310. // that use this value.
  311. //
  312. const
  313.   FILE_ANY_ACCESS     = 0;
  314.   {$EXTERNALSYM FILE_ANY_ACCESS}
  315.   FILE_SPECIAL_ACCESS = FILE_ANY_ACCESS;
  316.   {$EXTERNALSYM FILE_SPECIAL_ACCESS}
  317.   FILE_READ_ACCESS    = $0001;           // file & pipe
  318.   {$EXTERNALSYM FILE_READ_ACCESS}
  319.   FILE_WRITE_ACCESS   = $0002;           // file & pipe
  320.   {$EXTERNALSYM FILE_WRITE_ACCESS}
  321. //
  322. // IoControlCode values for storage devices
  323. //
  324.   IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;
  325.   {$EXTERNALSYM IOCTL_STORAGE_BASE}
  326. //
  327. // The following device control codes are common for all class drivers.  They
  328. // should be used in place of the older IOCTL_DISK, IOCTL_CDROM and IOCTL_TAPE
  329. // common codes
  330. //
  331. const
  332.   IOCTL_STORAGE_CHECK_VERIFY = (
  333.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  334.     ($0200 shl 2) or METHOD_BUFFERED);
  335.   {$EXTERNALSYM IOCTL_STORAGE_CHECK_VERIFY}
  336.   IOCTL_STORAGE_CHECK_VERIFY2 = (
  337.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  338.     ($0200 shl 2) or METHOD_BUFFERED);
  339.   {$EXTERNALSYM IOCTL_STORAGE_CHECK_VERIFY2}
  340.   IOCTL_STORAGE_MEDIA_REMOVAL = (
  341.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  342.     ($0201 shl 2) or METHOD_BUFFERED);
  343.   {$EXTERNALSYM IOCTL_STORAGE_MEDIA_REMOVAL}
  344.   IOCTL_STORAGE_EJECT_MEDIA = (
  345.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  346.     ($0202 shl 2) or METHOD_BUFFERED);
  347.   {$EXTERNALSYM IOCTL_STORAGE_EJECT_MEDIA}
  348.   IOCTL_STORAGE_LOAD_MEDIA = (
  349.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  350.     ($0203 shl 2) or METHOD_BUFFERED);
  351.   {$EXTERNALSYM IOCTL_STORAGE_LOAD_MEDIA}
  352.   IOCTL_STORAGE_LOAD_MEDIA2 = (
  353.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  354.     ($0203 shl 2) or METHOD_BUFFERED);
  355.   {$EXTERNALSYM IOCTL_STORAGE_LOAD_MEDIA2}
  356.   IOCTL_STORAGE_RESERVE = (
  357.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  358.     ($0204 shl 2) or METHOD_BUFFERED);
  359.   {$EXTERNALSYM IOCTL_STORAGE_RESERVE}
  360.   IOCTL_STORAGE_RELEASE = (
  361.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  362.     ($0205 shl 2) or METHOD_BUFFERED);
  363.   {$EXTERNALSYM IOCTL_STORAGE_RELEASE}
  364.   IOCTL_STORAGE_FIND_NEW_DEVICES = (
  365.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  366.     ($0206 shl 2) or METHOD_BUFFERED);
  367.   {$EXTERNALSYM IOCTL_STORAGE_FIND_NEW_DEVICES}
  368.   IOCTL_STORAGE_EJECTION_CONTROL = (
  369.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  370.     ($0250 shl 2) or METHOD_BUFFERED);
  371.   {$EXTERNALSYM IOCTL_STORAGE_EJECTION_CONTROL}
  372.   IOCTL_STORAGE_MCN_CONTROL = (
  373.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  374.     ($0251 shl 2) or METHOD_BUFFERED);
  375.   {$EXTERNALSYM IOCTL_STORAGE_MCN_CONTROL}
  376.   IOCTL_STORAGE_GET_MEDIA_TYPES = (
  377.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  378.     ($0300 shl 2) or METHOD_BUFFERED);
  379.   {$EXTERNALSYM IOCTL_STORAGE_GET_MEDIA_TYPES}
  380.   IOCTL_STORAGE_GET_MEDIA_TYPES_EX = (
  381.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  382.     ($0301 shl 2) or METHOD_BUFFERED);
  383.   {$EXTERNALSYM IOCTL_STORAGE_GET_MEDIA_TYPES_EX}
  384.   IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER = (
  385.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  386.     ($0304 shl 2) or METHOD_BUFFERED);
  387.   {$EXTERNALSYM IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER}
  388.   IOCTL_STORAGE_GET_HOTPLUG_INFO = (
  389.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  390.     ($0305 shl 2) or METHOD_BUFFERED);
  391.   {$EXTERNALSYM IOCTL_STORAGE_GET_HOTPLUG_INFO}
  392.   IOCTL_STORAGE_SET_HOTPLUG_INFO = (
  393.     (IOCTL_STORAGE_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  394.     ($0306 shl 2) or METHOD_BUFFERED);
  395.   {$EXTERNALSYM IOCTL_STORAGE_SET_HOTPLUG_INFO}
  396.   IOCTL_STORAGE_RESET_BUS = (
  397.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  398.     ($0400 shl 2) or METHOD_BUFFERED);
  399.   {$EXTERNALSYM IOCTL_STORAGE_RESET_BUS}
  400.   IOCTL_STORAGE_RESET_DEVICE = (
  401.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  402.     ($0401 shl 2) or METHOD_BUFFERED);
  403.   {$EXTERNALSYM IOCTL_STORAGE_RESET_DEVICE}
  404.   IOCTL_STORAGE_BREAK_RESERVATION = (
  405.     (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  406.     ($0405 shl 2) or METHOD_BUFFERED);
  407.   {$EXTERNALSYM IOCTL_STORAGE_BREAK_RESERVATION}
  408.   IOCTL_STORAGE_GET_DEVICE_NUMBER = (
  409.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  410.     ($0420 shl 2) or METHOD_BUFFERED);
  411.   {$EXTERNALSYM IOCTL_STORAGE_GET_DEVICE_NUMBER}
  412.   IOCTL_STORAGE_PREDICT_FAILURE = (
  413.     (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  414.     ($0440 shl 2) or METHOD_BUFFERED);
  415.   {$EXTERNALSYM IOCTL_STORAGE_PREDICT_FAILURE}
  416. //
  417. // These ioctl codes are obsolete.  They are defined here to avoid resuing them
  418. // and to allow class drivers to respond to them more easily.
  419. //
  420.   OBSOLETE_IOCTL_STORAGE_RESET_BUS = (
  421.     (IOCTL_STORAGE_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  422.     ($0400 shl 2) or METHOD_BUFFERED);
  423.   {$EXTERNALSYM OBSOLETE_IOCTL_STORAGE_RESET_BUS}
  424.   OBSOLETE_IOCTL_STORAGE_RESET_DEVICE = (
  425.     (IOCTL_STORAGE_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  426.     ($0401 shl 2) or METHOD_BUFFERED);
  427.   {$EXTERNALSYM OBSOLETE_IOCTL_STORAGE_RESET_DEVICE}
  428. //
  429. // IOCTL_STORAGE_GET_HOTPLUG_INFO
  430. //
  431. type
  432.   PSTORAGE_HOTPLUG_INFO = ^STORAGE_HOTPLUG_INFO;
  433.   {$EXTERNALSYM PSTORAGE_HOTPLUG_INFO}
  434.   _STORAGE_HOTPLUG_INFO = record
  435.     Size: DWORD; // version
  436.     MediaRemovable: BOOLEAN; // ie. zip, jaz, cdrom, mo, etc. vs hdd
  437.     MediaHotplug: BOOLEAN;   // ie. does the device succeed a lock even though its not lockable media?
  438.     DeviceHotplug: BOOLEAN;  // ie. 1394, USB, etc.
  439.     WriteCacheEnableOverride: BOOLEAN; // This field should not be relied upon because it is no longer used
  440.   end;
  441.   {$EXTERNALSYM _STORAGE_HOTPLUG_INFO}
  442.   STORAGE_HOTPLUG_INFO = _STORAGE_HOTPLUG_INFO;
  443.   {$EXTERNALSYM STORAGE_HOTPLUG_INFO}
  444.   TStorageHotplugInfo = STORAGE_HOTPLUG_INFO;
  445.   PStorageHotplugInfo = PSTORAGE_HOTPLUG_INFO;
  446. //
  447. // IOCTL_STORAGE_GET_DEVICE_NUMBER
  448. //
  449. // input - none
  450. //
  451. // output - STORAGE_DEVICE_NUMBER structure
  452. //          The values in the STORAGE_DEVICE_NUMBER structure are guaranteed
  453. //          to remain unchanged until the system is rebooted.  They are not
  454. //          guaranteed to be persistant across boots.
  455. //
  456. type
  457.   PSTORAGE_DEVICE_NUMBER = ^STORAGE_DEVICE_NUMBER;
  458.   {$EXTERNALSYM PSTORAGE_DEVICE_NUMBER}
  459.   _STORAGE_DEVICE_NUMBER = record
  460.     //
  461.     // The FILE_DEVICE_XXX type for this device.
  462.     //
  463.     DeviceType: DEVICE_TYPE;
  464.     //
  465.     // The number of this device
  466.     //
  467.     DeviceNumber: DWORD;
  468.     //
  469.     // If the device is partitionable, the partition number of the device.
  470.     // Otherwise -1
  471.     //
  472.     PartitionNumber: DWORD;
  473.   end;
  474.   {$EXTERNALSYM _STORAGE_DEVICE_NUMBER}
  475.   STORAGE_DEVICE_NUMBER = _STORAGE_DEVICE_NUMBER;
  476.   {$EXTERNALSYM STORAGE_DEVICE_NUMBER}
  477.   TStorageDeviceNumber = STORAGE_DEVICE_NUMBER;
  478.   PStorageDeviceNumber = PSTORAGE_DEVICE_NUMBER;
  479. //
  480. // Define the structures for scsi resets
  481. //
  482.   PSTORAGE_BUS_RESET_REQUEST = ^STORAGE_BUS_RESET_REQUEST;
  483.   {$EXTERNALSYM PSTORAGE_BUS_RESET_REQUEST}
  484.   _STORAGE_BUS_RESET_REQUEST = record
  485.     PathId: BYTE;
  486.   end;
  487.   {$EXTERNALSYM _STORAGE_BUS_RESET_REQUEST}
  488.   STORAGE_BUS_RESET_REQUEST = _STORAGE_BUS_RESET_REQUEST;
  489.   {$EXTERNALSYM STORAGE_BUS_RESET_REQUEST}
  490.   TStorageBusResetRequest = STORAGE_BUS_RESET_REQUEST;
  491.   PStorageBusResetRequest = PSTORAGE_BUS_RESET_REQUEST;
  492. //
  493. // IOCTL_STORAGE_MEDIA_REMOVAL disables the mechanism
  494. // on a storage device that ejects media. This function
  495. // may or may not be supported on storage devices that
  496. // support removable media.
  497. //
  498. // TRUE means prevent media from being removed.
  499. // FALSE means allow media removal.
  500. //
  501.   PPREVENT_MEDIA_REMOVAL = ^PREVENT_MEDIA_REMOVAL;
  502.   {$EXTERNALSYM PPREVENT_MEDIA_REMOVAL}
  503.   _PREVENT_MEDIA_REMOVAL = record
  504.     PreventMediaRemoval: ByteBool;
  505.   end;
  506.   {$EXTERNALSYM _PREVENT_MEDIA_REMOVAL}
  507.   PREVENT_MEDIA_REMOVAL = _PREVENT_MEDIA_REMOVAL;
  508.   {$EXTERNALSYM PREVENT_MEDIA_REMOVAL}
  509.   TPreventMediaRemoval = PREVENT_MEDIA_REMOVAL;
  510.   PPreventMediaRemoval = PPREVENT_MEDIA_REMOVAL;
  511. //
  512. //  This is the format of TARGET_DEVICE_CUSTOM_NOTIFICATION.CustomDataBuffer
  513. //  passed to applications by the classpnp autorun code (via IoReportTargetDeviceChangeAsynchronous).
  514. //
  515.   _CLASS_MEDIA_CHANGE_CONTEXT = record
  516.     MediaChangeCount: DWORD;
  517.     NewState: DWORD; // see MEDIA_CHANGE_DETECTION_STATE enum in classpnp.h in DDK
  518.   end;
  519.   {$EXTERNALSYM _CLASS_MEDIA_CHANGE_CONTEXT}
  520.   CLASS_MEDIA_CHANGE_CONTEXT = _CLASS_MEDIA_CHANGE_CONTEXT;
  521.   {$EXTERNALSYM CLASS_MEDIA_CHANGE_CONTEXT}
  522.   PCLASS_MEDIA_CHANGE_CONTEXT = ^CLASS_MEDIA_CHANGE_CONTEXT;
  523.   {$EXTERNALSYM PCLASS_MEDIA_CHANGE_CONTEXT}
  524.   TClassMediaChangeContext = CLASS_MEDIA_CHANGE_CONTEXT;
  525.   PClassMediaChangeContext = PCLASS_MEDIA_CHANGE_CONTEXT;
  526.   PTAPE_STATISTICS = ^TAPE_STATISTICS;
  527.   {$EXTERNALSYM PTAPE_STATISTICS}
  528.   _TAPE_STATISTICS = record
  529.     Version: DWORD;
  530.     Flags: DWORD;
  531.     RecoveredWrites: LARGE_INTEGER;
  532.     UnrecoveredWrites: LARGE_INTEGER;
  533.     RecoveredReads: LARGE_INTEGER;
  534.     UnrecoveredReads: LARGE_INTEGER;
  535.     CompressionRatioReads: BYTE;
  536.     CompressionRatioWrites: BYTE;
  537.   end;
  538.   {$EXTERNALSYM _TAPE_STATISTICS}
  539.   TAPE_STATISTICS = _TAPE_STATISTICS;
  540.   {$EXTERNALSYM TAPE_STATISTICS}
  541.   TTapeStatistics = TAPE_STATISTICS;
  542.   PTapeStatistics = PTAPE_STATISTICS;
  543. const
  544.   RECOVERED_WRITES_VALID       = $00000001;
  545.   {$EXTERNALSYM RECOVERED_WRITES_VALID}
  546.   UNRECOVERED_WRITES_VALID     = $00000002;
  547.   {$EXTERNALSYM UNRECOVERED_WRITES_VALID}
  548.   RECOVERED_READS_VALID        = $00000004;
  549.   {$EXTERNALSYM RECOVERED_READS_VALID}
  550.   UNRECOVERED_READS_VALID      = $00000008;
  551.   {$EXTERNALSYM UNRECOVERED_READS_VALID}
  552.   WRITE_COMPRESSION_INFO_VALID = $00000010;
  553.   {$EXTERNALSYM WRITE_COMPRESSION_INFO_VALID}
  554.   READ_COMPRESSION_INFO_VALID  = $00000020;
  555.   {$EXTERNALSYM READ_COMPRESSION_INFO_VALID}
  556. type
  557.   PTAPE_GET_STATISTICS = ^TAPE_GET_STATISTICS;
  558.   {$EXTERNALSYM PTAPE_GET_STATISTICS}
  559.   _TAPE_GET_STATISTICS = record
  560.     Operation: DWORD;
  561.   end;
  562.   {$EXTERNALSYM _TAPE_GET_STATISTICS}
  563.   TAPE_GET_STATISTICS = _TAPE_GET_STATISTICS;
  564.   {$EXTERNALSYM TAPE_GET_STATISTICS}
  565.   TTapeGetStatistics = TAPE_GET_STATISTICS;
  566.   PTapeGetStatistics = PTAPE_GET_STATISTICS;
  567. const
  568.   TAPE_RETURN_STATISTICS = 0;
  569.   {$EXTERNALSYM TAPE_RETURN_STATISTICS}
  570.   TAPE_RETURN_ENV_INFO   = 1;
  571.   {$EXTERNALSYM TAPE_RETURN_ENV_INFO}
  572.   TAPE_RESET_STATISTICS  = 2;
  573.   {$EXTERNALSYM TAPE_RESET_STATISTICS}
  574. //
  575. // IOCTL_STORAGE_GET_MEDIA_TYPES_EX will return an array of DEVICE_MEDIA_INFO
  576. // structures, one per supported type, embedded in the GET_MEDIA_TYPES struct.
  577. //
  578. const
  579.   //
  580.   // Following are defined in ntdddisk.h in the MEDIA_TYPE enum
  581.   //
  582.   // Unknown,                // Format is unknown
  583.   // F5_1Pt2_512,            // 5.25", 1.2MB,  512 bytes/sector
  584.   // F3_1Pt44_512,           // 3.5",  1.44MB, 512 bytes/sector
  585.   // F3_2Pt88_512,           // 3.5",  2.88MB, 512 bytes/sector
  586.   // F3_20Pt8_512,           // 3.5",  20.8MB, 512 bytes/sector
  587.   // F3_720_512,             // 3.5",  720KB,  512 bytes/sector
  588.   // F5_360_512,             // 5.25", 360KB,  512 bytes/sector
  589.   // F5_320_512,             // 5.25", 320KB,  512 bytes/sector
  590.   // F5_320_1024,            // 5.25", 320KB,  1024 bytes/sector
  591.   // F5_180_512,             // 5.25", 180KB,  512 bytes/sector
  592.   // F5_160_512,             // 5.25", 160KB,  512 bytes/sector
  593.   // RemovableMedia,         // Removable media other than floppy
  594.   // FixedMedia,             // Fixed hard disk media
  595.   // F3_120M_512,            // 3.5", 120M Floppy
  596.   // F3_640_512,             // 3.5" ,  640KB,  512 bytes/sector
  597.   // F5_640_512,             // 5.25",  640KB,  512 bytes/sector
  598.   // F5_720_512,             // 5.25",  720KB,  512 bytes/sector
  599.   // F3_1Pt2_512,            // 3.5" ,  1.2Mb,  512 bytes/sector
  600.   // F3_1Pt23_1024,          // 3.5" ,  1.23Mb, 1024 bytes/sector
  601.   // F5_1Pt23_1024,          // 5.25",  1.23MB, 1024 bytes/sector
  602.   // F3_128Mb_512,           // 3.5" MO 128Mb   512 bytes/sector
  603.   // F3_230Mb_512,           // 3.5" MO 230Mb   512 bytes/sector
  604.   // F8_256_128,             // 8",     256KB,  128 bytes/sector
  605.   // F3_200Mb_512,           // 3.5",   200M Floppy (HiFD)  
  606.   //
  607.   DDS_4mm            = $20;  // Tape - DAT DDS1,2,... (all vendors)
  608.   MiniQic            = $21;  // Tape - miniQIC Tape
  609.   Travan             = $22;  // Tape - Travan TR-1,2,3,...
  610.   QIC                = $23;  // Tape - QIC
  611.   MP_8mm             = $24;  // Tape - 8mm Exabyte Metal Particle
  612.   AME_8mm            = $25;  // Tape - 8mm Exabyte Advanced Metal Evap
  613.   AIT1_8mm           = $26;  // Tape - 8mm Sony AIT
  614.   DLT                = $27;  // Tape - DLT Compact IIIxt, IV
  615.   NCTP               = $28;  // Tape - Philips NCTP
  616.   IBM_3480           = $29;  // Tape - IBM 3480
  617.   IBM_3490E          = $2A;  // Tape - IBM 3490E
  618.   IBM_Magstar_3590   = $2B;  // Tape - IBM Magstar 3590
  619.   IBM_Magstar_MP     = $2C;  // Tape - IBM Magstar MP
  620.   STK_DATA_D3        = $2D;  // Tape - STK Data D3
  621.   SONY_DTF           = $2E;  // Tape - Sony DTF
  622.   DV_6mm             = $2F;  // Tape - 6mm Digital Video
  623.   DMI                = $30;  // Tape - Exabyte DMI and compatibles
  624.   SONY_D2            = $31;  // Tape - Sony D2S and D2L
  625.   CLEANER_CARTRIDGE  = $32;  // Cleaner - All Drive types that support Drive Cleaners
  626.   CD_ROM             = $33;  // Opt_Disk - CD
  627.   CD_R               = $34;  // Opt_Disk - CD-Recordable (Write Once)
  628.   CD_RW              = $35;  // Opt_Disk - CD-Rewriteable
  629.   DVD_ROM            = $36;  // Opt_Disk - DVD-ROM
  630.   DVD_R              = $37;  // Opt_Disk - DVD-Recordable (Write Once)
  631.   DVD_RW             = $38;  // Opt_Disk - DVD-Rewriteable
  632.   MO_3_RW            = $39;  // Opt_Disk - 3.5" Rewriteable MO Disk
  633.   MO_5_WO            = $3A;  // Opt_Disk - MO 5.25" Write Once
  634.   MO_5_RW            = $3B;  // Opt_Disk - MO 5.25" Rewriteable (not LIMDOW)
  635.   MO_5_LIMDOW        = $3C;  // Opt_Disk - MO 5.25" Rewriteable (LIMDOW)
  636.   PC_5_WO            = $3D;  // Opt_Disk - Phase Change 5.25" Write Once Optical
  637.   PC_5_RW            = $3E;  // Opt_Disk - Phase Change 5.25" Rewriteable
  638.   PD_5_RW            = $3F;  // Opt_Disk - PhaseChange Dual Rewriteable
  639.   ABL_5_WO           = $40;  // Opt_Disk - Ablative 5.25" Write Once Optical
  640.   PINNACLE_APEX_5_RW = $41;  // Opt_Disk - Pinnacle Apex 4.6GB Rewriteable Optical
  641.   SONY_12_WO         = $42;  // Opt_Disk - Sony 12" Write Once
  642.   PHILIPS_12_WO      = $43;  // Opt_Disk - Philips/LMS 12" Write Once
  643.   HITACHI_12_WO      = $44;  // Opt_Disk - Hitachi 12" Write Once
  644.   CYGNET_12_WO       = $45;  // Opt_Disk - Cygnet/ATG 12" Write Once
  645.   KODAK_14_WO        = $46;  // Opt_Disk - Kodak 14" Write Once
  646.   MO_NFR_525         = $47;  // Opt_Disk - Near Field Recording (Terastor)
  647.   NIKON_12_RW        = $48;  // Opt_Disk - Nikon 12" Rewriteable
  648.   IOMEGA_ZIP         = $49;  // Mag_Disk - Iomega Zip
  649.   IOMEGA_JAZ         = $4A;  // Mag_Disk - Iomega Jaz
  650.   SYQUEST_EZ135      = $4B;  // Mag_Disk - Syquest EZ135
  651.   SYQUEST_EZFLYER    = $4C;  // Mag_Disk - Syquest EzFlyer
  652.   SYQUEST_SYJET      = $4D;  // Mag_Disk - Syquest SyJet
  653.   AVATAR_F2          = $4E;  // Mag_Disk - 2.5" Floppy
  654.   MP2_8mm            = $4F;  // Tape - 8mm Hitachi
  655.   DST_S              = $50;  // Ampex DST Small Tapes
  656.   DST_M              = $51;  // Ampex DST Medium Tapes
  657.   DST_L              = $52;  // Ampex DST Large Tapes
  658.   VXATape_1          = $53;  // Ecrix 8mm Tape
  659.   VXATape_2          = $54;  // Ecrix 8mm Tape
  660.   STK_9840           = $55;  // STK 9840
  661.   LTO_Ultrium        = $56;  // IBM, HP, Seagate LTO Ultrium
  662.   LTO_Accelis        = $57;  // IBM, HP, Seagate LTO Accelis
  663.   DVD_RAM            = $58;  // Opt_Disk - DVD-RAM
  664.   AIT_8mm            = $59;  // AIT2 or higher
  665.   ADR_1              = $5A;  // OnStream ADR Mediatypes
  666.   ADR_2              = $5B;
  667.   STK_9940           = $5C;  // STK 9940
  668. type
  669.   STORAGE_MEDIA_TYPE = DWORD;
  670.   {$EXTERNALSYM STORAGE_MEDIA_TYPE}
  671.   PSTORAGE_MEDIA_TYPE = ^STORAGE_MEDIA_TYPE;
  672.   {$EXTERNALSYM PSTORAGE_MEDIA_TYPE}
  673.   TStorageMediaType = STORAGE_MEDIA_TYPE;
  674.   PStorageMediaType = ^TStorageMediaType;
  675. const
  676.   MEDIA_ERASEABLE  = $00000001;
  677.   {$EXTERNALSYM MEDIA_ERASEABLE}
  678.   MEDIA_WRITE_ONCE = $00000002;
  679.   {$EXTERNALSYM MEDIA_WRITE_ONCE}
  680.   MEDIA_READ_ONLY  = $00000004;
  681.   {$EXTERNALSYM MEDIA_READ_ONLY}
  682.   MEDIA_READ_WRITE = $00000008;
  683.   {$EXTERNALSYM MEDIA_READ_WRITE}
  684.   MEDIA_WRITE_PROTECTED   = $00000100;
  685.   {$EXTERNALSYM MEDIA_WRITE_PROTECTED}
  686.   MEDIA_CURRENTLY_MOUNTED = DWORD($80000000);
  687.   {$EXTERNALSYM MEDIA_CURRENTLY_MOUNTED}
  688. //
  689. // Define the different storage bus types
  690. // Bus types below 128 (0x80) are reserved for Microsoft use
  691. //
  692. const
  693.   BusTypeUnknown     = 0;
  694.   BusTypeScsi        = 1;
  695.   BusTypeAtapi       = 2;
  696.   BusTypeAta         = 3;
  697.   BusType1394        = 4;
  698.   BusTypeSsa         = 5;
  699.   BusTypeFibre       = 6;
  700.   BusTypeUsb         = 7;
  701.   BusTypeRAID        = 8;
  702.   BusTypeMaxReserved = $7F;
  703. type
  704.   STORAGE_BUS_TYPE = DWORD;
  705.   {$EXTERNALSYM STORAGE_BUS_TYPE}
  706.   PSTORAGE_BUS_TYPE = ^STORAGE_BUS_TYPE;
  707.   {$EXTERNALSYM PSTORAGE_BUS_TYPE}
  708.   TStorageBusType = STORAGE_BUS_TYPE;
  709.   PStorageBusType = PSTORAGE_BUS_TYPE;
  710.   TDMIDiskInfo = record
  711.     Cylinders: LARGE_INTEGER;
  712.     MediaType: STORAGE_MEDIA_TYPE;
  713.     TracksPerCylinder: DWORD;
  714.     SectorsPerTrack: DWORD;
  715.     BytesPerSector: DWORD;
  716.     NumberMediaSides: DWORD;
  717.     MediaCharacteristics: DWORD; // Bitmask of MEDIA_XXX values.
  718.   end;
  719.   TDMIRemovableDiskInfo = record
  720.     Cylinders: LARGE_INTEGER;
  721.     MediaType: STORAGE_MEDIA_TYPE;
  722.     TracksPerCylinder: DWORD;
  723.     SectorsPerTrack: DWORD;
  724.     BytesPerSector: DWORD;
  725.     NumberMediaSides: DWORD;
  726.     MediaCharacteristics: DWORD; // Bitmask of MEDIA_XXX values.
  727.   end;
  728.   TDMITapeInfo = record
  729.     MediaType: STORAGE_MEDIA_TYPE;
  730.     MediaCharacteristics: DWORD; // Bitmask of MEDIA_XXX values.
  731.     CurrentBlockSize: DWORD;
  732.     BusType: STORAGE_BUS_TYPE;
  733.     //
  734.     // Bus specific information describing the medium supported.
  735.     //
  736.     case Integer of {BusSpecificData}
  737.       0: ( {ScsiInformation}
  738.         MediumType: BYTE;
  739.         DensityCode: BYTE);
  740.   end;
  741.   PDEVICE_MEDIA_INFO = ^DEVICE_MEDIA_INFO;
  742.   {$EXTERNALSYM PDEVICE_MEDIA_INFO}
  743.   _DEVICE_MEDIA_INFO = record
  744.     case Integer of
  745.       0: (DiskInfo: TDMIDiskInfo);
  746.       1: (RemovableDiskInfo: TDMIRemovableDiskInfo);
  747.       2: (TapeInfo: TDMITapeInfo);
  748.   end;
  749.   {$EXTERNALSYM _DEVICE_MEDIA_INFO}
  750.   DEVICE_MEDIA_INFO = _DEVICE_MEDIA_INFO;
  751.   {$EXTERNALSYM DEVICE_MEDIA_INFO}
  752.   TDeviceMediaInfo = DEVICE_MEDIA_INFO;
  753.   PDeviceMediaInfo = PDEVICE_MEDIA_INFO;
  754.   PGET_MEDIA_TYPES = ^GET_MEDIA_TYPES;
  755.   {$EXTERNALSYM PGET_MEDIA_TYPES}
  756.   _GET_MEDIA_TYPES = record
  757.     DeviceType: DWORD; // FILE_DEVICE_XXX values
  758.     MediaInfoCount: DWORD;
  759.     MediaInfo: array [0..0] of DEVICE_MEDIA_INFO;
  760.   end;
  761.   {$EXTERNALSYM _GET_MEDIA_TYPES}
  762.   GET_MEDIA_TYPES = _GET_MEDIA_TYPES;
  763.   {$EXTERNALSYM GET_MEDIA_TYPES}
  764.   TGetMediaTypes = GET_MEDIA_TYPES;
  765.   PGetMediaTypes = PGET_MEDIA_TYPES;
  766. //
  767. // IOCTL_STORAGE_PREDICT_FAILURE
  768. //
  769. // input - none
  770. //
  771. // output - STORAGE_PREDICT_FAILURE structure
  772. //          PredictFailure returns zero if no failure predicted and non zero
  773. //                         if a failure is predicted.
  774. //
  775. //          VendorSpecific returns 512 bytes of vendor specific information
  776. //                         if a failure is predicted
  777. //
  778.   PSTORAGE_PREDICT_FAILURE = ^STORAGE_PREDICT_FAILURE;
  779.   {$EXTERNALSYM PSTORAGE_PREDICT_FAILURE}
  780.   _STORAGE_PREDICT_FAILURE = record
  781.     PredictFailure: DWORD;
  782.     VendorSpecific: array [0..511] of BYTE;
  783.   end;
  784.   {$EXTERNALSYM _STORAGE_PREDICT_FAILURE}
  785.   STORAGE_PREDICT_FAILURE = _STORAGE_PREDICT_FAILURE;
  786.   {$EXTERNALSYM STORAGE_PREDICT_FAILURE}
  787.   TStoragePredictFailure = STORAGE_PREDICT_FAILURE;
  788.   PStoragePredictFailure = PSTORAGE_PREDICT_FAILURE;
  789. //
  790. // IoControlCode values for disk devices.
  791. //
  792. const
  793.   IOCTL_DISK_BASE = FILE_DEVICE_DISK;
  794.   {$EXTERNALSYM IOCTL_DISK_BASE}
  795.   IOCTL_DISK_GET_DRIVE_GEOMETRY = (
  796.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  797.     ($0000 shl 2) or METHOD_BUFFERED);
  798.   {$EXTERNALSYM IOCTL_DISK_GET_DRIVE_GEOMETRY}
  799.   IOCTL_DISK_GET_PARTITION_INFO = (
  800.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  801.     ($0001 shl 2) or METHOD_BUFFERED);
  802.   {$EXTERNALSYM IOCTL_DISK_GET_PARTITION_INFO}
  803.   IOCTL_DISK_SET_PARTITION_INFO = (
  804.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  805.     ($0002 shl 2) or METHOD_BUFFERED);
  806.   {$EXTERNALSYM IOCTL_DISK_SET_PARTITION_INFO}
  807.   IOCTL_DISK_GET_DRIVE_LAYOUT = (
  808.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  809.     ($0003 shl 2) or METHOD_BUFFERED);
  810.   {$EXTERNALSYM IOCTL_DISK_GET_DRIVE_LAYOUT}
  811.   IOCTL_DISK_SET_DRIVE_LAYOUT = (
  812.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  813.     ($0004 shl 2) or METHOD_BUFFERED);
  814.   {$EXTERNALSYM IOCTL_DISK_SET_DRIVE_LAYOUT}
  815.   IOCTL_DISK_VERIFY = (
  816.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  817.     ($0005 shl 2) or METHOD_BUFFERED);
  818.   {$EXTERNALSYM IOCTL_DISK_VERIFY}
  819.   IOCTL_DISK_FORMAT_TRACKS = (
  820.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  821.     ($0006 shl 2) or METHOD_BUFFERED);
  822.   {$EXTERNALSYM IOCTL_DISK_FORMAT_TRACKS}
  823.   IOCTL_DISK_REASSIGN_BLOCKS = (
  824.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  825.     ($0007 shl 2) or METHOD_BUFFERED);
  826.   {$EXTERNALSYM IOCTL_DISK_REASSIGN_BLOCKS}
  827.   IOCTL_DISK_PERFORMANCE = (
  828.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  829.     ($0008 shl 2) or METHOD_BUFFERED);
  830.   {$EXTERNALSYM IOCTL_DISK_PERFORMANCE}
  831.   IOCTL_DISK_IS_WRITABLE = (
  832.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  833.     ($0009 shl 2) or METHOD_BUFFERED);
  834.   {$EXTERNALSYM IOCTL_DISK_IS_WRITABLE}
  835.   IOCTL_DISK_LOGGING = (
  836.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  837.     ($000a shl 2) or METHOD_BUFFERED);
  838.   {$EXTERNALSYM IOCTL_DISK_LOGGING}
  839.   IOCTL_DISK_FORMAT_TRACKS_EX = (
  840.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  841.     ($000b shl 2) or METHOD_BUFFERED);
  842.   {$EXTERNALSYM IOCTL_DISK_FORMAT_TRACKS_EX}
  843.   IOCTL_DISK_HISTOGRAM_STRUCTURE = (
  844.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  845.     ($000c shl 2) or METHOD_BUFFERED);
  846.   {$EXTERNALSYM IOCTL_DISK_HISTOGRAM_STRUCTURE}
  847.   IOCTL_DISK_HISTOGRAM_DATA = (
  848.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  849.     ($000d shl 2) or METHOD_BUFFERED);
  850.   {$EXTERNALSYM IOCTL_DISK_HISTOGRAM_DATA}
  851.   IOCTL_DISK_HISTOGRAM_RESET = (
  852.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  853.     ($000e shl 2) or METHOD_BUFFERED);
  854.   {$EXTERNALSYM IOCTL_DISK_HISTOGRAM_RESET}
  855.   IOCTL_DISK_REQUEST_STRUCTURE = (
  856.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  857.     ($000f shl 2) or METHOD_BUFFERED);
  858.   {$EXTERNALSYM IOCTL_DISK_REQUEST_STRUCTURE}
  859.   IOCTL_DISK_REQUEST_DATA = (
  860.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  861.     ($0010 shl 2) or METHOD_BUFFERED);
  862.   {$EXTERNALSYM IOCTL_DISK_REQUEST_DATA}
  863.   IOCTL_DISK_PERFORMANCE_OFF = (
  864.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  865.     ($0018 shl 2) or METHOD_BUFFERED);
  866.   {$EXTERNALSYM IOCTL_DISK_PERFORMANCE_OFF}
  867.   IOCTL_DISK_CONTROLLER_NUMBER = (
  868.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  869.     ($0011 shl 2) or METHOD_BUFFERED);
  870.   {$EXTERNALSYM IOCTL_DISK_CONTROLLER_NUMBER}
  871. //
  872. // IOCTL support for SMART drive fault prediction.
  873. //
  874.   SMART_GET_VERSION = (
  875.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  876.     ($0020 shl 2) or METHOD_BUFFERED);
  877.   {$EXTERNALSYM SMART_GET_VERSION}
  878.   SMART_SEND_DRIVE_COMMAND = (
  879.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  880.     ($0021 shl 2) or METHOD_BUFFERED);
  881.   {$EXTERNALSYM SMART_SEND_DRIVE_COMMAND}
  882.   SMART_RCV_DRIVE_DATA = (
  883.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  884.     ($0022 shl 2) or METHOD_BUFFERED);
  885.   {$EXTERNALSYM SMART_RCV_DRIVE_DATA}
  886. //
  887. // New IOCTLs for GUID Partition tabled disks.
  888. //
  889. // 23-11-2002: various bugs reported by Carsten Grafflage corrected
  890.   IOCTL_DISK_GET_PARTITION_INFO_EX = (
  891.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  892.     ($0012 shl 2) or METHOD_BUFFERED);
  893.   {$EXTERNALSYM IOCTL_DISK_GET_PARTITION_INFO_EX}
  894.   IOCTL_DISK_SET_PARTITION_INFO_EX = (
  895.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  896.     ($0013 shl 2) or METHOD_BUFFERED);
  897.   {$EXTERNALSYM IOCTL_DISK_SET_PARTITION_INFO_EX}
  898.   IOCTL_DISK_GET_DRIVE_LAYOUT_EX = (
  899.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  900.     ($0014 shl 2) or METHOD_BUFFERED);
  901.   {$EXTERNALSYM IOCTL_DISK_GET_DRIVE_LAYOUT_EX}
  902.   IOCTL_DISK_SET_DRIVE_LAYOUT_EX = (
  903.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  904.     ($0015 shl 2) or METHOD_BUFFERED);
  905.   {$EXTERNALSYM IOCTL_DISK_SET_DRIVE_LAYOUT_EX}
  906.   IOCTL_DISK_CREATE_DISK = (
  907.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  908.     ($0016 shl 2) or METHOD_BUFFERED);
  909.   {$EXTERNALSYM IOCTL_DISK_CREATE_DISK}
  910.   IOCTL_DISK_GET_LENGTH_INFO = (
  911.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  912.     ($0017 shl 2) or METHOD_BUFFERED);
  913.   {$EXTERNALSYM IOCTL_DISK_GET_LENGTH_INFO}
  914.   IOCTL_DISK_GET_DRIVE_GEOMETRY_EX = (
  915.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  916.     ($0028 shl 2) or METHOD_BUFFERED);
  917.   {$EXTERNALSYM IOCTL_DISK_GET_DRIVE_GEOMETRY_EX}
  918.   IOCTL_DISK_UPDATE_DRIVE_SIZE = (
  919.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  920.     ($0032 shl 2) or METHOD_BUFFERED);
  921.   {$EXTERNALSYM IOCTL_DISK_UPDATE_DRIVE_SIZE}
  922.   IOCTL_DISK_GROW_PARTITION = (
  923.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  924.     ($0034 shl 2) or METHOD_BUFFERED);
  925.   {$EXTERNALSYM IOCTL_DISK_GROW_PARTITION}
  926.   IOCTL_DISK_GET_CACHE_INFORMATION = (
  927.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  928.     ($0035 shl 2) or METHOD_BUFFERED);
  929.   {$EXTERNALSYM IOCTL_DISK_GET_CACHE_INFORMATION}
  930.   IOCTL_DISK_SET_CACHE_INFORMATION = (
  931.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  932.     ($0036 shl 2) or METHOD_BUFFERED);
  933.   {$EXTERNALSYM IOCTL_DISK_SET_CACHE_INFORMATION}
  934.   IOCTL_DISK_GET_WRITE_CACHE_STATE = (
  935.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  936.     ($0037 shl 2) or METHOD_BUFFERED);
  937.   {$EXTERNALSYM IOCTL_DISK_GET_WRITE_CACHE_STATE}
  938.   IOCTL_DISK_DELETE_DRIVE_LAYOUT = (
  939.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  940.     ($0040 shl 2) or METHOD_BUFFERED);
  941.   {$EXTERNALSYM IOCTL_DISK_DELETE_DRIVE_LAYOUT}
  942. //
  943. // Called to flush cached information that the driver may have about this
  944. // device's characteristics.  Not all drivers cache characteristics, and not
  945. // cached properties can be flushed.  This simply serves as an update to the
  946. // driver that it may want to do an expensive reexamination of the device's
  947. // characteristics now (fixed media size, partition table, etc...)
  948. //
  949.   IOCTL_DISK_UPDATE_PROPERTIES = (
  950.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  951.     ($0050 shl 2) or METHOD_BUFFERED);
  952.   {$EXTERNALSYM IOCTL_DISK_UPDATE_PROPERTIES}
  953. //
  954. //  Special IOCTLs needed to support PC-98 machines in Japan
  955. //
  956.   IOCTL_DISK_FORMAT_DRIVE = (
  957.     (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or
  958.     ($00f3 shl 2) or METHOD_BUFFERED);
  959.   {$EXTERNALSYM IOCTL_DISK_FORMAT_DRIVE}
  960.   IOCTL_DISK_SENSE_DEVICE = (
  961.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  962.     ($00f8 shl 2) or METHOD_BUFFERED);
  963.   {$EXTERNALSYM IOCTL_DISK_SENSE_DEVICE}
  964. //
  965. // The following device control codes are common for all class drivers.  The
  966. // functions codes defined here must match all of the other class drivers.
  967. //
  968. // Warning: these codes will be replaced in the future by equivalent
  969. // IOCTL_STORAGE codes
  970. //
  971.   IOCTL_DISK_CHECK_VERIFY = (
  972.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  973.     ($0200 shl 2) or METHOD_BUFFERED);
  974.   {$EXTERNALSYM IOCTL_DISK_CHECK_VERIFY}
  975.   IOCTL_DISK_MEDIA_REMOVAL = (
  976.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  977.     ($0201 shl 2) or METHOD_BUFFERED);
  978.   {$EXTERNALSYM IOCTL_DISK_MEDIA_REMOVAL}
  979.   IOCTL_DISK_EJECT_MEDIA = (
  980.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  981.     ($0202 shl 2) or METHOD_BUFFERED);
  982.   {$EXTERNALSYM IOCTL_DISK_EJECT_MEDIA}
  983.   IOCTL_DISK_LOAD_MEDIA = (
  984.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  985.     ($0203 shl 2) or METHOD_BUFFERED);
  986.   {$EXTERNALSYM IOCTL_DISK_LOAD_MEDIA}
  987.   IOCTL_DISK_RESERVE = (
  988.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  989.     ($0204 shl 2) or METHOD_BUFFERED);
  990.   {$EXTERNALSYM IOCTL_DISK_RESERVE}
  991.   IOCTL_DISK_RELEASE = (
  992.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  993.     ($0205 shl 2) or METHOD_BUFFERED);
  994.   {$EXTERNALSYM IOCTL_DISK_RELEASE}
  995.   IOCTL_DISK_FIND_NEW_DEVICES = (
  996.     (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or
  997.     ($0206 shl 2) or METHOD_BUFFERED);
  998.   {$EXTERNALSYM IOCTL_DISK_FIND_NEW_DEVICES}
  999.   IOCTL_DISK_GET_MEDIA_TYPES = (
  1000.     (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
  1001.     ($0300 shl 2) or METHOD_BUFFERED);
  1002.   {$EXTERNALSYM IOCTL_DISK_GET_MEDIA_TYPES}
  1003. //
  1004. // Define the partition types returnable by known disk drivers.
  1005. //
  1006. const
  1007.   PARTITION_ENTRY_UNUSED    = $00; // Entry unused
  1008.   {$EXTERNALSYM PARTITION_ENTRY_UNUSED}
  1009.   PARTITION_FAT_12          = $01; // 12-bit FAT entries
  1010.   {$EXTERNALSYM PARTITION_FAT_12}
  1011.   PARTITION_XENIX_1         = $02; // Xenix
  1012.   {$EXTERNALSYM PARTITION_XENIX_1}
  1013.   PARTITION_XENIX_2         = $03; // Xenix
  1014.   {$EXTERNALSYM PARTITION_XENIX_2}
  1015.   PARTITION_FAT_16          = $04; // 16-bit FAT entries
  1016.   {$EXTERNALSYM PARTITION_FAT_16}
  1017.   PARTITION_EXTENDED        = $05; // Extended partition entry
  1018.   {$EXTERNALSYM PARTITION_EXTENDED}
  1019.   PARTITION_HUGE            = $06; // Huge partition MS-DOS V4
  1020.   {$EXTERNALSYM PARTITION_HUGE}
  1021.   PARTITION_IFS             = $07; // IFS Partition
  1022.   {$EXTERNALSYM PARTITION_IFS}
  1023.   PARTITION_OS2BOOTMGR      = $0A; // OS/2 Boot Manager/OPUS/Coherent swap
  1024.   {$EXTERNALSYM PARTITION_OS2BOOTMGR}
  1025.   PARTITION_FAT32           = $0B; // FAT32
  1026.   {$EXTERNALSYM PARTITION_FAT32}
  1027.   PARTITION_FAT32_XINT13    = $0C; // FAT32 using extended int13 services
  1028.   {$EXTERNALSYM PARTITION_FAT32_XINT13}
  1029.   PARTITION_XINT13          = $0E; // Win95 partition using extended int13 services
  1030.   {$EXTERNALSYM PARTITION_XINT13}
  1031.   PARTITION_XINT13_EXTENDED = $0F; // Same as type 5 but uses extended int13 services
  1032.   {$EXTERNALSYM PARTITION_XINT13_EXTENDED}
  1033.   PARTITION_PREP            = $41; // PowerPC Reference Platform (PReP) Boot Partition
  1034.   {$EXTERNALSYM PARTITION_PREP}
  1035.   PARTITION_LDM             = $42; // Logical Disk Manager partition
  1036.   {$EXTERNALSYM PARTITION_LDM}
  1037.   PARTITION_UNIX            = $63; // Unix
  1038.   {$EXTERNALSYM PARTITION_UNIX}
  1039.   VALID_NTFT                = $C0; // NTFT uses high order bits
  1040.   {$EXTERNALSYM VALID_NTFT}
  1041. //
  1042. // The high bit of the partition type code indicates that a partition
  1043. // is part of an NTFT mirror or striped array.
  1044. //
  1045.   PARTITION_NTFT = $80; // NTFT partition
  1046.   {$EXTERNALSYM PARTITION_NTFT}
  1047. //
  1048. // The following macro is used to determine which partitions should be
  1049. // assigned drive letters.
  1050. //
  1051. //++
  1052. //
  1053. // BOOLEAN
  1054. // IsRecognizedPartition(
  1055. //     IN DWORD PartitionType
  1056. //     )
  1057. //
  1058. // Routine Description:
  1059. //
  1060. //     This macro is used to determine to which partitions drive letters
  1061. //     should be assigned.
  1062. //
  1063. // Arguments:
  1064. //
  1065. //     PartitionType - Supplies the type of the partition being examined.
  1066. //
  1067. // Return Value:
  1068. //
  1069. //     The return value is TRUE if the partition type is recognized,
  1070. //     otherwise FALSE is returned.
  1071. //
  1072. //--
  1073. function IsRecognizedPartition(PartitionType: DWORD): Boolean;
  1074. {$EXTERNALSYM IsRecognizedPartition}
  1075. //++
  1076. //
  1077. // BOOLEAN
  1078. // IsContainerPartition(
  1079. //     IN DWORD PartitionType
  1080. //     )
  1081. //
  1082. // Routine Description:
  1083. //
  1084. //     This macro is used to determine to which partition types are actually
  1085. //     containers for other partitions (ie, extended partitions).
  1086. //
  1087. // Arguments:
  1088. //
  1089. //     PartitionType - Supplies the type of the partition being examined.
  1090. //
  1091. // Return Value:
  1092. //
  1093. //     The return value is TRUE if the partition type is a container,
  1094. //     otherwise FALSE is returned.
  1095. //
  1096. //--
  1097. function IsContainerPartition(PartitionType: DWORD): Boolean;
  1098. {$EXTERNALSYM IsContainerPartition}
  1099. //++
  1100. //
  1101. // BOOLEAN
  1102. // IsFTPartition(
  1103. //     IN DWORD PartitionType
  1104. //     )
  1105. //
  1106. // Routine Description:
  1107. //
  1108. //     This macro is used to determine if the given partition is an FT
  1109. //     partition.
  1110. //
  1111. // Arguments:
  1112. //
  1113. //     PartitionType - Supplies the type of the partition being examined.
  1114. //
  1115. // Return Value:
  1116. //
  1117. //     The return value is TRUE if the partition type is an FT partition,
  1118. //     otherwise FALSE is returned.
  1119. //
  1120. //--
  1121. function IsFTPartition(PartitionType: DWORD): Boolean;
  1122. {$EXTERNALSYM IsFTPartition}
  1123. //
  1124. // Define the media types supported by the driver.
  1125. //
  1126. type
  1127.   _MEDIA_TYPE = (
  1128.     Unknown,                // Format is unknown
  1129.     F5_1Pt2_512,            // 5.25", 1.2MB,  512 bytes/sector
  1130.     F3_1Pt44_512,           // 3.5",  1.44MB, 512 bytes/sector
  1131.     F3_2Pt88_512,           // 3.5",  2.88MB, 512 bytes/sector
  1132.     F3_20Pt8_512,           // 3.5",  20.8MB, 512 bytes/sector
  1133.     F3_720_512,             // 3.5",  720KB,  512 bytes/sector
  1134.     F5_360_512,             // 5.25", 360KB,  512 bytes/sector
  1135.     F5_320_512,             // 5.25", 320KB,  512 bytes/sector
  1136.     F5_320_1024,            // 5.25", 320KB,  1024 bytes/sector
  1137.     F5_180_512,             // 5.25", 180KB,  512 bytes/sector
  1138.     F5_160_512,             // 5.25", 160KB,  512 bytes/sector
  1139.     RemovableMedia,         // Removable media other than floppy
  1140.     FixedMedia,             // Fixed hard disk media
  1141.     F3_120M_512,            // 3.5", 120M Floppy
  1142.     F3_640_512,             // 3.5" ,  640KB,  512 bytes/sector
  1143.     F5_640_512,             // 5.25",  640KB,  512 bytes/sector
  1144.     F5_720_512,             // 5.25",  720KB,  512 bytes/sector
  1145.     F3_1Pt2_512,            // 3.5" ,  1.2Mb,  512 bytes/sector
  1146.     F3_1Pt23_1024,          // 3.5" ,  1.23Mb, 1024 bytes/sector
  1147.     F5_1Pt23_1024,          // 5.25",  1.23MB, 1024 bytes/sector
  1148.     F3_128Mb_512,           // 3.5" MO 128Mb   512 bytes/sector
  1149.     F3_230Mb_512,           // 3.5" MO 230Mb   512 bytes/sector
  1150.     F8_256_128,             // 8",     256KB,  128 bytes/sector
  1151.     F3_200Mb_512,           // 3.5",   200M Floppy (HiFD)
  1152.     F3_240M_512,            // 3.5",   240Mb Floppy (HiFD)
  1153.     F3_32M_512);            // 3.5",   32Mb Floppy
  1154.   {$EXTERNALSYM _MEDIA_TYPE}
  1155.   MEDIA_TYPE = _MEDIA_TYPE;
  1156.   {$EXTERNALSYM MEDIA_TYPE}
  1157.   PMEDIA_TYPE = ^MEDIA_TYPE;
  1158.   {$EXTERNALSYM PMEDIA_TYPE}
  1159.   TMediaType = MEDIA_TYPE;
  1160.   PMediaType = PMEDIA_TYPE;
  1161. //
  1162. // Define the input buffer structure for the driver, when
  1163. // it is called with IOCTL_DISK_FORMAT_TRACKS.
  1164. //
  1165.   PFORMAT_PARAMETERS = ^FORMAT_PARAMETERS;
  1166.   {$EXTERNALSYM PFORMAT_PARAMETERS}
  1167.   _FORMAT_PARAMETERS = record
  1168.     MediaType: MEDIA_TYPE;
  1169.     StartCylinderNumber: DWORD;
  1170.     EndCylinderNumber: DWORD;
  1171.     StartHeadNumber: DWORD;
  1172.     EndHeadNumber: DWORD;
  1173.   end;
  1174.   {$EXTERNALSYM _FORMAT_PARAMETERS}
  1175.   FORMAT_PARAMETERS = _FORMAT_PARAMETERS;
  1176.   {$EXTERNALSYM FORMAT_PARAMETERS}
  1177.   TFormatParameters = FORMAT_PARAMETERS;
  1178.   PFormatParameters = PFORMAT_PARAMETERS;
  1179. //
  1180. // Define the BAD_TRACK_NUMBER type. An array of elements of this type is
  1181. // returned by the driver on IOCTL_DISK_FORMAT_TRACKS requests, to indicate
  1182. // what tracks were bad during formatting. The length of that array is
  1183. // reported in the `Information' field of the I/O Status Block.
  1184. //
  1185.   BAD_TRACK_NUMBER = WORD;
  1186.   {$EXTERNALSYM BAD_TRACK_NUMBER}
  1187.   PBAD_TRACK_NUMBER = ^WORD;
  1188.   {$EXTERNALSYM PBAD_TRACK_NUMBER}
  1189. //
  1190. // Define the input buffer structure for the driver, when
  1191. // it is called with IOCTL_DISK_FORMAT_TRACKS_EX.
  1192. //
  1193.   PFORMAT_EX_PARAMETERS = ^FORMAT_EX_PARAMETERS;
  1194.   {$EXTERNALSYM PFORMAT_EX_PARAMETERS}
  1195.   _FORMAT_EX_PARAMETERS = record
  1196.     MediaType: MEDIA_TYPE;
  1197.     StartCylinderNumber: DWORD;
  1198.     EndCylinderNumber: DWORD;
  1199.     StartHeadNumber: DWORD;
  1200.     EndHeadNumber: DWORD;
  1201.     FormatGapLength: WORD;
  1202.     SectorsPerTrack: WORD;
  1203.     SectorNumber: array [0..0] of WORD;
  1204.   end;
  1205.   {$EXTERNALSYM _FORMAT_EX_PARAMETERS}
  1206.   FORMAT_EX_PARAMETERS = _FORMAT_EX_PARAMETERS;
  1207.   {$EXTERNALSYM FORMAT_EX_PARAMETERS}
  1208.   TFormatExParameters = FORMAT_EX_PARAMETERS;
  1209.   PFormatExParameters = PFORMAT_EX_PARAMETERS;
  1210. //
  1211. // The following structure is returned on an IOCTL_DISK_GET_DRIVE_GEOMETRY
  1212. // request and an array of them is returned on an IOCTL_DISK_GET_MEDIA_TYPES
  1213. // request.
  1214. //
  1215.   PDISK_GEOMETRY = ^DISK_GEOMETRY;
  1216.   {$EXTERNALSYM PDISK_GEOMETRY}
  1217.   _DISK_GEOMETRY = record
  1218.     Cylinders: LARGE_INTEGER;
  1219.     MediaType: MEDIA_TYPE;
  1220.     TracksPerCylinder: DWORD;
  1221.     SectorsPerTrack: DWORD;
  1222.     BytesPerSector: DWORD;
  1223.   end;
  1224.   {$EXTERNALSYM _DISK_GEOMETRY}
  1225.   DISK_GEOMETRY = _DISK_GEOMETRY;
  1226.   {$EXTERNALSYM DISK_GEOMETRY}
  1227.   TDiskGeometry = DISK_GEOMETRY;
  1228.   PDiskGeometry = PDISK_GEOMETRY;
  1229. //
  1230. // This wmi guid returns a DISK_GEOMETRY structure
  1231. //
  1232. const
  1233.   WMI_DISK_GEOMETRY_GUID: TGUID = (
  1234.     D1:$25007f51; D2:$57c2; D3:$11d1; D4:($a5, $28, $00, $a0, $c9, $06, $29, $10));
  1235.   {$EXTERNALSYM WMI_DISK_GEOMETRY_GUID}
  1236. //
  1237. // The following structure is returned on an IOCTL_DISK_GET_PARTITION_INFO
  1238. // and an IOCTL_DISK_GET_DRIVE_LAYOUT request.  It is also used in a request
  1239. // to change the drive layout, IOCTL_DISK_SET_DRIVE_LAYOUT.
  1240. //
  1241. type
  1242.   PPARTITION_INFORMATION = ^PARTITION_INFORMATION;
  1243.   {$EXTERNALSYM PPARTITION_INFORMATION}
  1244.   _PARTITION_INFORMATION = record
  1245.     StartingOffset: LARGE_INTEGER;
  1246.     PartitionLength: LARGE_INTEGER;
  1247.     HiddenSectors: DWORD;
  1248.     PartitionNumber: DWORD;
  1249.     PartitionType: BYTE;
  1250.     BootIndicator: ByteBool;
  1251.     RecognizedPartition: ByteBool;
  1252.     RewritePartition: ByteBool;
  1253.   end;
  1254.   {$EXTERNALSYM _PARTITION_INFORMATION}
  1255.   PARTITION_INFORMATION = _PARTITION_INFORMATION;
  1256.   {$EXTERNALSYM PARTITION_INFORMATION}
  1257.   TPartitionInformation = PARTITION_INFORMATION;
  1258.   PPartitionInformation = PPARTITION_INFORMATION;
  1259. //
  1260. // The following structure is used to change the partition type of a
  1261. // specified disk partition using an IOCTL_DISK_SET_PARTITION_INFO
  1262. // request.
  1263. //
  1264.   PSET_PARTITION_INFORMATION = ^SET_PARTITION_INFORMATION;
  1265.   {$EXTERNALSYM PSET_PARTITION_INFORMATION}
  1266.   _SET_PARTITION_INFORMATION = record
  1267.     PartitionType: BYTE;
  1268.   end;
  1269.   {$EXTERNALSYM _SET_PARTITION_INFORMATION}
  1270.   SET_PARTITION_INFORMATION = _SET_PARTITION_INFORMATION;
  1271.   {$EXTERNALSYM SET_PARTITION_INFORMATION}
  1272.   TSetPartitionInformation = _SET_PARTITION_INFORMATION;
  1273.   PSetPartitionInformation = PSET_PARTITION_INFORMATION;
  1274. //
  1275. // The following structures is returned on an IOCTL_DISK_GET_DRIVE_LAYOUT
  1276. // request and given as input to an IOCTL_DISK_SET_DRIVE_LAYOUT request.
  1277. //
  1278.   PDRIVE_LAYOUT_INFORMATION = ^DRIVE_LAYOUT_INFORMATION;
  1279.   {$EXTERNALSYM PDRIVE_LAYOUT_INFORMATION}
  1280.   _DRIVE_LAYOUT_INFORMATION = record
  1281.     PartitionCount: DWORD;
  1282.     Signature: DWORD;
  1283.     PartitionEntry: array [0..0] of PARTITION_INFORMATION;
  1284.   end;
  1285.   {$EXTERNALSYM _DRIVE_LAYOUT_INFORMATION}
  1286.   DRIVE_LAYOUT_INFORMATION = _DRIVE_LAYOUT_INFORMATION;
  1287.   {$EXTERNALSYM DRIVE_LAYOUT_INFORMATION}
  1288.   TDriveLayoutInformation = DRIVE_LAYOUT_INFORMATION;
  1289.   PDriveLayoutInformation = PDRIVE_LAYOUT_INFORMATION;
  1290. //
  1291. // The following structure is passed in on an IOCTL_DISK_VERIFY request.
  1292. // The offset and length parameters are both given in bytes.
  1293. //
  1294.   PVERIFY_INFORMATION = ^VERIFY_INFORMATION;
  1295.   {$EXTERNALSYM PVERIFY_INFORMATION}
  1296.   _VERIFY_INFORMATION = record
  1297.     StartingOffset: LARGE_INTEGER;
  1298.     Length: DWORD;
  1299.   end;
  1300.   {$EXTERNALSYM _VERIFY_INFORMATION}
  1301.   VERIFY_INFORMATION = _VERIFY_INFORMATION;
  1302.   {$EXTERNALSYM VERIFY_INFORMATION}
  1303.   TVerifyInformation = VERIFY_INFORMATION;
  1304.   PVerifyInformation = PVERIFY_INFORMATION;
  1305. //
  1306. // The following structure is passed in on an IOCTL_DISK_REASSIGN_BLOCKS
  1307. // request.
  1308. //
  1309.   PREASSIGN_BLOCKS = ^REASSIGN_BLOCKS;
  1310.   {$EXTERNALSYM PREASSIGN_BLOCKS}
  1311.   _REASSIGN_BLOCKS = record
  1312.     Reserved: WORD;
  1313.     Count: WORD;
  1314.     BlockNumber: array [0..0] of DWORD;
  1315.   end;
  1316.   {$EXTERNALSYM _REASSIGN_BLOCKS}
  1317.   REASSIGN_BLOCKS = _REASSIGN_BLOCKS;
  1318.   {$EXTERNALSYM REASSIGN_BLOCKS}
  1319.   TReassignBlocks = REASSIGN_BLOCKS;
  1320.   PReassignBlocks = PREASSIGN_BLOCKS;
  1321. //
  1322. // Support for GUID Partition Table (GPT) disks.
  1323. //
  1324. //
  1325. // There are currently two ways a disk can be partitioned. With a traditional
  1326. // AT-style master boot record (PARTITION_STYLE_MBR) and with a new, GPT
  1327. // partition table (PARTITION_STYLE_GPT). RAW is for an unrecognizable
  1328. // partition style. There are a very limited number of things you can
  1329. // do with a RAW partititon.
  1330. //
  1331. type
  1332.   _PARTITION_STYLE = (
  1333.     PARTITION_STYLE_MBR,
  1334.     PARTITION_STYLE_GPT,
  1335.     PARTITION_STYLE_RAW);
  1336.   {$EXTERNALSYM _PARTITION_STYLE}
  1337.   PARTITION_STYLE = _PARTITION_STYLE;
  1338.   {$EXTERNALSYM PARTITION_STYLE}
  1339.   TPartitionStyle = PARTITION_STYLE;
  1340. //
  1341. // The following structure defines information in a GPT partition that is
  1342. // not common to both GPT and MBR partitions.
  1343. //
  1344.   PPARTITION_INFORMATION_GPT = ^PARTITION_INFORMATION_GPT;
  1345.   {$EXTERNALSYM PPARTITION_INFORMATION_GPT}
  1346.   _PARTITION_INFORMATION_GPT = record
  1347.     PartitionType: GUID; // Partition type. See table 16-3.
  1348.     PartitionId: GUID; // Unique GUID for this partition.
  1349.     Attributes: DWORD64; // See table 16-4.
  1350.     Name: array [0..35] of WCHAR; // Partition Name in Unicode.
  1351.   end;
  1352.   {$EXTERNALSYM _PARTITION_INFORMATION_GPT}
  1353.   PARTITION_INFORMATION_GPT = _PARTITION_INFORMATION_GPT;
  1354.   {$EXTERNALSYM PARTITION_INFORMATION_GPT}
  1355.   TPartitionInformationGpt = PARTITION_INFORMATION_GPT;
  1356.   PPartitionInformationGpt = PPARTITION_INFORMATION_GPT;
  1357. //
  1358. //  The following are GPT partition attributes applicable for any
  1359. //  partition type. These attributes are not OS-specific
  1360. //
  1361. const
  1362.   GPT_ATTRIBUTE_PLATFORM_REQUIRED = ($0000000000000001);
  1363.   {$EXTERNALSYM GPT_ATTRIBUTE_PLATFORM_REQUIRED}
  1364. //
  1365. // The following are GPT partition attributes applicable when the
  1366. // PartitionType is PARTITION_BASIC_DATA_GUID.
  1367. //
  1368.   GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER = DWORD($8000000000000000);
  1369.   {$EXTERNALSYM GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER}
  1370.   GPT_BASIC_DATA_ATTRIBUTE_HIDDEN          = ($4000000000000000);
  1371.   {$EXTERNALSYM GPT_BASIC_DATA_ATTRIBUTE_HIDDEN}
  1372.   GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY       = ($1000000000000000);
  1373.   {$EXTERNALSYM GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY}
  1374. //
  1375. // The following structure defines information in an MBR partition that is not
  1376. // common to both GPT and MBR partitions.
  1377. //
  1378. type
  1379.   PPARTITION_INFORMATION_MBR = ^PARTITION_INFORMATION_MBR;
  1380.   {$EXTERNALSYM PPARTITION_INFORMATION_MBR}
  1381.   _PARTITION_INFORMATION_MBR = record
  1382.     PartitionType: BYTE;
  1383.     BootIndicator: BOOLEAN;
  1384.     RecognizedPartition: BOOLEAN;
  1385.     HiddenSectors: DWORD;
  1386.   end;
  1387.   {$EXTERNALSYM _PARTITION_INFORMATION_MBR}
  1388.   PARTITION_INFORMATION_MBR = _PARTITION_INFORMATION_MBR;
  1389.   {$EXTERNALSYM PARTITION_INFORMATION_MBR}
  1390.   TPartitionInformationMbr = PARTITION_INFORMATION_MBR;
  1391.   PPartitionInformationMbr = PPARTITION_INFORMATION_MBR;
  1392. //
  1393. // The structure SET_PARTITION_INFO_EX is used with the ioctl
  1394. // IOCTL_SET_PARTITION_INFO_EX to set information about a specific
  1395. // partition. Note that for MBR partitions, you can only set the partition
  1396. // signature, whereas GPT partitions allow setting of all fields that
  1397. // you can get.
  1398. //
  1399.   SET_PARTITION_INFORMATION_MBR = SET_PARTITION_INFORMATION;
  1400.   {$EXTERNALSYM SET_PARTITION_INFORMATION_MBR}
  1401.   TSetPartitionInformationMbr = SET_PARTITION_INFORMATION_MBR;
  1402.   SET_PARTITION_INFORMATION_GPT = PARTITION_INFORMATION_GPT;
  1403.   {$EXTERNALSYM SET_PARTITION_INFORMATION_GPT}
  1404.   TSetPartitionInformationGpt = SET_PARTITION_INFORMATION_GPT;
  1405.   PSET_PARTITION_INFORMATION_EX = ^SET_PARTITION_INFORMATION_EX;
  1406.   {$EXTERNALSYM PSET_PARTITION_INFORMATION_EX}
  1407.   _SET_PARTITION_INFORMATION_EX = record
  1408.     PartitionStyle: PARTITION_STYLE;
  1409.     case Integer of
  1410.       0: (Mbr: SET_PARTITION_INFORMATION_MBR);
  1411.       1: (Gpt: SET_PARTITION_INFORMATION_GPT);
  1412.   end;
  1413.   {$EXTERNALSYM _SET_PARTITION_INFORMATION_EX}
  1414.   SET_PARTITION_INFORMATION_EX = _SET_PARTITION_INFORMATION_EX;
  1415.   {$EXTERNALSYM SET_PARTITION_INFORMATION_EX}
  1416.   TSetPartitionInformationEx = SET_PARTITION_INFORMATION_EX;
  1417.   PSetPartitionInformationEx = PSET_PARTITION_INFORMATION_EX;
  1418. //
  1419. // The structure CREATE_DISK_GPT with the ioctl IOCTL_DISK_CREATE_DISK
  1420. // to initialize an virgin disk with an empty GPT partition table.
  1421. //
  1422.   PCREATE_DISK_GPT = ^CREATE_DISK_GPT;
  1423.   {$EXTERNALSYM PCREATE_DISK_GPT}
  1424.   _CREATE_DISK_GPT = record
  1425.     DiskId: GUID; // Unique disk id for the disk.
  1426.     MaxPartitionCount: DWORD; // Maximim number of partitions allowable.
  1427.   end;
  1428.   {$EXTERNALSYM _CREATE_DISK_GPT}
  1429.   CREATE_DISK_GPT = _CREATE_DISK_GPT;
  1430.   {$EXTERNALSYM CREATE_DISK_GPT}
  1431.   TCreateDiskGpt = CREATE_DISK_GPT;
  1432.   PCreateDiskGpt = PCREATE_DISK_GPT;
  1433. //
  1434. // The structure CREATE_DISK_MBR with the ioctl IOCTL_DISK_CREATE_DISK
  1435. // to initialize an virgin disk with an empty MBR partition table.
  1436. //
  1437.   PCREATE_DISK_MBR = ^CREATE_DISK_MBR;
  1438.   {$EXTERNALSYM PCREATE_DISK_MBR}
  1439.   _CREATE_DISK_MBR = record
  1440.     Signature: DWORD;
  1441.   end;
  1442.   {$EXTERNALSYM _CREATE_DISK_MBR}
  1443.   CREATE_DISK_MBR = _CREATE_DISK_MBR;
  1444.   {$EXTERNALSYM CREATE_DISK_MBR}
  1445.   TCreateDiskMbr = CREATE_DISK_MBR;
  1446.   PCreateDiskMbr = PCREATE_DISK_MBR;
  1447.   PCREATE_DISK = ^CREATE_DISK;
  1448.   {$EXTERNALSYM PCREATE_DISK}
  1449.   _CREATE_DISK = record
  1450.     PartitionStyle: PARTITION_STYLE;
  1451.     case Integer of
  1452.       0: (Mbr: CREATE_DISK_MBR);
  1453.       1: (Gpt: CREATE_DISK_GPT);
  1454.   end;
  1455.   {$EXTERNALSYM _CREATE_DISK}
  1456.   CREATE_DISK = _CREATE_DISK;
  1457.   {$EXTERNALSYM CREATE_DISK}
  1458.   TCreateDisk = CREATE_DISK;
  1459.   PCreateDisk = PCREATE_DISK;
  1460. //
  1461. // The structure GET_LENGTH_INFORMATION is used with the ioctl
  1462. // IOCTL_DISK_GET_LENGTH_INFO to obtain the length, in bytes, of the
  1463. // disk, partition, or volume.
  1464. //
  1465.   PGET_LENGTH_INFORMATION = ^GET_LENGTH_INFORMATION;
  1466.   {$EXTERNALSYM PGET_LENGTH_INFORMATION}
  1467.   _GET_LENGTH_INFORMATION = record
  1468.     Length: LARGE_INTEGER;
  1469.   end;
  1470.   {$EXTERNALSYM _GET_LENGTH_INFORMATION}
  1471.   GET_LENGTH_INFORMATION = _GET_LENGTH_INFORMATION;
  1472.   {$EXTERNALSYM GET_LENGTH_INFORMATION}
  1473.   TGetLengthInformation = GET_LENGTH_INFORMATION;
  1474.   PGetLengthInformation = PGET_LENGTH_INFORMATION;
  1475. //
  1476. // The PARTITION_INFORMATION_EX structure is used with the
  1477. // IOCTL_DISK_GET_DRIVE_LAYOUT_EX, IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
  1478. // IOCTL_DISK_GET_PARTITION_INFO_EX and IOCTL_DISK_GET_PARTITION_INFO_EX calls.
  1479. //
  1480.   PPARTITION_INFORMATION_EX = ^PARTITION_INFORMATION_EX;
  1481.   {$EXTERNALSYM PPARTITION_INFORMATION_EX}
  1482.   _PARTITION_INFORMATION_EX = record
  1483.     PartitionStyle: PARTITION_STYLE;
  1484.     StartingOffset: LARGE_INTEGER;
  1485.     PartitionLength: LARGE_INTEGER;
  1486.     PartitionNumber: DWORD;
  1487.     RewritePartition: BOOLEAN;
  1488.     case Integer of
  1489.       0: (Mbr: PARTITION_INFORMATION_MBR);
  1490.       1: (Gpt: PARTITION_INFORMATION_GPT);
  1491.   end;
  1492.   {$EXTERNALSYM _PARTITION_INFORMATION_EX}
  1493.   PARTITION_INFORMATION_EX = _PARTITION_INFORMATION_EX;
  1494.   {$EXTERNALSYM PARTITION_INFORMATION_EX}
  1495.   TPartitionInformationEx = PARTITION_INFORMATION_EX;
  1496.   PPartitionInformationEx = PPARTITION_INFORMATION_EX;
  1497. //
  1498. // GPT specific drive layout information.
  1499. //
  1500.   PDRIVE_LAYOUT_INFORMATION_GPT = ^DRIVE_LAYOUT_INFORMATION_GPT;
  1501.   {$EXTERNALSYM PDRIVE_LAYOUT_INFORMATION_GPT}
  1502.   _DRIVE_LAYOUT_INFORMATION_GPT = record
  1503.     DiskId: GUID;
  1504.     StartingUsableOffset: LARGE_INTEGER;
  1505.     UsableLength: LARGE_INTEGER;
  1506.     MaxPartitionCount: DWORD;
  1507.   end;
  1508.   {$EXTERNALSYM _DRIVE_LAYOUT_INFORMATION_GPT}
  1509.   DRIVE_LAYOUT_INFORMATION_GPT = _DRIVE_LAYOUT_INFORMATION_GPT;
  1510.   {$EXTERNALSYM DRIVE_LAYOUT_INFORMATION_GPT}
  1511.   TDriveLayoutInformationGpt = DRIVE_LAYOUT_INFORMATION_GPT;
  1512.   PDriveLayoutInformationGpt = PDRIVE_LAYOUT_INFORMATION_GPT;
  1513. //
  1514. // MBR specific drive layout information.
  1515. //
  1516.   PDRIVE_LAYOUT_INFORMATION_MBR = ^DRIVE_LAYOUT_INFORMATION_MBR;
  1517.   {$EXTERNALSYM PDRIVE_LAYOUT_INFORMATION_MBR}
  1518.   _DRIVE_LAYOUT_INFORMATION_MBR = record
  1519.     Signature: DWORD;
  1520.   end;
  1521.   {$EXTERNALSYM _DRIVE_LAYOUT_INFORMATION_MBR}
  1522.   DRIVE_LAYOUT_INFORMATION_MBR = _DRIVE_LAYOUT_INFORMATION_MBR;
  1523.   {$EXTERNALSYM DRIVE_LAYOUT_INFORMATION_MBR}
  1524.   TDriveLayoutInformationMbr = DRIVE_LAYOUT_INFORMATION_MBR;
  1525.   PDriveLayoutInformationMbr = PDRIVE_LAYOUT_INFORMATION_MBR;
  1526. //
  1527. // The structure DRIVE_LAYOUT_INFORMATION_EX is used with the
  1528. // IOCTL_SET_DRIVE_LAYOUT_EX and IOCTL_GET_DRIVE_LAYOUT_EX calls.
  1529. //
  1530.   PDRIVE_LAYOUT_INFORMATION_EX = ^DRIVE_LAYOUT_INFORMATION_EX;
  1531.   {$EXTERNALSYM PDRIVE_LAYOUT_INFORMATION_EX}
  1532.   _DRIVE_LAYOUT_INFORMATION_EX = record
  1533.     PartitionStyle: DWORD;
  1534.     PartitionCount: DWORD;
  1535.     Union: record
  1536.       case Integer of
  1537.         0: (Mbr: DRIVE_LAYOUT_INFORMATION_MBR);
  1538.         1: (Gpt: DRIVE_LAYOUT_INFORMATION_GPT);
  1539.     end;
  1540.     PartitionEntry: array [0..0] of PARTITION_INFORMATION_EX;
  1541.   end;
  1542.   {$EXTERNALSYM _DRIVE_LAYOUT_INFORMATION_EX}
  1543.   DRIVE_LAYOUT_INFORMATION_EX = _DRIVE_LAYOUT_INFORMATION_EX;
  1544.   {$EXTERNALSYM DRIVE_LAYOUT_INFORMATION_EX}
  1545.   TDriveLayoutInformationEx = DRIVE_LAYOUT_INFORMATION_EX;
  1546.   PDriveLayoutInformationEx = PDRIVE_LAYOUT_INFORMATION_EX;
  1547. //
  1548. // The DISK_GEOMETRY_EX structure is returned on issuing an
  1549. // IOCTL_DISK_GET_DRIVE_GEOMETRY_EX ioctl.
  1550. //
  1551.   _DETECTION_TYPE = (
  1552.     DetectNone,
  1553.     DetectInt13,
  1554.     DetectExInt13);
  1555.   {$EXTERNALSYM _DETECTION_TYPE}
  1556.   DETECTION_TYPE = _DETECTION_TYPE;
  1557.   {$EXTERNALSYM DETECTION_TYPE}
  1558.   TDetectionType = DETECTION_TYPE;
  1559.   PDISK_INT13_INFO = ^DISK_INT13_INFO;
  1560.   {$EXTERNALSYM PDISK_INT13_INFO}
  1561.   _DISK_INT13_INFO = record
  1562.     DriveSelect: WORD;
  1563.     MaxCylinders: DWORD;
  1564.     SectorsPerTrack: WORD;
  1565.     MaxHeads: WORD;
  1566.     NumberDrives: WORD;
  1567.   end;
  1568.   {$EXTERNALSYM _DISK_INT13_INFO}
  1569.   DISK_INT13_INFO = _DISK_INT13_INFO;
  1570.   {$EXTERNALSYM DISK_INT13_INFO}
  1571.   TDiskInt13Info = DISK_INT13_INFO;
  1572.   PDiskInt13Info = PDISK_INT13_INFO;
  1573.   PDISK_EX_INT13_INFO = ^DISK_EX_INT13_INFO;
  1574.   {$EXTERNALSYM PDISK_EX_INT13_INFO}
  1575.   _DISK_EX_INT13_INFO = record
  1576.     ExBufferSize: WORD;
  1577.     ExFlags: WORD;
  1578.     ExCylinders: DWORD;
  1579.     ExHeads: DWORD;
  1580.     ExSectorsPerTrack: DWORD;
  1581.     ExSectorsPerDrive: DWORD64;
  1582.     ExSectorSize: WORD;
  1583.     ExReserved: WORD;
  1584.   end;
  1585.   {$EXTERNALSYM _DISK_EX_INT13_INFO}
  1586.   DISK_EX_INT13_INFO = _DISK_EX_INT13_INFO;
  1587.   {$EXTERNALSYM DISK_EX_INT13_INFO}
  1588.   TDiskExInt13Info = DISK_EX_INT13_INFO;
  1589.   PDiskExInt13Info = PDISK_EX_INT13_INFO;
  1590.   PDISK_DETECTION_INFO = ^DISK_DETECTION_INFO;
  1591.   {$EXTERNALSYM PDISK_DETECTION_INFO}
  1592.   _DISK_DETECTION_INFO = record
  1593.     SizeOfDetectInfo: DWORD;
  1594.     DetectionType: DETECTION_TYPE;
  1595.     case Integer of
  1596.       0: (
  1597.         //
  1598.         // If DetectionType == DETECTION_INT13 then we have just the Int13
  1599.         // information.
  1600.         //
  1601.         Int13: DISK_INT13_INFO;
  1602.         //
  1603.         // If DetectionType == DETECTION_EX_INT13, then we have the
  1604.         // extended int 13 information.
  1605.         //
  1606.         ExInt13: DISK_EX_INT13_INFO); // If DetectionType == DetectExInt13
  1607.   end;
  1608.   {$EXTERNALSYM _DISK_DETECTION_INFO}
  1609.   DISK_DETECTION_INFO = _DISK_DETECTION_INFO;
  1610.   {$EXTERNALSYM DISK_DETECTION_INFO}
  1611.   TDiskDetectionInfo = DISK_DETECTION_INFO;
  1612.   PDiskDetectionInfo = PDISK_DETECTION_INFO;
  1613.   PDISK_PARTITION_INFO = ^DISK_PARTITION_INFO;
  1614.   {$EXTERNALSYM PDISK_PARTITION_INFO}
  1615.   _DISK_PARTITION_INFO = record
  1616.     SizeOfPartitionInfo: DWORD;
  1617.     PartitionStyle: PARTITION_STYLE; // PartitionStyle = RAW, GPT or MBR
  1618.     case Integer of
  1619.       0: (                           // If PartitionStyle == MBR
  1620.         Signature: DWORD; // MBR Signature
  1621.         CheckSum: DWORD); // MBR CheckSum
  1622.       1: (                           // If PartitionStyle == GPT
  1623.         DiskId: GUID);
  1624.   end;
  1625.   {$EXTERNALSYM _DISK_PARTITION_INFO}
  1626.   DISK_PARTITION_INFO = _DISK_PARTITION_INFO;
  1627.   {$EXTERNALSYM DISK_PARTITION_INFO}
  1628.   TDiskPartitionInfo = DISK_PARTITION_INFO;
  1629.   PDiskPartitionInfo = PDISK_PARTITION_INFO;
  1630. //
  1631. // The Geometry structure is a variable length structure composed of a
  1632. // DISK_GEOMETRY_EX structure followed by a DISK_PARTITION_INFO structure
  1633. // followed by a DISK_DETECTION_DATA structure.
  1634. //
  1635. function DiskGeometryGetPartition(Geometry: DWORD): PDISK_PARTITION_INFO;
  1636. {$EXTERNALSYM DiskGeometryGetPartition}
  1637. function DiskGeometryGetDetect(Geometry: DWORD): PDISK_DETECTION_INFO;
  1638. {$EXTERNALSYM DiskGeometryGetDetect}
  1639. type
  1640.   PDISK_GEOMETRY_EX = ^DISK_GEOMETRY_EX;
  1641.   {$EXTERNALSYM PDISK_GEOMETRY_EX}
  1642.   _DISK_GEOMETRY_EX = record
  1643.     Geometry: DISK_GEOMETRY;    // Standard disk geometry: may be faked by driver.
  1644.     DiskSize: LARGE_INTEGER;    // Must always be correct
  1645.     Data: array [0..0] of BYTE; // Partition, Detect info
  1646.   end;
  1647.   {$EXTERNALSYM _DISK_GEOMETRY_EX}
  1648.   DISK_GEOMETRY_EX = _DISK_GEOMETRY_EX;
  1649.   {$EXTERNALSYM DISK_GEOMETRY_EX}
  1650.   TDiskGeometryEx = DISK_GEOMETRY_EX;
  1651.   PDiskGeometryEx = PDISK_GEOMETRY_EX;
  1652. //
  1653. // IOCTL_DISK_CONTROLLER_NUMBER returns the controller and disk
  1654. // number for the handle.  This is used to determine if a disk
  1655. // is attached to the primary or secondary IDE controller.
  1656. //
  1657.   PDISK_CONTROLLER_NUMBER = ^DISK_CONTROLLER_NUMBER;
  1658.   {$EXTERNALSYM PDISK_CONTROLLER_NUMBER}
  1659.   _DISK_CONTROLLER_NUMBER = record
  1660.     ControllerNumber: DWORD;
  1661.     DiskNumber: DWORD;
  1662.   end;
  1663.   {$EXTERNALSYM _DISK_CONTROLLER_NUMBER}
  1664.   DISK_CONTROLLER_NUMBER = _DISK_CONTROLLER_NUMBER;
  1665.   {$EXTERNALSYM DISK_CONTROLLER_NUMBER}
  1666.   TDiskControllerNumber = DISK_CONTROLLER_NUMBER;
  1667.   PDiskControllerNumber = PDISK_CONTROLLER_NUMBER;
  1668. //
  1669. // IOCTL_DISK_SET_CACHE allows the caller to get or set the state of the disk
  1670. // read/write caches.
  1671. //
  1672. // If the structure is provided as the input buffer for the ioctl the read &
  1673. // write caches will be enabled or disabled depending on the parameters
  1674. // provided.
  1675. //
  1676. // If the structure is provided as an output buffer for the ioctl the state
  1677. // of the read & write caches will be returned. If both input and outut buffers
  1678. // are provided the output buffer will contain the cache state BEFORE any
  1679. // changes are made
  1680. //
  1681.   DISK_CACHE_RETENTION_PRIORITY = (EqualPriority, KeepPrefetchedData, KeepReadData);
  1682.   {$EXTERNALSYM DISK_CACHE_RETENTION_PRIORITY}
  1683.   TDiskCacheRetentionPriority = DISK_CACHE_RETENTION_PRIORITY;
  1684.   _DISK_WRITE_CACHE_STATE = (
  1685.     DiskWriteCacheNormal,
  1686.     DiskWriteCacheForceDisable,
  1687.     DiskWriteCacheDisableNotSupported);
  1688.   {$EXTERNALSYM _DISK_WRITE_CACHE_STATE}
  1689.   DISK_WRITE_CACHE_STATE = _DISK_WRITE_CACHE_STATE;
  1690.   {$EXTERNALSYM DISK_WRITE_CACHE_STATE}
  1691.   PDISK_WRITE_CACHE_STATE = ^DISK_WRITE_CACHE_STATE;
  1692.   {$EXTERNALSYM PDISK_WRITE_CACHE_STATE}
  1693.   TDiskWriteCacheState = DISK_WRITE_CACHE_STATE;
  1694.   PDiskWriteCacheState = PDISK_WRITE_CACHE_STATE;
  1695.   TDCIScalarPrefetch = record
  1696.     Minimum: WORD;
  1697.     Maximum: WORD;
  1698.     //
  1699.     // The maximum number of blocks which will be prefetched - useful
  1700.     // with the scalar limits to set definite upper limits.
  1701.     //
  1702.     MaximumBlocks: WORD;
  1703.   end;
  1704.   TDCIBlockPrefetch = record
  1705.     Minimum: WORD;
  1706.     Maximum: WORD;
  1707.   end;
  1708.   PDISK_CACHE_INFORMATION = ^DISK_CACHE_INFORMATION;
  1709.   {$EXTERNALSYM PDISK_CACHE_INFORMATION}
  1710.   _DISK_CACHE_INFORMATION = record
  1711.     //
  1712.     // on return indicates that the device is capable of saving any parameters
  1713.     // in non-volatile storage.  On send indicates that the device should
  1714.     // save the state in non-volatile storage.
  1715.     //
  1716.     ParametersSavable: ByteBool;
  1717.     //
  1718.     // Indicates whether the write and read caches are enabled.
  1719.     //
  1720.     ReadCacheEnabled: ByteBool;
  1721.     WriteCacheEnabled: ByteBool;
  1722.     //
  1723.     // Controls the likelyhood of data remaining in the cache depending on how
  1724.     // it got there.  Data cached from a READ or WRITE operation may be given
  1725.     // higher, lower or equal priority to data entered into the cache for other
  1726.     // means (like prefetch)
  1727.     //
  1728.     ReadRetentionPriority: DISK_CACHE_RETENTION_PRIORITY;
  1729.     WriteRetentionPriority: DISK_CACHE_RETENTION_PRIORITY;
  1730.     //
  1731.     // Requests for a larger number of blocks than this may have prefetching
  1732.     // disabled.  If this value is set to 0 prefetch will be disabled.
  1733.     //
  1734.     DisablePrefetchTransferLength: WORD;
  1735.     //
  1736.     // If TRUE then ScalarPrefetch (below) will be valid.  If FALSE then
  1737.     // the minimum and maximum values should be treated as a block count
  1738.     // (BlockPrefetch)
  1739.     //
  1740.     PrefetchScalar: ByteBool;
  1741.     //
  1742.     // Contains the minimum and maximum amount of data which will be
  1743.     // will be prefetched into the cache on a disk operation.  This value
  1744.     // may either be a scalar multiplier of the transfer length of the request,
  1745.     // or an abolute number of disk blocks.  PrefetchScalar (above) indicates
  1746.     // which interpretation is used.
  1747.     //
  1748.     case Integer of
  1749.       0: (ScalarPrefetch: TDCIScalarPrefetch);
  1750.       1: (BlockPrefetch: TDCIBlockPrefetch);
  1751.   end;
  1752.   {$EXTERNALSYM _DISK_CACHE_INFORMATION}
  1753.   DISK_CACHE_INFORMATION = _DISK_CACHE_INFORMATION;
  1754.   {$EXTERNALSYM DISK_CACHE_INFORMATION}
  1755.   TDiskCacheInformation = DISK_CACHE_INFORMATION;
  1756.   PDiskCacheInformation = PDISK_CACHE_INFORMATION;
  1757. //
  1758. // IOCTL_DISK_GROW_PARTITION will update the size of a partition
  1759. // by adding sectors to the length. The number of sectors must be
  1760. // predetermined by examining PARTITION_INFORMATION.
  1761. //
  1762.   PDISK_GROW_PARTITION = ^DISK_GROW_PARTITION;
  1763.   {$EXTERNALSYM PDISK_GROW_PARTITION}
  1764.   _DISK_GROW_PARTITION = record
  1765.     PartitionNumber: DWORD;
  1766.     BytesToGrow: LARGE_INTEGER;
  1767.   end;
  1768.   {$EXTERNALSYM _DISK_GROW_PARTITION}
  1769.   DISK_GROW_PARTITION = _DISK_GROW_PARTITION;
  1770.   {$EXTERNALSYM DISK_GROW_PARTITION}
  1771.   TDiskGrowPartition = DISK_GROW_PARTITION;
  1772.   PDiskGrowPartition = PDISK_GROW_PARTITION;
  1773. ///////////////////////////////////////////////////////
  1774. //                                                   //
  1775. // The following structures define disk performance  //
  1776. // statistics: specifically the locations of all the //
  1777. // reads and writes which have occured on the disk.  //
  1778. //                                                   //
  1779. // To use these structures, you must issue an IOCTL_ //
  1780. // DISK_HIST_STRUCTURE (with a DISK_HISTOGRAM) to    //
  1781. // obtain the basic histogram information. The       //
  1782. // number of buckets which must allocated is part of //
  1783. // this structure. Allocate the required number of   //
  1784. // buckets and call an IOCTL_DISK_HIST_DATA to fill  //
  1785. // in the data                                       //
  1786. //                                                   //
  1787. ///////////////////////////////////////////////////////
  1788. const
  1789.   HIST_NO_OF_BUCKETS = 24;
  1790.   {$EXTERNALSYM HIST_NO_OF_BUCKETS}
  1791. type
  1792.   PHISTOGRAM_BUCKET = ^HISTOGRAM_BUCKET;
  1793.   {$EXTERNALSYM PHISTOGRAM_BUCKET}
  1794.   _HISTOGRAM_BUCKET = record
  1795.     Reads: DWORD;
  1796.     Writes: DWORD;
  1797.   end;
  1798.   {$EXTERNALSYM _HISTOGRAM_BUCKET}
  1799.   HISTOGRAM_BUCKET = _HISTOGRAM_BUCKET;
  1800.   {$EXTERNALSYM HISTOGRAM_BUCKET}
  1801.   THistogramBucket = HISTOGRAM_BUCKET;
  1802.   PHistogramBucket = PHISTOGRAM_BUCKET;
  1803. const
  1804.   HISTOGRAM_BUCKET_SIZE = SizeOf(HISTOGRAM_BUCKET);
  1805.   {$EXTERNALSYM HISTOGRAM_BUCKET_SIZE}
  1806. type
  1807.   PDISK_HISTOGRAM = ^DISK_HISTOGRAM;
  1808.   {$EXTERNALSYM PDISK_HISTOGRAM}
  1809.   _DISK_HISTOGRAM = record
  1810.     DiskSize: LARGE_INTEGER;
  1811.     Start: LARGE_INTEGER;
  1812.     End_: LARGE_INTEGER;
  1813.     Average: LARGE_INTEGER;
  1814.     AverageRead: LARGE_INTEGER;
  1815.     AverageWrite: LARGE_INTEGER;
  1816.     Granularity: DWORD;
  1817.     Size: DWORD;
  1818.     ReadCount: DWORD;
  1819.     WriteCount: DWORD;
  1820.     Histogram: PHISTOGRAM_BUCKET;
  1821.   end;
  1822.   {$EXTERNALSYM _DISK_HISTOGRAM}
  1823.   DISK_HISTOGRAM = _DISK_HISTOGRAM;
  1824.   {$EXTERNALSYM DISK_HISTOGRAM}
  1825.   TDiskHistogram = DISK_HISTOGRAM;
  1826.   PDiskHistogram = PDISK_HISTOGRAM;
  1827. const
  1828.   DISK_HISTOGRAM_SIZE = SizeOf(DISK_HISTOGRAM);
  1829.   {$EXTERNALSYM DISK_HISTOGRAM_SIZE}
  1830. ///////////////////////////////////////////////////////
  1831. //                                                   //
  1832. // The following structures define disk debugging    //
  1833. // capabilities. The IOCTLs are directed to one of   //
  1834. // the two disk filter drivers.                      //
  1835. //                                                   //
  1836. // DISKPERF is a utilty for collecting disk request  //
  1837. // statistics.                                       //
  1838. //                                                   //
  1839. // SIMBAD is a utility for injecting faults in       //
  1840. // IO requests to disks.                             //
  1841. //                                                   //
  1842. ///////////////////////////////////////////////////////
  1843. //
  1844. // The following structure is exchanged on an IOCTL_DISK_GET_PERFORMANCE
  1845. // request. This ioctl collects summary disk request statistics used
  1846. // in measuring performance.
  1847. //
  1848. type
  1849.   PDISK_PERFORMANCE = ^DISK_PERFORMANCE;
  1850.   {$EXTERNALSYM PDISK_PERFORMANCE}
  1851.   _DISK_PERFORMANCE = record
  1852.     BytesRead: LARGE_INTEGER;
  1853.     BytesWritten: LARGE_INTEGER;
  1854.     ReadTime: LARGE_INTEGER;
  1855.     WriteTime: LARGE_INTEGER;
  1856.     IdleTime: LARGE_INTEGER;
  1857.     ReadCount: DWORD;
  1858.     WriteCount: DWORD;
  1859.     QueueDepth: DWORD;
  1860.     SplitCount: DWORD;
  1861.     QueryTime: LARGE_INTEGER;
  1862.     StorageDeviceNumber: DWORD;
  1863.     StorageManagerName: array [0..7] of WCHAR;
  1864.   end;
  1865.   {$EXTERNALSYM _DISK_PERFORMANCE}
  1866.   DISK_PERFORMANCE = _DISK_PERFORMANCE;
  1867.   {$EXTERNALSYM DISK_PERFORMANCE}
  1868.   TDiskPerformance = DISK_PERFORMANCE;
  1869.   PDiskPerformance = PDISK_PERFORMANCE;
  1870. //
  1871. // This structure defines the disk logging record. When disk logging
  1872. // is enabled, one of these is written to an internal buffer for each
  1873. // disk request.
  1874. //
  1875.   PDISK_RECORD = ^DISK_RECORD;
  1876.   {$EXTERNALSYM PDISK_RECORD}
  1877.   _DISK_RECORD = record
  1878.     ByteOffset: LARGE_INTEGER;
  1879.     StartTime: LARGE_INTEGER;
  1880.     EndTime: LARGE_INTEGER;
  1881.     VirtualAddress: PVOID;
  1882.     NumberOfBytes: DWORD;
  1883.     DeviceNumber: BYTE;
  1884.     ReadRequest: ByteBool;
  1885.   end;
  1886.   {$EXTERNALSYM _DISK_RECORD}
  1887.   DISK_RECORD = _DISK_RECORD;
  1888.   {$EXTERNALSYM DISK_RECORD}
  1889.   TDiskRecord = DISK_RECORD;
  1890.   PDiskRecord = PDISK_RECORD;
  1891. //
  1892. // The following structure is exchanged on an IOCTL_DISK_LOG request.
  1893. // Not all fields are valid with each function type.
  1894. //
  1895.   PDISK_LOGGING = ^DISK_LOGGING;
  1896.   {$EXTERNALSYM PDISK_LOGGING}
  1897.   _DISK_LOGGING = record
  1898.     Function_: BYTE;
  1899.     BufferAddress: PVOID;
  1900.     BufferSize: DWORD;
  1901.   end;
  1902.   {$EXTERNALSYM _DISK_LOGGING}
  1903.   DISK_LOGGING = _DISK_LOGGING;
  1904.   {$EXTERNALSYM DISK_LOGGING}
  1905.   TDiskLogging = DISK_LOGGING;
  1906.   PDiskLogging = PDISK_LOGGING;
  1907. //
  1908. // Disk logging functions
  1909. //
  1910. // Start disk logging. Only the Function and BufferSize fields are valid.
  1911. //
  1912. const
  1913.   DISK_LOGGING_START = 0;
  1914.   {$EXTERNALSYM DISK_LOGGING_START}
  1915. //
  1916. // Stop disk logging. Only the Function field is valid.
  1917. //
  1918.   DISK_LOGGING_STOP = 1;
  1919.   {$EXTERNALSYM DISK_LOGGING_STOP}
  1920. //
  1921. // Return disk log. All fields are valid. Data will be copied from internal
  1922. // buffer to buffer specified for the number of bytes requested.
  1923. //
  1924.   DISK_LOGGING_DUMP = 2;
  1925.   {$EXTERNALSYM DISK_LOGGING_DUMP}
  1926. //
  1927. // DISK BINNING
  1928. //
  1929. // DISKPERF will keep counters for IO that falls in each of these ranges.
  1930. // The application determines the number and size of the ranges.
  1931. // Joe Lin wanted me to keep it flexible as possible, for instance, IO
  1932. // sizes are interesting in ranges like 0-4096, 4097-16384, 16385-65536, 65537+.
  1933. //
  1934.   DISK_BINNING = 3;
  1935.   {$EXTERNALSYM DISK_BINNING}
  1936. //
  1937. // Bin types
  1938. //
  1939. type
  1940.   _BIN_TYPES = (RequestSize, RequestLocation);
  1941.   {$EXTERNALSYM _BIN_TYPES}
  1942.   BIN_TYPES = _BIN_TYPES;
  1943.   {$EXTERNALSYM BIN_TYPES}
  1944.   TBinTypes = _BIN_TYPES;
  1945. //
  1946. // Bin ranges
  1947. //
  1948.   PBIN_RANGE = ^BIN_RANGE;
  1949.   {$EXTERNALSYM PBIN_RANGE}
  1950.   _BIN_RANGE = record
  1951.     StartValue: LARGE_INTEGER;
  1952.     Length: LARGE_INTEGER;
  1953.   end;
  1954.   {$EXTERNALSYM _BIN_RANGE}
  1955.   BIN_RANGE = _BIN_RANGE;
  1956.   {$EXTERNALSYM BIN_RANGE}
  1957.   TBinRange = BIN_RANGE;
  1958.   PBinRange = PBIN_RANGE;
  1959. //
  1960. // Bin definition
  1961. //
  1962.   PPERF_BIN = ^PERF_BIN;
  1963.   {$EXTERNALSYM PPERF_BIN}
  1964.   _PERF_BIN = record
  1965.     NumberOfBins: DWORD;
  1966.     TypeOfBin: DWORD;
  1967.     BinsRanges: array [0..0] of BIN_RANGE;
  1968.   end;
  1969.   {$EXTERNALSYM _PERF_BIN}
  1970.   PERF_BIN = _PERF_BIN;
  1971.   {$EXTERNALSYM PERF_BIN}
  1972.   TPerfBin = PERF_BIN;
  1973.   PPerfBin = PPERF_BIN;
  1974. //
  1975. // Bin count
  1976. //
  1977.   PBIN_COUNT = ^BIN_COUNT;
  1978.   {$EXTERNALSYM PBIN_COUNT}
  1979.   _BIN_COUNT = record
  1980.     BinRange: BIN_RANGE;
  1981.     BinCount: DWORD;
  1982.   end;
  1983.   {$EXTERNALSYM _BIN_COUNT}
  1984.   BIN_COUNT = _BIN_COUNT;
  1985.   {$EXTERNALSYM BIN_COUNT}
  1986.   TBinCount = BIN_COUNT;
  1987.   PBinCount = PBIN_COUNT;
  1988. //
  1989. // Bin results
  1990. //
  1991.   PBIN_RESULTS = ^BIN_RESULTS;
  1992.   {$EXTERNALSYM PBIN_RESULTS}
  1993.   _BIN_RESULTS = record
  1994.     NumberOfBins: DWORD;
  1995.     BinCounts: array [0..0] of BIN_COUNT;
  1996.   end;
  1997.   {$EXTERNALSYM _BIN_RESULTS}
  1998.   BIN_RESULTS = _BIN_RESULTS;
  1999.   {$EXTERNALSYM BIN_RESULTS}
  2000.   TBinResults = BIN_RESULTS;
  2001.   PBinResults = PBIN_RESULTS;
  2002. //
  2003. // Data structures for SMART drive fault prediction.
  2004. //
  2005. // GETVERSIONINPARAMS contains the data returned from the
  2006. // Get Driver Version function.
  2007. //
  2008. //#include <pshpack1.h>
  2009.   LPGETVERSIONINPARAMS = ^GETVERSIONINPARAMS;
  2010.   {$EXTERNALSYM LPGETVERSIONINPARAMS}
  2011.   _GETVERSIONINPARAMS = packed record
  2012.     bVersion: BYTE;                    // Binary driver version.
  2013.     bRevision: BYTE;                   // Binary driver revision.
  2014.     bReserved: BYTE;                   // Not used.
  2015.     bIDEDeviceMap: BYTE;               // Bit map of IDE devices.
  2016.     fCapabilities: DWORD;              // Bit mask of driver capabilities.
  2017.     dwReserved: array [0..3] of DWORD; // For future use.
  2018.   end;
  2019.   {$EXTERNALSYM _GETVERSIONINPARAMS}
  2020.   GETVERSIONINPARAMS = _GETVERSIONINPARAMS;
  2021.   {$EXTERNALSYM GETVERSIONINPARAMS}
  2022.   TGetVersionInParams = GETVERSIONINPARAMS;
  2023.   PGetVersionInParams = LPGETVERSIONINPARAMS;
  2024. //#include <poppack.h>
  2025. //
  2026. // Bits returned in the fCapabilities member of GETVERSIONINPARAMS
  2027. //
  2028. const
  2029.   CAP_ATA_ID_CMD   = 1;         // ATA ID command supported
  2030.   {$EXTERNALSYM CAP_ATA_ID_CMD}
  2031.   CAP_ATAPI_ID_CMD = 2;         // ATAPI ID command supported
  2032.   {$EXTERNALSYM CAP_ATAPI_ID_CMD}
  2033.   CAP_SMART_CMD    = 4;         // SMART commannds supported
  2034.   {$EXTERNALSYM CAP_SMART_CMD}
  2035. //
  2036. // IDE registers
  2037. //
  2038. //#include <pshpack1.h>
  2039. type
  2040.   LPIDEREGS = ^IDEREGS;
  2041.   {$EXTERNALSYM LPIDEREGS}
  2042.   _IDEREGS = packed record
  2043.     bFeaturesReg: BYTE;     // Used for specifying SMART "commands".
  2044.     bSectorCountReg: BYTE;  // IDE sector count register
  2045.     bSectorNumberReg: BYTE; // IDE sector number register
  2046.     bCylLowReg: BYTE;       // IDE low order cylinder value
  2047.     bCylHighReg: BYTE;      // IDE high order cylinder value
  2048.     bDriveHeadReg: BYTE;    // IDE drive/head register
  2049.     bCommandReg: BYTE;      // Actual IDE command.
  2050.     bReserved: BYTE;        // reserved for future use.  Must be zero.
  2051.   end;
  2052.   {$EXTERNALSYM _IDEREGS}
  2053.   IDEREGS = _IDEREGS;
  2054.   {$EXTERNALSYM IDEREGS}
  2055.   TIdeRegs = IDEREGS;
  2056.   PIdeRegs = LPIDEREGS;
  2057. //#include <poppack.h>
  2058. //
  2059. // Valid values for the bCommandReg member of IDEREGS.
  2060. //
  2061. const
  2062.   ATAPI_ID_CMD = $A1;       // Returns ID sector for ATAPI.
  2063.   {$EXTERNALSYM ATAPI_ID_CMD}
  2064.   ID_CMD       = $EC;       // Returns ID sector for ATA.
  2065.   {$EXTERNALSYM ID_CMD}
  2066.   SMART_CMD    = $B0;       // Performs SMART cmd.
  2067.                             // Requires valid bFeaturesReg,
  2068.                             // bCylLowReg, and bCylHighReg
  2069.   {$EXTERNALSYM SMART_CMD}
  2070. //
  2071. // Cylinder register defines for SMART command
  2072. //
  2073.   SMART_CYL_LOW = $4F;
  2074.   {$EXTERNALSYM SMART_CYL_LOW}
  2075.   SMART_CYL_HI  = $C2;
  2076.   {$EXTERNALSYM SMART_CYL_HI}
  2077. //
  2078. // SENDCMDINPARAMS contains the input parameters for the
  2079. // Send Command to Drive function.
  2080. //
  2081. //#include <pshpack1.h>
  2082. type
  2083.   LPSENDCMDINPARAMS = ^SENDCMDINPARAMS;
  2084.   {$EXTERNALSYM LPSENDCMDINPARAMS}
  2085.   _SENDCMDINPARAMS = packed record
  2086.     cBufferSize: DWORD;   // Buffer size in bytes
  2087.     irDriveRegs: IDEREGS; // Structure with drive register values.
  2088.     bDriveNumber: BYTE;   // Physical drive number to send
  2089.                           // command to (0,1,2,3).
  2090.     bReserved: array [0..2] of BYTE;   // Reserved for future expansion.
  2091.     dwReserved: array [0..3] of DWORD; // For future use.
  2092.     bBuffer: array [0..0] of BYTE;     // Input buffer.
  2093.   end;
  2094.   {$EXTERNALSYM _SENDCMDINPARAMS}
  2095.   SENDCMDINPARAMS = _SENDCMDINPARAMS;
  2096.   {$EXTERNALSYM SENDCMDINPARAMS}
  2097.   TSendCmdInParams = SENDCMDINPARAMS;
  2098.   PSendCmdInParams = LPSENDCMDINPARAMS;
  2099. //#include <poppack.h>
  2100. //
  2101. // Status returned from driver
  2102. //
  2103. //#include <pshpack1.h>
  2104.   LPDRIVERSTATUS = ^DRIVERSTATUS;
  2105.   {$EXTERNALSYM LPDRIVERSTATUS}
  2106.   _DRIVERSTATUS = packed record
  2107.     bDriverError: BYTE; // Error code from driver,
  2108.                         // or 0 if no error.
  2109.     bIDEError: BYTE;    // Contents of IDE Error register.
  2110.                         // Only valid when bDriverError
  2111.                         // is SMART_IDE_ERROR.
  2112.     bReserved: array [0..1] of BYTE;   // Reserved for future expansion.
  2113.     dwReserved: array [0..1] of DWORD; // Reserved for future expansion.
  2114.   end;
  2115.   {$EXTERNALSYM _DRIVERSTATUS}
  2116.   DRIVERSTATUS = _DRIVERSTATUS;
  2117.   {$EXTERNALSYM DRIVERSTATUS}
  2118.   TDriverStatus = DRIVERSTATUS;
  2119.   PDriverStatus = LPDRIVERSTATUS;
  2120. //#include <poppack.h>
  2121. //
  2122. // bDriverError values
  2123. //
  2124. const
  2125.   SMART_NO_ERROR         = 0; // No error
  2126.   {$EXTERNALSYM SMART_NO_ERROR}
  2127.   SMART_IDE_ERROR        = 1; // Error from IDE controller
  2128.   {$EXTERNALSYM SMART_IDE_ERROR}
  2129.   SMART_INVALID_FLAG     = 2; // Invalid command flag
  2130.   {$EXTERNALSYM SMART_INVALID_FLAG}
  2131.   SMART_INVALID_COMMAND  = 3; // Invalid command byte
  2132.   {$EXTERNALSYM SMART_INVALID_COMMAND}
  2133.   SMART_INVALID_BUFFER   = 4; // Bad buffer (null, invalid addr..)
  2134.   {$EXTERNALSYM SMART_INVALID_BUFFER}
  2135.   SMART_INVALID_DRIVE    = 5; // Drive number not valid
  2136.   {$EXTERNALSYM SMART_INVALID_DRIVE}
  2137.   SMART_INVALID_IOCTL    = 6; // Invalid IOCTL
  2138.   {$EXTERNALSYM SMART_INVALID_IOCTL}
  2139.   SMART_ERROR_NO_MEM     = 7; // Could not lock user's buffer
  2140.   {$EXTERNALSYM SMART_ERROR_NO_MEM}
  2141.   SMART_INVALID_REGISTER = 8; // Some IDE Register not valid
  2142.   {$EXTERNALSYM SMART_INVALID_REGISTER}
  2143.   SMART_NOT_SUPPORTED    = 9; // Invalid cmd flag set
  2144.   {$EXTERNALSYM SMART_NOT_SUPPORTED}
  2145.   SMART_NO_IDE_DEVICE    = 10; // Cmd issued to device not present
  2146.   {$EXTERNALSYM SMART_NO_IDE_DEVICE}
  2147.                                // although drive number is valid
  2148. //
  2149. // SMART sub commands for execute offline diags
  2150. //
  2151.   SMART_OFFLINE_ROUTINE_OFFLINE   = 0;
  2152.   {$EXTERNALSYM SMART_OFFLINE_ROUTINE_OFFLINE}
  2153.   SMART_SHORT_SELFTEST_OFFLINE    = 1;
  2154.   {$EXTERNALSYM SMART_SHORT_SELFTEST_OFFLINE}
  2155.   SMART_EXTENDED_SELFTEST_OFFLINE = 2;
  2156.   {$EXTERNALSYM SMART_EXTENDED_SELFTEST_OFFLINE}
  2157.   SMART_ABORT_OFFLINE_SELFTEST    = 127;
  2158.   {$EXTERNALSYM SMART_ABORT_OFFLINE_SELFTEST}
  2159.   SMART_SHORT_SELFTEST_CAPTIVE    = 129;
  2160.   {$EXTERNALSYM SMART_SHORT_SELFTEST_CAPTIVE}
  2161.   SMART_EXTENDED_SELFTEST_CAPTIVE = 130;
  2162.   {$EXTERNALSYM SMART_EXTENDED_SELFTEST_CAPTIVE}
  2163. //#include <pshpack1.h>
  2164. type
  2165.   LPSENDCMDOUTPARAMS = ^SENDCMDOUTPARAMS;
  2166.   {$EXTERNALSYM LPSENDCMDOUTPARAMS}
  2167.   _SENDCMDOUTPARAMS = packed record
  2168.     cBufferSize: DWORD;            // Size of bBuffer in bytes
  2169.     DriverStatus: DRIVERSTATUS;    // Driver status structure.
  2170.     bBuffer: array [0..0] of BYTE; // Buffer of arbitrary length in which to store the data read from the                                                                                  // drive.
  2171.   end;
  2172.   {$EXTERNALSYM _SENDCMDOUTPARAMS}
  2173.   SENDCMDOUTPARAMS = _SENDCMDOUTPARAMS;
  2174.   {$EXTERNALSYM SENDCMDOUTPARAMS}
  2175.   TSendCmdOutParams = SENDCMDOUTPARAMS;
  2176.   PSendCmdOutParams = LPSENDCMDOUTPARAMS;
  2177. //#include <poppack.h>
  2178. const
  2179.   READ_ATTRIBUTE_BUFFER_SIZE = 512;
  2180.   {$EXTERNALSYM READ_ATTRIBUTE_BUFFER_SIZE}
  2181.   IDENTIFY_BUFFER_SIZE       = 512;
  2182.   {$EXTERNALSYM IDENTIFY_BUFFER_SIZE}
  2183.   READ_THRESHOLD_BUFFER_SIZE = 512;
  2184.   {$EXTERNALSYM READ_THRESHOLD_BUFFER_SIZE}
  2185.   SMART_LOG_SECTOR_SIZE      = 512;
  2186.   {$EXTERNALSYM SMART_LOG_SECTOR_SIZE}
  2187. //
  2188. // Feature register defines for SMART "sub commands"
  2189. //
  2190.   READ_ATTRIBUTES             = $D0;
  2191.   {$EXTERNALSYM READ_ATTRIBUTES}
  2192.   READ_THRESHOLDS             = $D1;
  2193.   {$EXTERNALSYM READ_THRESHOLDS}
  2194.   ENABLE_DISABLE_AUTOSAVE     = $D2;
  2195.   {$EXTERNALSYM ENABLE_DISABLE_AUTOSAVE}
  2196.   SAVE_ATTRIBUTE_VALUES       = $D3;
  2197.   {$EXTERNALSYM SAVE_ATTRIBUTE_VALUES}
  2198.   EXECUTE_OFFLINE_DIAGS       = $D4;
  2199.   {$EXTERNALSYM EXECUTE_OFFLINE_DIAGS}
  2200.   SMART_READ_LOG              = $D5;
  2201.   {$EXTERNALSYM SMART_READ_LOG}
  2202.   SMART_WRITE_LOG             = $d6;
  2203.   {$EXTERNALSYM SMART_WRITE_LOG}
  2204.   ENABLE_SMART                = $D8;
  2205.   {$EXTERNALSYM ENABLE_SMART}
  2206.   DISABLE_SMART               = $D9;
  2207.   {$EXTERNALSYM DISABLE_SMART}
  2208.   RETURN_SMART_STATUS         = $DA;
  2209.   {$EXTERNALSYM RETURN_SMART_STATUS}
  2210.   ENABLE_DISABLE_AUTO_OFFLINE = $DB;
  2211.   {$EXTERNALSYM ENABLE_DISABLE_AUTO_OFFLINE}
  2212.   IOCTL_CHANGER_BASE = FILE_DEVICE_CHANGER;
  2213.   {$EXTERNALSYM IOCTL_CHANGER_BASE}