home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / ntdddisk.h < prev    next >
C/C++ Source or Header  |  2005-01-29  |  16KB  |  522 lines

  1. /*
  2.  * ntdddisk.h
  3.  *
  4.  * Disk IOCTL interface.
  5.  *
  6.  * This file is part of the w32api package.
  7.  *
  8.  * Contributors:
  9.  *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
  10.  *
  11.  * THIS SOFTWARE IS NOT COPYRIGHTED
  12.  *
  13.  * This source code is offered for use in the public domain. You may
  14.  * use, modify or distribute it freely.
  15.  *
  16.  * This code is distributed in the hope that it will be useful but
  17.  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
  18.  * DISCLAIMED. This includes but is not limited to warranties of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  */
  22.  
  23. #ifndef __NTDDDISK_H
  24. #define __NTDDDISK_H
  25.  
  26. #if __GNUC__ >=3
  27. #pragma GCC system_header
  28. #endif
  29.  
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33.  
  34. #include "ntddk.h"
  35. #include "ntddstor.h"
  36.  
  37. #define DD_DISK_DEVICE_NAME               "\\Device\\UNKNOWN"
  38. #define DD_DISK_DEVICE_NAME_U             L"\\Device\\UNKNOWN"
  39.  
  40. #define IOCTL_DISK_BASE                   FILE_DEVICE_DISK
  41.  
  42. #define IOCTL_DISK_CHECK_VERIFY \
  43.   CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
  44.  
  45. #define IOCTL_DISK_CONTROLLER_NUMBER \
  46.   CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS)
  47.  
  48. #define IOCTL_DISK_CREATE_DISK \
  49.   CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  50.  
  51. #define IOCTL_DISK_DELETE_DRIVE_LAYOUT \
  52.   CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  53.  
  54. #define IOCTL_DISK_FIND_NEW_DEVICES \
  55.   CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
  56.  
  57. #define IOCTL_DISK_FORMAT_TRACKS \
  58.   CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  59.  
  60. #define IOCTL_DISK_FORMAT_TRACKS_EX \
  61.   CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  62.  
  63. #define IOCTL_DISK_GET_CACHE_INFORMATION \
  64.   CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS)
  65.  
  66. #define IOCTL_DISK_GET_DRIVE_GEOMETRY \
  67.   CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)
  68.  
  69. #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX \
  70.   CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
  71.  
  72. #define IOCTL_DISK_GET_DRIVE_LAYOUT \
  73.   CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
  74.  
  75. #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX \
  76.   CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS)
  77.  
  78. #define IOCTL_DISK_GET_MEDIA_TYPES \
  79.   CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
  80.  
  81. #define IOCTL_DISK_GET_LENGTH_INFO \
  82.   CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)
  83.  
  84. #define IOCTL_DISK_GET_PARTITION_INFO \
  85.   CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
  86.  
  87. #define IOCTL_DISK_GET_PARTITION_INFO_EX \
  88.   CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS)
  89.  
  90. #define IOCTL_DISK_GROW_PARTITION \
  91.   CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  92.  
  93. #define IOCTL_DISK_INTERNAL_CLEAR_VERIFY \
  94.   CTL_CODE(IOCTL_DISK_BASE, 0x0101, METHOD_NEITHER, FILE_ANY_ACCESS)
  95.  
  96. #define IOCTL_DISK_INTERNAL_SET_VERIFY \
  97.   CTL_CODE(IOCTL_DISK_BASE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS)
  98.  
  99. #define IOCTL_DISK_IS_WRITABLE \
  100.   CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)
  101.  
  102. #define IOCTL_DISK_PERFORMANCE \
  103.   CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)
  104.  
  105. #define IOCTL_DISK_PERFORMANCE_OFF \
  106.   CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS)
  107.  
  108. #define IOCTL_DISK_REASSIGN_BLOCKS \
  109.   CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  110.  
  111. #define IOCTL_DISK_RESERVE \
  112.   CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
  113.  
  114. #define IOCTL_DISK_SET_CACHE_INFORMATION \
  115.   CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  116.  
  117. #define IOCTL_DISK_SET_DRIVE_LAYOUT \
  118.   CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  119.  
  120. #define IOCTL_DISK_SET_DRIVE_LAYOUT_EX \
  121.   CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  122.  
  123. #define IOCTL_DISK_SET_PARTITION_INFO \
  124.   CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  125.  
  126. #define IOCTL_DISK_SET_PARTITION_INFO_EX \
  127.   CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  128.  
  129. #define IOCTL_DISK_UPDATE_DRIVE_SIZE \
  130.   CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  131.  
  132. #define IOCTL_DISK_VERIFY \
  133.   CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)
  134.  
  135. #define SMART_GET_VERSION \
  136.   CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
  137.  
  138. #define SMART_RCV_DRIVE_DATA \
  139.   CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  140.  
  141. #define SMART_SEND_DRIVE_COMMAND \
  142.   CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  143.  
  144.  
  145. #define PARTITION_ENTRY_UNUSED            0x00
  146. #define PARTITION_FAT_12                  0x01
  147. #define PARTITION_XENIX_1                 0x02
  148. #define PARTITION_XENIX_2                 0x03
  149. #define PARTITION_FAT_16                  0x04
  150. #define PARTITION_EXTENDED                0x05
  151. #define PARTITION_HUGE                    0x06
  152. #define PARTITION_IFS                     0x07
  153. #define PARTITION_OS2BOOTMGR              0x0A
  154. #define PARTITION_FAT32                   0x0B
  155. #define PARTITION_FAT32_XINT13            0x0C
  156. #define PARTITION_XINT13                  0x0E
  157. #define PARTITION_XINT13_EXTENDED         0x0F
  158. #define PARTITION_PREP                    0x41
  159. #define PARTITION_LDM                     0x42
  160. #define PARTITION_UNIX                    0x63
  161. #define VALID_NTFT                        0xC0
  162. #define PARTITION_NTFT                    0x80
  163.  
  164. #define IsFTPartition( PartitionType ) \
  165.   (((PartitionType) & PARTITION_NTFT) && \
  166.   IsRecognizedPartition(PartitionType))
  167.  
  168. #define IsContainerPartition(PartitionType) \
  169.   (((PartitionType) == PARTITION_EXTENDED) || \
  170.   ((PartitionType) == PARTITION_XINT13_EXTENDED))
  171.  
  172. #define IsRecognizedPartition(PartitionType) ( \
  173.     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \
  174.     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \
  175.     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \
  176.     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \
  177.     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \
  178.     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) || \
  179.     ((PartitionType) == PARTITION_FAT_12) || \
  180.     ((PartitionType) == PARTITION_FAT_16) || \
  181.     ((PartitionType) == PARTITION_HUGE) || \
  182.     ((PartitionType) == PARTITION_IFS) || \
  183.     ((PartitionType) == PARTITION_FAT32) || \
  184.     ((PartitionType) == PARTITION_FAT32_XINT13) || \
  185.     ((PartitionType) == PARTITION_XINT13))
  186.  
  187. #define WMI_DISK_GEOMETRY_GUID \
  188.   {0x25007f51, 0x57c2, 0x11d1, {0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10}}
  189.  
  190. typedef USHORT BAD_TRACK_NUMBER;
  191. typedef USHORT *PBAD_TRACK_NUMBER;
  192.  
  193. typedef enum _MEDIA_TYPE {
  194.   Unknown,
  195.   F5_1Pt2_512,
  196.   F3_1Pt44_512,
  197.   F3_2Pt88_512,
  198.   F3_20Pt8_512,
  199.   F3_720_512,
  200.   F5_360_512,
  201.   F5_320_512,
  202.   F5_320_1024,
  203.   F5_180_512,
  204.   F5_160_512,
  205.   RemovableMedia,
  206.   FixedMedia,
  207.   F3_120M_512,
  208.   F3_640_512,
  209.   F5_640_512,
  210.   F5_720_512,
  211.   F3_1Pt2_512,
  212.   F3_1Pt23_1024,
  213.   F5_1Pt23_1024,
  214.   F3_128Mb_512,
  215.   F3_230Mb_512,
  216.   F8_256_128
  217. } MEDIA_TYPE, *PMEDIA_TYPE;
  218.  
  219. typedef enum _DETECTION_TYPE {
  220.   DetectNone,
  221.   DetectInt13,
  222.   DetectExInt13
  223. } DETECTION_TYPE;
  224.  
  225. typedef struct _DISK_CONTROLLER_NUMBER {
  226.   ULONG  ControllerNumber;
  227.   ULONG  DiskNumber;
  228. } DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
  229.  
  230. typedef struct _DISK_INT13_INFO {
  231.   USHORT  DriveSelect;
  232.   ULONG  MaxCylinders;
  233.   USHORT  SectorsPerTrack;
  234.   USHORT  MaxHeads;
  235.   USHORT  NumberDrives;
  236. } DISK_INT13_INFO, *PDISK_INT13_INFO;
  237.  
  238. typedef struct _DISK_EX_INT13_INFO {
  239.   USHORT  ExBufferSize;
  240.   USHORT  ExFlags;
  241.   ULONG  ExCylinders;
  242.   ULONG  ExHeads;
  243.   ULONG  ExSectorsPerTrack;
  244.   ULONG64  ExSectorsPerDrive;
  245.   USHORT  ExSectorSize;
  246.   USHORT  ExReserved;
  247. } DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
  248.  
  249. typedef struct _DISK_DETECTION_INFO {
  250.   ULONG  SizeOfDetectInfo;
  251.   DETECTION_TYPE  DetectionType;
  252.   _ANONYMOUS_UNION union {
  253.     _ANONYMOUS_STRUCT struct {
  254.       DISK_INT13_INFO  Int13;
  255.       DISK_EX_INT13_INFO  ExInt13;
  256.     } DUMMYSTRUCTNAME;
  257.   } DUMMYUNIONNAME;
  258. } DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
  259.  
  260. typedef struct _DISK_GEOMETRY {
  261.   LARGE_INTEGER  Cylinders;
  262.   MEDIA_TYPE  MediaType;
  263.   ULONG  TracksPerCylinder;
  264.   ULONG  SectorsPerTrack;
  265.   ULONG  BytesPerSector;
  266. } DISK_GEOMETRY, *PDISK_GEOMETRY;
  267.  
  268. typedef struct _DISK_GEOMETRY_EX {
  269.   DISK_GEOMETRY  Geometry;
  270.   LARGE_INTEGER  DiskSize;
  271.   UCHAR  Data[1];
  272. } DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
  273.  
  274. #define DiskGeometryGetPartition(Geometry) \
  275.    ((PDISK_PARTITION_INFO)((Geometry) + 1))
  276.  
  277. #define DiskGeometryGetDetect(Geometry)\
  278.  ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \
  279.   DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
  280.  
  281. typedef struct _PARTITION_INFORMATION {
  282.   LARGE_INTEGER  StartingOffset;
  283.   LARGE_INTEGER  PartitionLength;
  284.   DWORD  HiddenSectors;
  285.   DWORD  PartitionNumber;
  286.   BYTE  PartitionType;
  287.   BOOLEAN  BootIndicator;
  288.   BOOLEAN  RecognizedPartition;
  289.   BOOLEAN  RewritePartition;
  290. } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
  291.  
  292. typedef struct _PARTITION_INFORMATION_GPT {
  293.   GUID  PartitionType;
  294.   GUID  PartitionId;
  295.   ULONG64  Attributes;
  296.   WCHAR Name  [36];
  297. } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
  298.  
  299. typedef struct _DISK_PARTITION_INFO {
  300.   ULONG  SizeOfPartitionInfo;
  301.   PARTITION_STYLE  PartitionStyle;
  302.   _ANONYMOUS_UNION union {
  303.     struct {
  304.       ULONG  Signature;
  305.       ULONG  CheckSum;
  306.     } Mbr;
  307.     struct {
  308.       GUID  DiskId;
  309.     } Gpt;
  310.   } DUMMYUNIONNAME;
  311. } DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
  312.  
  313. typedef struct _DISK_PERFORMANCE {
  314.   LARGE_INTEGER  BytesRead;
  315.   LARGE_INTEGER  BytesWritten;
  316.   LARGE_INTEGER  ReadTime;
  317.   LARGE_INTEGER  WriteTime;
  318.   LARGE_INTEGER  IdleTime;
  319.   ULONG  ReadCount;
  320.   ULONG  WriteCount;
  321.   ULONG  QueueDepth;
  322.   ULONG  SplitCount;
  323.   LARGE_INTEGER  QueryTime;
  324.   ULONG  StorageDeviceNumber;
  325.   WCHAR  StorageManagerName[8];
  326. } DISK_PERFORMANCE, *PDISK_PERFORMANCE;
  327.  
  328. typedef struct _PARTITION_INFORMATION_EX {
  329.   PARTITION_STYLE  PartitionStyle;
  330.   LARGE_INTEGER  StartingOffset;
  331.   LARGE_INTEGER  PartitionLength;
  332.   ULONG  PartitionNumber;
  333.   BOOLEAN  RewritePartition;
  334.   _ANONYMOUS_UNION union {
  335.     PARTITION_INFORMATION_MBR  Mbr;
  336.     PARTITION_INFORMATION_GPT  Gpt;
  337.   } DUMMYUNIONNAME;
  338. } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
  339.  
  340. typedef struct _FORMAT_EX_PARAMETERS {
  341.   MEDIA_TYPE  MediaType;
  342.   ULONG  StartCylinderNumber;
  343.   ULONG  EndCylinderNumber;
  344.   ULONG  StartHeadNumber;
  345.   ULONG  EndHeadNumber;
  346.   USHORT  FormatGapLength;
  347.   USHORT  SectorsPerTrack;
  348.   USHORT  SectorNumber[1];
  349. } FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
  350.  
  351. typedef struct _FORMAT_PARAMETERS {
  352.   MEDIA_TYPE  MediaType;
  353.   ULONG  StartCylinderNumber;
  354.   ULONG  EndCylinderNumber;
  355.   ULONG  StartHeadNumber;
  356.   ULONG  EndHeadNumber;
  357. } FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
  358.  
  359. typedef struct _GET_LENGTH_INFORMATION {
  360.   LARGE_INTEGER  Length;
  361. } GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
  362.  
  363. typedef struct _REASSIGN_BLOCKS {
  364.   WORD  Reserved;
  365.   WORD  Count;
  366.   DWORD  BlockNumber[1];
  367. } REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
  368.  
  369. typedef struct _SET_PARTITION_INFORMATION {
  370.   UCHAR  PartitionType;
  371. } SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
  372.  
  373. typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
  374. typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
  375.  
  376. typedef struct _SET_PARTITION_INFORMATION_EX {
  377.   PARTITION_STYLE  PartitionStyle;
  378.   _ANONYMOUS_UNION union {
  379.     SET_PARTITION_INFORMATION_MBR  Mbr;
  380.     SET_PARTITION_INFORMATION_GPT  Gpt;
  381.   } DUMMYUNIONNAME;
  382. } SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
  383.  
  384. typedef struct _VERIFY_INFORMATION {
  385.   LARGE_INTEGER  StartingOffset;
  386.   DWORD  Length;
  387. } VERIFY_INFORMATION, *PVERIFY_INFORMATION;
  388.  
  389. typedef enum {
  390.     EqualPriority,
  391.     KeepPrefetchedData,
  392.     KeepReadData
  393. } DISK_CACHE_RETENTION_PRIORITY;
  394.  
  395. typedef struct _DISK_CACHE_INFORMATION {
  396.     BOOLEAN  ParametersSavable;
  397.     BOOLEAN  ReadCacheEnabled;
  398.     BOOLEAN  WriteCacheEnabled;
  399.     DISK_CACHE_RETENTION_PRIORITY  ReadRetentionPriority;
  400.     DISK_CACHE_RETENTION_PRIORITY  WriteRetentionPriority;
  401.     USHORT  DisablePrefetchTransferLength;
  402.     BOOLEAN  PrefetchScalar;
  403.     _ANONYMOUS_UNION union {
  404.         struct {
  405.             USHORT  Minimum;
  406.             USHORT  Maximum;
  407.             USHORT  MaximumBlocks;
  408.         } ScalarPrefetch;
  409.         struct {
  410.             USHORT  Minimum;
  411.             USHORT  Maximum;
  412.         } BlockPrefetch;
  413.     } DUMMYUNIONNAME;
  414. } DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
  415.  
  416. typedef struct _DISK_GROW_PARTITION {
  417.   ULONG  PartitionNumber;
  418.   LARGE_INTEGER  BytesToGrow;
  419. } DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
  420.  
  421. /* GETVERSIONINPARAMS.fCapabilities constants */
  422. #define CAP_ATA_ID_CMD                    1
  423. #define CAP_ATAPI_ID_CMD                  2
  424. #define CAP_SMART_CMD                     4
  425.  
  426. typedef struct _GETVERSIONINPARAMS {
  427.     UCHAR  bVersion;
  428.     UCHAR  bRevision;
  429.     UCHAR  bReserved;
  430.     UCHAR  bIDEDeviceMap;
  431.     ULONG  fCapabilities;
  432.     ULONG  dwReserved[4];
  433. } GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
  434.  
  435. /* IDEREGS.bCommandReg constants */
  436. #define ATAPI_ID_CMD                      0xA1
  437. #define ID_CMD                            0xEC
  438. #define SMART_CMD                         0xB0
  439.  
  440. #define SMART_CYL_LOW                     0x4F
  441. #define SMART_CYL_HI                      0xC2
  442.  
  443. typedef struct _IDEREGS {
  444.     UCHAR  bFeaturesReg;
  445.     UCHAR  bSectorCountReg;
  446.     UCHAR  bSectorNumberReg;
  447.     UCHAR  bCylLowReg;
  448.     UCHAR  bCylHighReg;
  449.     UCHAR  bDriveHeadReg;
  450.     UCHAR  bCommandReg;
  451.     UCHAR  bReserved;
  452. } IDEREGS, *PIDEREGS, *LPIDEREGS;
  453.  
  454. #include <pshpack1.h>
  455. typedef struct _SENDCMDINPARAMS {
  456.     ULONG  cBufferSize;
  457.     IDEREGS  irDriveRegs;
  458.     UCHAR  bDriveNumber;
  459.     UCHAR  bReserved[3];
  460.     ULONG  dwReserved[4];
  461.     UCHAR  bBuffer[1];
  462. } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
  463. #include <poppack.h>
  464.  
  465. /* DRIVERSTATUS.bDriverError constants */
  466. #define SMART_NO_ERROR                    0
  467. #define SMART_IDE_ERROR                   1
  468. #define SMART_INVALID_FLAG                2
  469. #define SMART_INVALID_COMMAND             3
  470. #define SMART_INVALID_BUFFER              4
  471. #define SMART_INVALID_DRIVE               5
  472. #define SMART_INVALID_IOCTL               6
  473. #define SMART_ERROR_NO_MEM                7
  474. #define SMART_INVALID_REGISTER            8
  475. #define SMART_NOT_SUPPORTED               9
  476. #define SMART_NO_IDE_DEVICE               10
  477.  
  478. #define SMART_OFFLINE_ROUTINE_OFFLINE     0
  479. #define SMART_SHORT_SELFTEST_OFFLINE      1
  480. #define SMART_EXTENDED_SELFTEST_OFFLINE   2
  481. #define SMART_ABORT_OFFLINE_SELFTEST      127
  482. #define SMART_SHORT_SELFTEST_CAPTIVE      129
  483. #define SMART_EXTENDED_SELFTEST_CAPTIVE   130
  484.  
  485. typedef struct _DRIVERSTATUS {
  486.     UCHAR  bDriverError;
  487.     UCHAR  bIDEError;
  488.     UCHAR  bReserved[2];
  489.     ULONG  dwReserved[2];
  490. } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
  491.  
  492. #define READ_ATTRIBUTE_BUFFER_SIZE        512
  493. #define IDENTIFY_BUFFER_SIZE              512
  494. #define READ_THRESHOLD_BUFFER_SIZE        512
  495. #define SMART_LOG_SECTOR_SIZE             512
  496.  
  497. #include <pshpack1.h>
  498. typedef struct _SENDCMDOUTPARAMS {
  499.     ULONG  cBufferSize;
  500.     DRIVERSTATUS  DriverStatus;
  501.     UCHAR  bBuffer[1];
  502. } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
  503. #include <poppack.h>
  504.  
  505. #define READ_ATTRIBUTES                   0xD0
  506. #define READ_THRESHOLDS                   0xD1
  507. #define ENABLE_DISABLE_AUTOSAVE           0xD2
  508. #define SAVE_ATTRIBUTE_VALUES             0xD3
  509. #define EXECUTE_OFFLINE_DIAGS             0xD4
  510. #define SMART_READ_LOG                    0xD5
  511. #define SMART_WRITE_LOG                   0xd6
  512. #define ENABLE_SMART                      0xD8
  513. #define DISABLE_SMART                     0xD9
  514. #define RETURN_SMART_STATUS               0xDA
  515. #define ENABLE_DISABLE_AUTO_OFFLINE       0xDB
  516.  
  517. #ifdef __cplusplus
  518. }
  519. #endif
  520.  
  521. #endif /* __NTDDDISK_H */
  522.