#ifndef __NTDDMMC__ #if _MSC_VER >= 1200 #pragma warning(push) #endif #pragma warning(disable:4200) // array[0] is not a warning for this file // // NOTE: All FEATURE_* structures may be extended. use of these structures // requires verification that the FeatureHeader->AdditionLength field // contains AT LEAST enough data to cover the data fields being accessed. // This is due to the design, which allows extending the size of the // various structures, which will result in these structures sizes // being changed over time. // *** Programmers beware! *** // // // NOTE: This is based on MMC 3 // Further revisions will maintain backward compatibility // with the non-reserved fields listed here. If you need // to access a new field, please typecast to FEATURE_DATA_RESERVED // and access the appropriate bits there. // typedef struct _GET_CONFIGURATION_HEADER { UCHAR DataLength[4]; // [0] == MSB, [3] == LSB UCHAR Reserved[2]; UCHAR CurrentProfile[2]; // [0] == MSB, [1] == LSB UCHAR Data[0]; // extra data, typically FEATURE_HEADER } GET_CONFIGURATION_HEADER, *PGET_CONFIGURATION_HEADER; typedef struct _FEATURE_HEADER { UCHAR FeatureCode[2]; // [0] == MSB, [1] == LSB UCHAR Current : 1; // The feature is currently active UCHAR Persistent : 1; // The feature is always current UCHAR Version : 4; UCHAR Reserved0 : 2; UCHAR AdditionalLength; // sizeof(Header) + AdditionalLength = size } FEATURE_HEADER, *PFEATURE_HEADER; typedef enum _FEATURE_PROFILE_TYPE { ProfileInvalid = 0x0000, ProfileNonRemovableDisk = 0x0001, ProfileRemovableDisk = 0x0002, ProfileMOErasable = 0x0003, ProfileMOWriteOnce = 0x0004, ProfileAS_MO = 0x0005, // Reserved 0x0006 - 0x0007 ProfileCdrom = 0x0008, ProfileCdRecordable = 0x0009, ProfileCdRewritable = 0x000a, // Reserved 0x000b - 0x000f ProfileDvdRom = 0x0010, ProfileDvdRecordable = 0x0011, ProfileDvdRam = 0x0012, // also DVD+RW ProfileDvdRewritable = 0x0013, // restricted overwrite ProfileDvdRWSequential = 0x0014, // Reserved 0x0014 - 0x0019 ProfileDvdPlusRW = 0x001A, // Reserved 0x001B - 001F ProfileDDCdrom = 0x0020, ProfileDDCdRecordable = 0x0021, ProfileDDCdRewritable = 0x0022, // Reserved 0x0023 - 0xfffe ProfileNonStandard = 0xffff } FEATURE_PROFILE_TYPE, *PFEATURE_PROFILE_TYPE; typedef enum _FEATURE_NUMBER { FeatureProfileList = 0x0000, FeatureCore = 0x0001, FeatureMorphing = 0x0002, FeatureRemovableMedium = 0x0003, FeatureWriteProtect = 0x0004, // Reserved 0x0005 - 0x000f FeatureRandomReadable = 0x0010, // Reserved 0x0011 - 0x001c FeatureMultiRead = 0x001d, FeatureCdRead = 0x001e, FeatureDvdRead = 0x001f, FeatureRandomWritable = 0x0020, FeatureIncrementalStreamingWritable = 0x0021, FeatureSectorErasable = 0x0022, FeatureFormattable = 0x0023, FeatureDefectManagement = 0x0024, FeatureWriteOnce = 0x0025, FeatureRestrictedOverwrite = 0x0026, FeatureCdrwCAVWrite = 0x0027, FeatureMrw = 0x0028, // Reserved 0x0029 FeatureDvdPlusRW = 0x002A, // Reserved 0x002b FeatureRigidRestrictedOverwrite = 0x002c, FeatureCdTrackAtOnce = 0x002d, FeatureCdMastering = 0x002e, FeatureDvdRecordableWrite = 0x002f, // both -R and -RW FeatureDDCDRead = 0x0030, FeatureDDCDRWrite = 0x0031, FeatureDDCDRWWrite = 0x0032, // Reserved 0x0033 - 0x00ff FeaturePowerManagement = 0x0100, FeatureSMART = 0x0101, FeatureEmbeddedChanger = 0x0102, FeatureCDAudioAnalogPlay = 0x0103, FeatureMicrocodeUpgrade = 0x0104, FeatureTimeout = 0x0105, FeatureDvdCSS = 0x0106, FeatureRealTimeStreaming = 0x0107, FeatureLogicalUnitSerialNumber = 0x0108, // Reserved 0x0109 FeatureDiscControlBlocks = 0x010a, FeatureDvdCPRM = 0x010b // Reserved 0x010c - 0xfeff // Vendor Unique 0xff00 - 0xffff } FEATURE_NUMBER, *PFEATURE_NUMBER; // 0x0000 - FeatureProfileList // an integral multiple of the _EX structures are returned for page 0000 typedef struct _FEATURE_DATA_PROFILE_LIST_EX { UCHAR ProfileNumber[2]; // [0] == MSB, [1] == LSB UCHAR Current : 1; UCHAR Reserved1 : 7; UCHAR Reserved2; } FEATURE_DATA_PROFILE_LIST_EX, *PFEATURE_DATA_PROFILE_LIST_EX; typedef struct _FEATURE_DATA_PROFILE_LIST { FEATURE_HEADER Header; FEATURE_DATA_PROFILE_LIST_EX Profiles[0]; } FEATURE_DATA_PROFILE_LIST, *PFEATURE_DATA_PROFILE_LIST; // 0x0001 - FeatureCore typedef struct _FEATURE_DATA_CORE { FEATURE_HEADER Header; UCHAR PhysicalInterface[4]; // [0] == MSB, [3] == LSB } FEATURE_DATA_CORE, *PFEATURE_DATA_CORE; // 0x0002 - FeatureMorphing typedef struct _FEATURE_DATA_MORPHING { FEATURE_HEADER Header; UCHAR Asynchronous : 1; UCHAR Reserved1 : 7; UCHAR Reserved2[3]; } FEATURE_DATA_MORPHING, *PFEATURE_DATA_MORPHING; // 0x0003 - FeatureRemovableMedium typedef struct _FEATURE_DATA_REMOVABLE_MEDIUM { FEATURE_HEADER Header; UCHAR Lockable : 1; UCHAR Reserved1 : 1; UCHAR DefaultToPrevent : 1; UCHAR Eject : 1; UCHAR Reserved2 : 1; UCHAR LoadingMechanism : 3; UCHAR Reserved3[3]; } FEATURE_DATA_REMOVABLE_MEDIUM, *PFEATURE_DATA_REMOVABLE_MEDIUM; // 0x0004 - FeatureWriteProtect typedef struct _FEATURE_DATA_WRITE_PROTECT { FEATURE_HEADER Header; UCHAR SupportsSWPPBit : 1; UCHAR SupportsPersistentWriteProtect : 1; UCHAR Reserved1 : 6; UCHAR Reserved2[3]; } FEATURE_DATA_WRITE_PROTECT, *PFEATURE_DATA_WRITE_PROTECT; // 0x0005 - 0x000f are Reserved // 0x0010 - FeatureRandomReadable typedef struct _FEATURE_DATA_RANDOM_READABLE { FEATURE_HEADER Header; UCHAR LogicalBlockSize[4]; UCHAR Blocking[2]; UCHAR ErrorRecoveryPagePresent : 1; UCHAR Reserved1 : 7; UCHAR Reserved2; } FEATURE_DATA_RANDOM_READABLE, *PFEATURE_DATA_RANDOM_READABLE; // 0x0011 - 0x001c are Reserved // 0x001d - FeatureMultiRead typedef struct _FEATURE_DATA_MULTI_READ { FEATURE_HEADER Header; } FEATURE_DATA_MULTI_READ, *PFEATURE_DATA_MULTI_READ; // 0x001e - FeatureCdRead typedef struct _FEATURE_DATA_CD_READ { FEATURE_HEADER Header; UCHAR CDText : 1; UCHAR C2ErrorData : 1; UCHAR Reserved1 : 6; UCHAR Reserved2[3]; } FEATURE_DATA_CD_READ, *PFEATURE_DATA_CD_READ; // 0x001f - FeatureDvdRead typedef struct _FEATURE_DATA_DVD_READ { FEATURE_HEADER Header; } FEATURE_DATA_DVD_READ, *PFEATURE_DATA_DVD_READ; // 0x0020 - FeatureRandomWritable typedef struct _FEATURE_DATA_RANDOM_WRITABLE { FEATURE_HEADER Header; UCHAR LastLBA[4]; UCHAR LogicalBlockSize[4]; UCHAR Blocking[2]; UCHAR ErrorRecoveryPagePresent : 1; UCHAR Reserved1 : 7; UCHAR Reserved2; } FEATURE_DATA_RANDOM_WRITABLE, *PFEATURE_DATA_RANDOM_WRITABLE; // 0x0021 - FeatureIncrementalStreamingWritable typedef struct _FEATURE_DATA_INCREMENTAL_STREAMING_WRITABLE { FEATURE_HEADER Header; UCHAR DataTypeSupported[2]; // [0] == MSB, [1] == LSB // see also FeatureCdTrackAtOnce UCHAR BufferUnderrunFree : 1; UCHAR Reserved1 : 7; UCHAR NumberOfLinkSizes; UCHAR LinkSize[0]; } FEATURE_DATA_INCREMENTAL_STREAMING_WRITABLE, *PFEATURE_DATA_INCREMENTAL_STREAMING_WRITABLE; // 0x0022 - FeatureSectorErasable typedef struct _FEATURE_DATA_SECTOR_ERASABLE { FEATURE_HEADER Header; } FEATURE_DATA_SECTOR_ERASABLE, *PFEATURE_DATA_SECTOR_ERASABLE; // 0x0023 - FeatureFormattable typedef struct _FEATURE_DATA_FORMATTABLE { FEATURE_HEADER Header; } FEATURE_DATA_FORMATTABLE, *PFEATURE_DATA_FORMATTABLE; // 0x0024 - FeatureDefectManagement typedef struct _FEATURE_DATA_DEFECT_MANAGEMENT { FEATURE_HEADER Header; UCHAR Reserved1 : 7; UCHAR SupplimentalSpareArea : 1; UCHAR Reserved2[3]; } FEATURE_DATA_DEFECT_MANAGEMENT, *PFEATURE_DATA_DEFECT_MANAGEMENT; // 0x0025 - FeatureWriteOnce typedef struct _FEATURE_DATA_WRITE_ONCE { FEATURE_HEADER Header; UCHAR LogicalBlockSize[4]; UCHAR Blocking[2]; UCHAR ErrorRecoveryPagePresent : 1; UCHAR Reserved1 : 7; UCHAR Reserved2; } FEATURE_DATA_WRITE_ONCE, *PFEATURE_DATA_WRITE_ONCE; // 0x0026 - FeatureRestrictedOverwrite typedef struct _FEATURE_DATA_RESTRICTED_OVERWRITE { FEATURE_HEADER Header; } FEATURE_DATA_RESTRICTED_OVERWRITE; // 0x0027 - FeatureCdrwCAVWrite typedef struct _FEATURE_DATA_CDRW_CAV_WRITE { FEATURE_HEADER Header; UCHAR Reserved1[4]; } FEATURE_DATA_CDRW_CAV_WRITE, *PFEATURE_DATA_CDRW_CAV_WRITE; // 0x0028 - FeatureMrw typedef struct _FEATURE_DATA_MRW { FEATURE_HEADER Header; UCHAR Write : 1; UCHAR Reserved1 : 7; UCHAR Reserved2[3]; } FEATURE_DATA_MRW, *PFEATURE_DATA_MRW; // 0x0029 is Reserved // 0x002A - FeatureDvdPlusRW typedef struct _FEATURE_DATA_DVD_PLUS_RW { FEATURE_HEADER Header; UCHAR Write : 1; UCHAR Reserved1 : 7; UCHAR Reserved2[3]; } FEATURE_DATA_DVD_PLUS_RW, *PFEATURE_DATA_DVD_PLUS_RW; // 0x002b is Reserved // 0x002c - FeatureDvdRwRestrictedOverwrite typedef struct _FEATURE_DATA_DVD_RW_RESTRICTED_OVERWRITE { FEATURE_HEADER Header; UCHAR Blank : 1; UCHAR Intermediate : 1; UCHAR DefectStatusDataRead : 1; UCHAR DefectStatusDataGenerate : 1; UCHAR Reserved0 : 4; UCHAR Reserved1[3]; } FEATURE_DATA_DVD_RW_RESTRICTED_OVERWRITE, *PFEATURE_DATA_DVD_RW_RESTRICTED_OVERWRITE; // 0x002d - FeatureCdTrackAtOnce typedef struct _FEATURE_DATA_CD_TRACK_AT_ONCE { FEATURE_HEADER Header; UCHAR RWSubchannelsRecordable : 1; UCHAR CdRewritable : 1; UCHAR TestWriteOk : 1; UCHAR RWSubchannelPackedOk : 1; // MMC 3 + UCHAR RWSubchannelRawOk : 1; // MMC 3 + UCHAR Reserved1 : 1; UCHAR BufferUnderrunFree : 1; // MMC 3 + UCHAR Reserved3 : 1; UCHAR Reserved2; UCHAR DataTypeSupported[2]; // [0] == MSB, [1] == LSB // see also FeatureIncrementalStreamingWritable } FEATURE_DATA_CD_TRACK_AT_ONCE, *PFEATURE_DATA_CD_TRACK_AT_ONCE; // 0x002e - FeatureCdMastering typedef struct _FEATURE_DATA_CD_MASTERING { FEATURE_HEADER Header; UCHAR RWSubchannelsRecordable : 1; UCHAR CdRewritable : 1; UCHAR TestWriteOk : 1; UCHAR RawRecordingOk : 1; UCHAR RawMultiSessionOk : 1; UCHAR SessionAtOnceOk : 1; UCHAR BufferUnderrunFree : 1; UCHAR Reserved1 : 1; UCHAR MaximumCueSheetLength[3]; // [0] == MSB, [2] == LSB } FEATURE_DATA_CD_MASTERING, *PFEATURE_DATA_CD_MASTERING; // 0x002f - FeatureDvdRecordableWrite typedef struct _FEATURE_DATA_DVD_RECORDABLE_WRITE { FEATURE_HEADER Header; UCHAR Reserved1 : 1; UCHAR DVD_RW : 1; UCHAR TestWrite : 1; UCHAR Reserved2 : 3; UCHAR BufferUnderrunFree : 1; UCHAR Reserved3 : 1; UCHAR Reserved4[3]; } FEATURE_DATA_DVD_RECORDABLE_WRITE, *PFEATURE_DATA_DVD_RECORDABLE_WRITE; // 0x0030 - FeatureDDCDRead typedef struct _FEATURE_DATA_DDCD_READ { FEATURE_HEADER Header; } FEATURE_DATA_DDCD_READ, *PFEATURE_DATA_DDCD_READ; // 0x0031 - FeatureDDCDRWrite typedef struct _FEATURE_DATA_DDCD_R_WRITE { FEATURE_HEADER Header; UCHAR Reserved1 : 2; UCHAR TestWrite : 1; UCHAR Reserved2 : 5; UCHAR Reserved3[3]; } FEATURE_DATA_DDCD_R_WRITE, *PFEATURE_DATA_DDCD_R_WRITE; // 0x0032 - FeatureDDCDRWWrite typedef struct _FEATURE_DATA_DDCD_RW_WRITE { FEATURE_HEADER Header; UCHAR Blank : 1; UCHAR Intermediate : 1; UCHAR Reserved1 : 6; UCHAR Reserved2[3]; } FEATURE_DATA_DDCD_RW_WRITE, *PFEATURE_DATA_DDCD_RW_WRITE; // 0x0033 - 0x00ff are Reserved // 0x0100 - FeaturePowerManagement typedef struct _FEATURE_DATA_POWER_MANAGEMENT { FEATURE_HEADER Header; } FEATURE_DATA_POWER_MANAGEMENT, *PFEATURE_DATA_POWER_MANAGEMENT; // 0x0101 - FeatureSMART (not in MMC 2) typedef struct _FEATURE_DATA_SMART { FEATURE_HEADER Header; UCHAR FaultFailureReportingPagePresent : 1; UCHAR Reserved1 : 7; UCHAR Reserved2; } FEATURE_DATA_SMART, *PFEATURE_DATA_SMART; // 0x0102 - FeatureEmbeddedChanger typedef struct _FEATURE_DATA_EMBEDDED_CHANGER { FEATURE_HEADER Header; UCHAR Reserved1 : 2; UCHAR SupportsDiscPresent : 1; UCHAR Reserved2 : 1; UCHAR SideChangeCapable : 1; UCHAR Reserved3 : 3; UCHAR Reserved4[2]; UCHAR HighestSlotNumber : 5; UCHAR Reserved : 3; } FEATURE_DATA_EMBEDDED_CHANGER, *PFEATURE_DATA_EMBEDDED_CHANGER; // 0x0103 - FeatureCDAudioAnalogPlay typedef struct _FEATURE_DATA_CD_AUDIO_ANALOG_PLAY { FEATURE_HEADER Header; UCHAR SeperateVolume : 1; UCHAR SeperateChannelMute : 1; UCHAR ScanSupported : 1; UCHAR Reserved1 : 5; UCHAR Reserved2; UCHAR NumerOfVolumeLevels[2]; // [0] == MSB, [1] == LSB } FEATURE_DATA_CD_AUDIO_ANALOG_PLAY, *PFEATURE_DATA_CD_AUDIO_ANALOG_PLAY; // 0x0104 - FeatureMicrocodeUpgrade typedef struct _FEATURE_DATA_MICROCODE_UPDATE { FEATURE_HEADER Header; } FEATURE_DATA_MICROCODE_UPDATE, *PFEATURE_DATA_MICROCODE_UPDATE; // 0x0105 - FeatureTimeout typedef struct _FEATURE_DATA_TIMEOUT { FEATURE_HEADER Header; } FEATURE_DATA_TIMEOUT, *PFEATURE_DATA_TIMEOUT; // 0x0106 - FeatureDvdCSS typedef struct _FEATURE_DATA_DVD_CSS { FEATURE_HEADER Header; UCHAR Reserved1[3]; UCHAR CssVersion; } FEATURE_DATA_DVD_CSS, *PFEATURE_DATA_DVD_CSS; // 0x0107 - FeatureRealTimeStreaming typedef struct _FEATURE_DATA_REAL_TIME_STREAMING { FEATURE_HEADER Header; UCHAR StreamRecording : 1; UCHAR WriteSpeedInGetPerf : 1; UCHAR WriteSpeedInMP2A : 1; UCHAR SetCDSpeed : 1; UCHAR ReadBufferCapacityBlock : 1; UCHAR Reserved1 : 3; UCHAR Reserved2[3]; } FEATURE_DATA_REAL_TIME_STREAMING, *PFEATURE_DATA_REAL_TIME_STREAMING; // 0x0108 - FeatureLogicalUnitSerialNumber typedef struct _FEATURE_DATA_LOGICAL_UNIT_SERIAL_NUMBER { FEATURE_HEADER Header; UCHAR SerialNumber[0]; } FEATURE_DATA_LOGICAL_UNIT_SERIAL_NUMBER, *PFEATURE_DATA_LOGICAL_UNIT_SERIAL_NUMBER; // 0x0109 is Reserved // 0x010a // an integral multiple of the _EX structures are returned for page 010A typedef struct _FEATURE_DATA_DISC_CONTROL_BLOCKS_EX { UCHAR ContentDescriptor[4]; } FEATURE_DATA_DISC_CONTROL_BLOCKS_EX, *PFEATURE_DATA_DISC_CONTROL_BLOCKS_EX; // use a zero-sized array for this.... typedef struct _FEATURE_DATA_DISC_CONTROL_BLOCKS { FEATURE_HEADER Header; FEATURE_DATA_DISC_CONTROL_BLOCKS_EX Data[0]; } FEATURE_DATA_DISC_CONTROL_BLOCKS, *PFEATURE_DATA_DISC_CONTROL_BLOCKS; // 0x010b typedef struct _FEATURE_DATA_DVD_CPRM { FEATURE_HEADER Header; UCHAR Reserved0[3]; UCHAR CPRMVersion; } FEATURE_DATA_DVD_CPRM, *PFEATURE_DATA_DVD_CPRM; // 0x010c - 0xfeff are Reserved typedef struct _FEATURE_DATA_RESERVED { FEATURE_HEADER Header; UCHAR Data[0]; } FEATURE_DATA_RESERVED, *PFEATURE_DATA_RESERVED; // 0xff00 - 0xffff are Vendor Specific typedef struct _FEATURE_DATA_VENDOR_SPECIFIC { FEATURE_HEADER Header; UCHAR VendorSpecificData[0]; } FEATURE_DATA_VENDOR_SPECIFIC, *PFEATURE_DATA_VENDOR_SPECIFIC; // // NOTE: All FEATURE_* structures may be extended. use of these structures // requires verification that the FeatureHeader->AdditionLength field // contains AT LEAST enough data to cover the data fields being accessed. // This is due to the design, which allows extending the size of the // various structures, which will result in these structures sizes // being changed over time. // *** Programmers beware! *** // // // NOTE: This is based on MMC 3 // Further revisions will maintain backward compatibility // with the non-reserved fields listed here. If you need // to access a new field, please typecast to FEATURE_DATA_RESERVED // and access the appropriate bits there. // // // IOCTL_CDROM_GET_CONFIGURATION returns a FEATURE_* struct, which always // starts with a FEATURE_HEADER structure. // // // these are to be used for the request type // #define SCSI_GET_CONFIGURATION_REQUEST_TYPE_ALL 0x0 #define SCSI_GET_CONFIGURATION_REQUEST_TYPE_CURRENT 0x1 #define SCSI_GET_CONFIGURATION_REQUEST_TYPE_ONE 0x2 typedef struct _GET_CONFIGURATION_IOCTL_INPUT { FEATURE_NUMBER Feature; ULONG RequestType; // SCSI_GET_CONFIGURATION_REQUEST_TYPE_* PVOID Reserved[2]; } GET_CONFIGURATION_IOCTL_INPUT, *PGET_CONFIGURATION_IOCTL_INPUT; #if _MSC_VER >= 1200 #pragma warning(pop) // un-sets any local warning changes #endif #pragma warning(default:4200) // array[0] is not a warning for this file #endif // __NTDDMMC__