ntddstor.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:25k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*++ BUILD Version: 0001    // Increment this if a change has global effects
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4.     ntddstor.h
  5. Abstract:
  6.     This is the include file that defines all common constants and types
  7.     accessing the storage class drivers
  8. Author:
  9.     Peter Wieland 19-Jun-1996
  10. Revision History:
  11. --*/
  12. #pragma once
  13. #include "devioctl.h"
  14. //
  15. // Interface GUIDs
  16. //
  17. // need these GUIDs outside conditional includes so that user can
  18. //   #include <ntddstor.h> in precompiled header
  19. //   #include <initguid.h> in a single source file
  20. //   #include <ntddstor.h> in that source file a second time to instantiate the GUIDs
  21. //
  22. #ifdef DEFINE_GUID
  23. //
  24. // Make sure FAR is defined...
  25. //
  26. #ifndef FAR
  27. #ifdef _WIN32
  28. #define FAR
  29. #else
  30. #define FAR _far
  31. #endif
  32. #endif
  33. // begin_wioctlguids
  34. DEFINE_GUID(GUID_DEVINTERFACE_DISK,                   0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  35. DEFINE_GUID(GUID_DEVINTERFACE_CDROM,                  0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  36. DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,              0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  37. DEFINE_GUID(GUID_DEVINTERFACE_TAPE,                   0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  38. DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,          0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  39. DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,                 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  40. DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,          0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  41. DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,                 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  42. DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,              0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  43. DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,            0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
  44. // end_wioctlguids
  45. // begin_wioctlobsoleteguids
  46. #define DiskClassGuid               GUID_DEVINTERFACE_DISK
  47. #define CdRomClassGuid              GUID_DEVINTERFACE_CDROM
  48. #define PartitionClassGuid          GUID_DEVINTERFACE_PARTITION
  49. #define TapeClassGuid               GUID_DEVINTERFACE_TAPE
  50. #define WriteOnceDiskClassGuid      GUID_DEVINTERFACE_WRITEONCEDISK
  51. #define VolumeClassGuid             GUID_DEVINTERFACE_VOLUME
  52. #define MediumChangerClassGuid      GUID_DEVINTERFACE_MEDIUMCHANGER
  53. #define FloppyClassGuid             GUID_DEVINTERFACE_FLOPPY
  54. #define CdChangerClassGuid          GUID_DEVINTERFACE_CDCHANGER
  55. #define StoragePortClassGuid        GUID_DEVINTERFACE_STORAGEPORT
  56. // end_wioctlobsoleteguids
  57. #endif
  58. // begin_winioctl
  59. #ifndef _NTDDSTOR_H_
  60. #define _NTDDSTOR_H_
  61. #ifdef __cplusplus
  62. extern "C" {
  63. #endif
  64. //
  65. // IoControlCode values for storage devices
  66. //
  67. #define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
  68. //
  69. // The following device control codes are common for all class drivers.  They
  70. // should be used in place of the older IOCTL_DISK, IOCTL_CDROM and IOCTL_TAPE
  71. // common codes
  72. //
  73. #define IOCTL_STORAGE_CHECK_VERIFY            CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
  74. #define IOCTL_STORAGE_CHECK_VERIFY2           CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)
  75. #define IOCTL_STORAGE_MEDIA_REMOVAL           CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
  76. #define IOCTL_STORAGE_EJECT_MEDIA             CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
  77. #define IOCTL_STORAGE_LOAD_MEDIA              CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
  78. #define IOCTL_STORAGE_LOAD_MEDIA2             CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS)
  79. #define IOCTL_STORAGE_RESERVE                 CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
  80. #define IOCTL_STORAGE_RELEASE                 CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
  81. #define IOCTL_STORAGE_FIND_NEW_DEVICES        CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
  82. #define IOCTL_STORAGE_EJECTION_CONTROL        CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)
  83. #define IOCTL_STORAGE_MCN_CONTROL             CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS)
  84. #define IOCTL_STORAGE_GET_MEDIA_TYPES         CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
  85. #define IOCTL_STORAGE_GET_MEDIA_TYPES_EX      CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)
  86. #define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
  87. #define IOCTL_STORAGE_GET_HOTPLUG_INFO        CTL_CODE(IOCTL_STORAGE_BASE, 0x0305, METHOD_BUFFERED, FILE_ANY_ACCESS)
  88. #define IOCTL_STORAGE_SET_HOTPLUG_INFO        CTL_CODE(IOCTL_STORAGE_BASE, 0x0306, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  89. #define IOCTL_STORAGE_RESET_BUS               CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)
  90. #define IOCTL_STORAGE_RESET_DEVICE            CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)
  91. #define IOCTL_STORAGE_BREAK_RESERVATION       CTL_CODE(IOCTL_STORAGE_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)
  92. #define IOCTL_STORAGE_GET_DEVICE_NUMBER       CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS)
  93. #define IOCTL_STORAGE_PREDICT_FAILURE         CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)
  94. // end_winioctl
  95. #define IOCTL_STORAGE_QUERY_PROPERTY   CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
  96. // begin_winioctl
  97. //
  98. // These ioctl codes are obsolete.  They are defined here to avoid resuing them
  99. // and to allow class drivers to respond to them more easily.
  100. //
  101. #define OBSOLETE_IOCTL_STORAGE_RESET_BUS        CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  102. #define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE     CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  103. //
  104. // IOCTL_STORAGE_GET_HOTPLUG_INFO
  105. //
  106. typedef struct _STORAGE_HOTPLUG_INFO {
  107.     ULONG Size; // version
  108.     BOOLEAN MediaRemovable; // ie. zip, jaz, cdrom, mo, etc. vs hdd
  109.     BOOLEAN MediaHotplug;   // ie. does the device succeed a lock even though its not lockable media?
  110.     BOOLEAN DeviceHotplug;  // ie. 1394, USB, etc.
  111.     BOOLEAN WriteCacheEnableOverride; // This field should not be relied upon because it is no longer used
  112. } STORAGE_HOTPLUG_INFO, *PSTORAGE_HOTPLUG_INFO;
  113. //
  114. // IOCTL_STORAGE_GET_DEVICE_NUMBER
  115. //
  116. // input - none
  117. //
  118. // output - STORAGE_DEVICE_NUMBER structure
  119. //          The values in the STORAGE_DEVICE_NUMBER structure are guaranteed
  120. //          to remain unchanged until the system is rebooted.  They are not
  121. //          guaranteed to be persistant across boots.
  122. //
  123. typedef struct _STORAGE_DEVICE_NUMBER {
  124.     //
  125.     // The FILE_DEVICE_XXX type for this device.
  126.     //
  127.     DEVICE_TYPE DeviceType;
  128.     //
  129.     // The number of this device
  130.     //
  131.     ULONG       DeviceNumber;
  132.     //
  133.     // If the device is partitionable, the partition number of the device.
  134.     // Otherwise -1
  135.     //
  136.     ULONG       PartitionNumber;
  137. } STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;
  138. //
  139. // Define the structures for scsi resets
  140. //
  141. typedef struct _STORAGE_BUS_RESET_REQUEST {
  142.     UCHAR PathId;
  143. } STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;
  144. //
  145. // IOCTL_STORAGE_MEDIA_REMOVAL disables the mechanism
  146. // on a storage device that ejects media. This function
  147. // may or may not be supported on storage devices that
  148. // support removable media.
  149. //
  150. // TRUE means prevent media from being removed.
  151. // FALSE means allow media removal.
  152. //
  153. typedef struct _PREVENT_MEDIA_REMOVAL {
  154.     BOOLEAN PreventMediaRemoval;
  155. } PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
  156. // begin_ntminitape
  157. typedef struct _TAPE_STATISTICS {
  158.     ULONG Version;
  159.     ULONG Flags;
  160.     LARGE_INTEGER RecoveredWrites;
  161.     LARGE_INTEGER UnrecoveredWrites;
  162.     LARGE_INTEGER RecoveredReads;
  163.     LARGE_INTEGER UnrecoveredReads;
  164.     UCHAR         CompressionRatioReads;
  165.     UCHAR         CompressionRatioWrites;
  166. } TAPE_STATISTICS, *PTAPE_STATISTICS;
  167. #define RECOVERED_WRITES_VALID   0x00000001
  168. #define UNRECOVERED_WRITES_VALID 0x00000002
  169. #define RECOVERED_READS_VALID    0x00000004
  170. #define UNRECOVERED_READS_VALID  0x00000008
  171. #define WRITE_COMPRESSION_INFO_VALID  0x00000010
  172. #define READ_COMPRESSION_INFO_VALID   0x00000020
  173. typedef struct _TAPE_GET_STATISTICS {
  174.     ULONG Operation;
  175. } TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS;
  176. #define TAPE_RETURN_STATISTICS 0L
  177. #define TAPE_RETURN_ENV_INFO   1L
  178. #define TAPE_RESET_STATISTICS  2L
  179. //
  180. // IOCTL_STORAGE_GET_MEDIA_TYPES_EX will return an array of DEVICE_MEDIA_INFO
  181. // structures, one per supported type, embedded in the GET_MEDIA_TYPES struct.
  182. //
  183. typedef enum _STORAGE_MEDIA_TYPE {
  184.     //
  185.     // Following are defined in ntdddisk.h in the MEDIA_TYPE enum
  186.     //
  187.     // Unknown,                // Format is unknown
  188.     // F5_1Pt2_512,            // 5.25", 1.2MB,  512 bytes/sector
  189.     // F3_1Pt44_512,           // 3.5",  1.44MB, 512 bytes/sector
  190.     // F3_2Pt88_512,           // 3.5",  2.88MB, 512 bytes/sector
  191.     // F3_20Pt8_512,           // 3.5",  20.8MB, 512 bytes/sector
  192.     // F3_720_512,             // 3.5",  720KB,  512 bytes/sector
  193.     // F5_360_512,             // 5.25", 360KB,  512 bytes/sector
  194.     // F5_320_512,             // 5.25", 320KB,  512 bytes/sector
  195.     // F5_320_1024,            // 5.25", 320KB,  1024 bytes/sector
  196.     // F5_180_512,             // 5.25", 180KB,  512 bytes/sector
  197.     // F5_160_512,             // 5.25", 160KB,  512 bytes/sector
  198.     // RemovableMedia,         // Removable media other than floppy
  199.     // FixedMedia,             // Fixed hard disk media
  200.     // F3_120M_512,            // 3.5", 120M Floppy
  201.     // F3_640_512,             // 3.5" ,  640KB,  512 bytes/sector
  202.     // F5_640_512,             // 5.25",  640KB,  512 bytes/sector
  203.     // F5_720_512,             // 5.25",  720KB,  512 bytes/sector
  204.     // F3_1Pt2_512,            // 3.5" ,  1.2Mb,  512 bytes/sector
  205.     // F3_1Pt23_1024,          // 3.5" ,  1.23Mb, 1024 bytes/sector
  206.     // F5_1Pt23_1024,          // 5.25",  1.23MB, 1024 bytes/sector
  207.     // F3_128Mb_512,           // 3.5" MO 128Mb   512 bytes/sector
  208.     // F3_230Mb_512,           // 3.5" MO 230Mb   512 bytes/sector
  209.     // F8_256_128,             // 8",     256KB,  128 bytes/sector
  210.     // F3_200Mb_512,           // 3.5",   200M Floppy (HiFD)
  211.     //
  212.     DDS_4mm = 0x20,            // Tape - DAT DDS1,2,... (all vendors)
  213.     MiniQic,                   // Tape - miniQIC Tape
  214.     Travan,                    // Tape - Travan TR-1,2,3,...
  215.     QIC,                       // Tape - QIC
  216.     MP_8mm,                    // Tape - 8mm Exabyte Metal Particle
  217.     AME_8mm,                   // Tape - 8mm Exabyte Advanced Metal Evap
  218.     AIT1_8mm,                  // Tape - 8mm Sony AIT
  219.     DLT,                       // Tape - DLT Compact IIIxt, IV
  220.     NCTP,                      // Tape - Philips NCTP
  221.     IBM_3480,                  // Tape - IBM 3480
  222.     IBM_3490E,                 // Tape - IBM 3490E
  223.     IBM_Magstar_3590,          // Tape - IBM Magstar 3590
  224.     IBM_Magstar_MP,            // Tape - IBM Magstar MP
  225.     STK_DATA_D3,               // Tape - STK Data D3
  226.     SONY_DTF,                  // Tape - Sony DTF
  227.     DV_6mm,                    // Tape - 6mm Digital Video
  228.     DMI,                       // Tape - Exabyte DMI and compatibles
  229.     SONY_D2,                   // Tape - Sony D2S and D2L
  230.     CLEANER_CARTRIDGE,         // Cleaner - All Drive types that support Drive Cleaners
  231.     CD_ROM,                    // Opt_Disk - CD
  232.     CD_R,                      // Opt_Disk - CD-Recordable (Write Once)
  233.     CD_RW,                     // Opt_Disk - CD-Rewriteable
  234.     DVD_ROM,                   // Opt_Disk - DVD-ROM
  235.     DVD_R,                     // Opt_Disk - DVD-Recordable (Write Once)
  236.     DVD_RW,                    // Opt_Disk - DVD-Rewriteable
  237.     MO_3_RW,                   // Opt_Disk - 3.5" Rewriteable MO Disk
  238.     MO_5_WO,                   // Opt_Disk - MO 5.25" Write Once
  239.     MO_5_RW,                   // Opt_Disk - MO 5.25" Rewriteable (not LIMDOW)
  240.     MO_5_LIMDOW,               // Opt_Disk - MO 5.25" Rewriteable (LIMDOW)
  241.     PC_5_WO,                   // Opt_Disk - Phase Change 5.25" Write Once Optical
  242.     PC_5_RW,                   // Opt_Disk - Phase Change 5.25" Rewriteable
  243.     PD_5_RW,                   // Opt_Disk - PhaseChange Dual Rewriteable
  244.     ABL_5_WO,                  // Opt_Disk - Ablative 5.25" Write Once Optical
  245.     PINNACLE_APEX_5_RW,        // Opt_Disk - Pinnacle Apex 4.6GB Rewriteable Optical
  246.     SONY_12_WO,                // Opt_Disk - Sony 12" Write Once
  247.     PHILIPS_12_WO,             // Opt_Disk - Philips/LMS 12" Write Once
  248.     HITACHI_12_WO,             // Opt_Disk - Hitachi 12" Write Once
  249.     CYGNET_12_WO,              // Opt_Disk - Cygnet/ATG 12" Write Once
  250.     KODAK_14_WO,               // Opt_Disk - Kodak 14" Write Once
  251.     MO_NFR_525,                // Opt_Disk - Near Field Recording (Terastor)
  252.     NIKON_12_RW,               // Opt_Disk - Nikon 12" Rewriteable
  253.     IOMEGA_ZIP,                // Mag_Disk - Iomega Zip
  254.     IOMEGA_JAZ,                // Mag_Disk - Iomega Jaz
  255.     SYQUEST_EZ135,             // Mag_Disk - Syquest EZ135
  256.     SYQUEST_EZFLYER,           // Mag_Disk - Syquest EzFlyer
  257.     SYQUEST_SYJET,             // Mag_Disk - Syquest SyJet
  258.     AVATAR_F2,                 // Mag_Disk - 2.5" Floppy
  259.     MP2_8mm,                   // Tape - 8mm Hitachi
  260.     DST_S,                     // Ampex DST Small Tapes
  261.     DST_M,                     // Ampex DST Medium Tapes
  262.     DST_L,                     // Ampex DST Large Tapes
  263.     VXATape_1,                 // Ecrix 8mm Tape
  264.     VXATape_2,                 // Ecrix 8mm Tape
  265.     STK_9840,                  // STK 9840
  266.     LTO_Ultrium,               // IBM, HP, Seagate LTO Ultrium
  267.     LTO_Accelis,               // IBM, HP, Seagate LTO Accelis
  268.     DVD_RAM,                   // Opt_Disk - DVD-RAM
  269.     AIT_8mm,                   // AIT2 or higher
  270.     ADR_1,                     // OnStream ADR Mediatypes
  271.     ADR_2
  272. } STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
  273. #define MEDIA_ERASEABLE         0x00000001
  274. #define MEDIA_WRITE_ONCE        0x00000002
  275. #define MEDIA_READ_ONLY         0x00000004
  276. #define MEDIA_READ_WRITE        0x00000008
  277. #define MEDIA_WRITE_PROTECTED   0x00000100
  278. #define MEDIA_CURRENTLY_MOUNTED 0x80000000
  279. //
  280. // Define the different storage bus types
  281. // Bus types below 128 (0x80) are reserved for Microsoft use
  282. //
  283. typedef enum _STORAGE_BUS_TYPE {
  284.     BusTypeUnknown = 0x00,
  285.     BusTypeScsi,
  286.     BusTypeAtapi,
  287.     BusTypeAta,
  288.     BusType1394,
  289.     BusTypeSsa,
  290.     BusTypeFibre,
  291.     BusTypeUsb,
  292.     BusTypeRAID,
  293.     BusTypeMaxReserved = 0x7F
  294. } STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
  295. typedef struct _DEVICE_MEDIA_INFO {
  296.     union {
  297.         struct {
  298.             LARGE_INTEGER Cylinders;
  299.             STORAGE_MEDIA_TYPE MediaType;
  300.             ULONG TracksPerCylinder;
  301.             ULONG SectorsPerTrack;
  302.             ULONG BytesPerSector;
  303.             ULONG NumberMediaSides;
  304.             ULONG MediaCharacteristics; // Bitmask of MEDIA_XXX values.
  305.         } DiskInfo;
  306.         struct {
  307.             LARGE_INTEGER Cylinders;
  308.             STORAGE_MEDIA_TYPE MediaType;
  309.             ULONG TracksPerCylinder;
  310.             ULONG SectorsPerTrack;
  311.             ULONG BytesPerSector;
  312.             ULONG NumberMediaSides;
  313.             ULONG MediaCharacteristics; // Bitmask of MEDIA_XXX values.
  314.         } RemovableDiskInfo;
  315.         struct {
  316.             STORAGE_MEDIA_TYPE MediaType;
  317.             ULONG   MediaCharacteristics; // Bitmask of MEDIA_XXX values.
  318.             ULONG   CurrentBlockSize;
  319.             STORAGE_BUS_TYPE BusType;
  320.             //
  321.             // Bus specific information describing the medium supported.
  322.             //
  323.             union {
  324.                 struct {
  325.                     UCHAR MediumType;
  326.                     UCHAR DensityCode;
  327.                 } ScsiInformation;
  328.             } BusSpecificData;
  329.         } TapeInfo;
  330.     } DeviceSpecific;
  331. } DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
  332. typedef struct _GET_MEDIA_TYPES {
  333.     ULONG DeviceType;              // FILE_DEVICE_XXX values
  334.     ULONG MediaInfoCount;
  335.     DEVICE_MEDIA_INFO MediaInfo[1];
  336. } GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
  337. //
  338. // IOCTL_STORAGE_PREDICT_FAILURE
  339. //
  340. // input - none
  341. //
  342. // output - STORAGE_PREDICT_FAILURE structure
  343. //          PredictFailure returns zero if no failure predicted and non zero
  344. //                         if a failure is predicted.
  345. //
  346. //          VendorSpecific returns 512 bytes of vendor specific information
  347. //                         if a failure is predicted
  348. //
  349. typedef struct _STORAGE_PREDICT_FAILURE
  350. {
  351.     ULONG PredictFailure;
  352.     UCHAR VendorSpecific[512];
  353. } STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;
  354. // end_ntminitape
  355. // end_winioctl
  356. //
  357. // Property Query Structures
  358. //
  359. //
  360. // IOCTL_STORAGE_QUERY_PROPERTY
  361. //
  362. // Input Buffer:
  363. //      a STORAGE_PROPERTY_QUERY structure which describes what type of query
  364. //      is being done, what property is being queried for, and any additional
  365. //      parameters which a particular property query requires.
  366. //
  367. //  Output Buffer:
  368. //      Contains a buffer to place the results of the query into.  Since all
  369. //      property descriptors can be cast into a STORAGE_DESCRIPTOR_HEADER,
  370. //      the IOCTL can be called once with a small buffer then again using
  371. //      a buffer as large as the header reports is necessary.
  372. //
  373. //
  374. // Types of queries
  375. //
  376. typedef enum _STORAGE_QUERY_TYPE {
  377.     PropertyStandardQuery = 0,          // Retrieves the descriptor
  378.     PropertyExistsQuery,                // Used to test whether the descriptor is supported
  379.     PropertyMaskQuery,                  // Used to retrieve a mask of writeable fields in the descriptor
  380.     PropertyQueryMaxDefined     // use to validate the value
  381. } STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
  382. //
  383. // define some initial property id's
  384. //
  385. typedef enum _STORAGE_PROPERTY_ID {
  386.     StorageDeviceProperty = 0,
  387.     StorageAdapterProperty,
  388.     StorageDeviceIdProperty
  389. } STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
  390. //
  391. // Query structure - additional parameters for specific queries can follow
  392. // the header
  393. //
  394. typedef struct _STORAGE_PROPERTY_QUERY {
  395.     //
  396.     // ID of the property being retrieved
  397.     //
  398.     STORAGE_PROPERTY_ID PropertyId;
  399.     //
  400.     // Flags indicating the type of query being performed
  401.     //
  402.     STORAGE_QUERY_TYPE QueryType;
  403.     //
  404.     // Space for additional parameters if necessary
  405.     //
  406.     UCHAR AdditionalParameters[1];
  407. } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
  408. //
  409. // Standard property descriptor header.  All property pages should use this
  410. // as their first element or should contain these two elements
  411. //
  412. typedef struct _STORAGE_DESCRIPTOR_HEADER {
  413.     ULONG Version;
  414.     ULONG Size;
  415. } STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
  416. //
  417. // Device property descriptor - this is really just a rehash of the inquiry
  418. // data retrieved from a scsi device
  419. //
  420. // This may only be retrieved from a target device.  Sending this to the bus
  421. // will result in an error
  422. //
  423. typedef struct _STORAGE_DEVICE_DESCRIPTOR {
  424.     //
  425.     // Sizeof(STORAGE_DEVICE_DESCRIPTOR)
  426.     //
  427.     ULONG Version;
  428.     //
  429.     // Total size of the descriptor, including the space for additional
  430.     // data and id strings
  431.     //
  432.     ULONG Size;
  433.     //
  434.     // The SCSI-2 device type
  435.     //
  436.     UCHAR DeviceType;
  437.     //
  438.     // The SCSI-2 device type modifier (if any) - this may be zero
  439.     //
  440.     UCHAR DeviceTypeModifier;
  441.     //
  442.     // Flag indicating whether the device's media (if any) is removable.  This
  443.     // field should be ignored for media-less devices
  444.     //
  445.     BOOLEAN RemovableMedia;
  446.     //
  447.     // Flag indicating whether the device can support mulitple outstanding
  448.     // commands.  The actual synchronization in this case is the responsibility
  449.     // of the port driver.
  450.     //
  451.     BOOLEAN CommandQueueing;
  452.     //
  453.     // Byte offset to the zero-terminated ascii string containing the device's
  454.     // vendor id string.  For devices with no such ID this will be zero
  455.     //
  456.     ULONG VendorIdOffset;
  457.     //
  458.     // Byte offset to the zero-terminated ascii string containing the device's
  459.     // product id string.  For devices with no such ID this will be zero
  460.     //
  461.     ULONG ProductIdOffset;
  462.     //
  463.     // Byte offset to the zero-terminated ascii string containing the device's
  464.     // product revision string.  For devices with no such string this will be
  465.     // zero
  466.     //
  467.     ULONG ProductRevisionOffset;
  468.     //
  469.     // Byte offset to the zero-terminated ascii string containing the device's
  470.     // serial number.  For devices with no serial number this will be zero
  471.     //
  472.     ULONG SerialNumberOffset;
  473.     //
  474.     // Contains the bus type (as defined above) of the device.  It should be
  475.     // used to interpret the raw device properties at the end of this structure
  476.     // (if any)
  477.     //
  478.     STORAGE_BUS_TYPE BusType;
  479.     //
  480.     // The number of bytes of bus-specific data which have been appended to
  481.     // this descriptor
  482.     //
  483.     ULONG RawPropertiesLength;
  484.     //
  485.     // Place holder for the first byte of the bus specific property data
  486.     //
  487.     UCHAR RawDeviceProperties[1];
  488. } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
  489. //
  490. // Adapter properties
  491. //
  492. // This descriptor can be retrieved from a target device object of from the
  493. // device object for the bus.  Retrieving from the target device object will
  494. // forward the request to the underlying bus
  495. //
  496. typedef struct _STORAGE_ADAPTER_DESCRIPTOR {
  497.     ULONG Version;
  498.     ULONG Size;
  499.     ULONG MaximumTransferLength;
  500.     ULONG MaximumPhysicalPages;
  501.     ULONG AlignmentMask;
  502.     BOOLEAN AdapterUsesPio;
  503.     BOOLEAN AdapterScansDown;
  504.     BOOLEAN CommandQueueing;
  505.     BOOLEAN AcceleratedTransfer;
  506.     UCHAR BusType;
  507.     USHORT BusMajorVersion;
  508.     USHORT BusMinorVersion;
  509. } STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
  510. //
  511. // Storage identification descriptor.
  512. // The definitions here are based on the SCSI/SBP vital product data
  513. // device identifier page.
  514. //
  515. typedef enum _STORAGE_IDENTIFIER_CODE_SET {
  516.     StorageIdCodeSetReserved = 0,
  517.     StorageIdCodeSetBinary = 1,
  518.     StorageIdCodeSetAscii = 2
  519. } STORAGE_IDENTIFIER_CODE_SET, *PSTORAGE_IDENTIFIER_CODE_SET;
  520. typedef enum _STORAGE_IDENTIFIER_TYPE {
  521.     StorageIdTypeVendorSpecific = 0,
  522.     StorageIdTypeVendorId = 1,
  523.     StorageIdTypeEUI64 = 2,
  524.     StorageIdTypeFCPHName = 3,
  525.     StorageIdTypePortRelative = 4
  526. } STORAGE_IDENTIFIER_TYPE, *PSTORAGE_IDENTIFIER_TYPE;
  527. typedef enum _STORAGE_ASSOCIATION_TYPE {
  528.     StorageIdAssocDevice = 0,
  529.     StorageIdAssocPort = 1
  530. } STORAGE_ASSOCIATION_TYPE, *PSTORAGE_ASSOCIATION_TYPE;
  531. typedef struct _STORAGE_IDENTIFIER {
  532.     STORAGE_IDENTIFIER_CODE_SET CodeSet;
  533.     STORAGE_IDENTIFIER_TYPE Type;
  534.     USHORT IdentifierSize;
  535.     USHORT NextOffset;
  536.     //
  537.     // Add new fields here since existing code depends on
  538.     // the above layout not changing.
  539.     //
  540.     STORAGE_ASSOCIATION_TYPE Association;
  541.     //
  542.     // The identifier is a variable length array of bytes.
  543.     //
  544.     UCHAR Identifier[1];
  545. } STORAGE_IDENTIFIER, *PSTORAGE_IDENTIFIER;
  546. typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
  547.     ULONG Version;
  548.     ULONG Size;
  549.     //
  550.     // The number of identifiers reported by the device.
  551.     //
  552.     ULONG NumberOfIdentifiers;
  553.     //
  554.     // The following field is actually a variable length array of identification
  555.     // descriptors.  Unfortunately there's no C notation for an array of
  556.     // variable length structures so we're forced to just pretend.
  557.     //
  558.     UCHAR Identifiers[1];
  559. } STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
  560. #pragma warning(push)
  561. #pragma warning(disable:4200)
  562. typedef struct _STORAGE_MEDIA_SERIAL_NUMBER_DATA {
  563.     USHORT Reserved;
  564.     //
  565.     // the SerialNumberLength will be set to zero
  566.     // if the command is supported and the media
  567.     // does not have a valid serial number.
  568.     //
  569.     USHORT SerialNumberLength;
  570.     //
  571.     // the following data is binary, and is not guaranteed
  572.     // to be NULL terminated.  this is an excercise for the
  573.     // caller.
  574.     //
  575.     UCHAR SerialNumber[0];
  576. } STORAGE_MEDIA_SERIAL_NUMBER_DATA, *PSTORAGE_MEDIA_SERIAL_NUMBER_DATA;
  577. #pragma warning(push)
  578. // begin_winioctl
  579. #ifdef __cplusplus
  580. }
  581. #endif
  582. #endif // _NTDDSTOR_H_
  583. // end_winioctl