#pragma once
#include <Windows.h>

// Lifted from Irb.h
typedef struct _IDENTIFY_DEVICE_DATA {
    struct {
        USHORT Reserved1 : 1;
        USHORT Retired3 : 1;
        USHORT ResponseIncomplete : 1;
        USHORT Retired2 : 3;
        USHORT FixedDevice : 1;
        USHORT RemovableMedia : 1;
        USHORT Retired1 : 7;
        USHORT DeviceType : 1;
    } GeneralConfiguration;
    USHORT NumCylinders;
    USHORT SpecificConfiguration;
    USHORT NumHeads;
    USHORT Retired1[2];
    USHORT NumSectorsPerTrack;
    USHORT VendorUnique1[3];
    UCHAR SerialNumber[20];
    USHORT Retired2[2];
    USHORT Obsolete1;
    UCHAR FirmwareRevision[8];
    UCHAR ModelNumber[40];
    UCHAR MaximumBlockTransfer;
    UCHAR VendorUnique2;
    struct {
        USHORT FeatureSupported : 1;
        USHORT Reserved : 15;
    } TrustedComputing;
    struct {
        UCHAR CurrentLongPhysicalSectorAlignment : 2;
        UCHAR ReservedByte49 : 6;
        UCHAR DmaSupported : 1;
        UCHAR LbaSupported : 1;
        UCHAR IordyDisable : 1;
        UCHAR IordySupported : 1;
        UCHAR Reserved1 : 1;
        UCHAR StandybyTimerSupport : 1;
        UCHAR Reserved2 : 2;
        USHORT ReservedWord50;
    } Capabilities;
    USHORT ObsoleteWords51[2];
    USHORT TranslationFieldsValid : 3;
    USHORT Reserved3 : 5;
    USHORT FreeFallControlSensitivity : 8;
    USHORT NumberOfCurrentCylinders;
    USHORT NumberOfCurrentHeads;
    USHORT CurrentSectorsPerTrack;
    ULONG CurrentSectorCapacity;
    UCHAR CurrentMultiSectorSetting;
    UCHAR MultiSectorSettingValid : 1;
    UCHAR ReservedByte59 : 3;
    UCHAR SanitizeFeatureSupported : 1;
    UCHAR CryptoScrambleExtCommandSupported : 1;
    UCHAR OverwriteExtCommandSupported : 1;
    UCHAR BlockEraseExtCommandSupported : 1;
    ULONG UserAddressableSectors;
    USHORT ObsoleteWord62;
    USHORT MultiWordDMASupport : 8;
    USHORT MultiWordDMAActive : 8;
    USHORT AdvancedPIOModes : 8;
    USHORT ReservedByte64 : 8;
    USHORT MinimumMWXferCycleTime;
    USHORT RecommendedMWXferCycleTime;
    USHORT MinimumPIOCycleTime;
    USHORT MinimumPIOCycleTimeIORDY;
    struct {
        USHORT ZonedCapabilities : 2;
        USHORT NonVolatileWriteCache : 1;
        USHORT ExtendedUserAddressableSectorsSupported : 1;
        USHORT DeviceEncryptsAllUserData : 1;
        USHORT ReadZeroAfterTrimSupported : 1;
        USHORT Optional28BitCommandsSupported : 1;
        USHORT IEEE1667 : 1;
        USHORT DownloadMicrocodeDmaSupported : 1;
        USHORT SetMaxSetPasswordUnlockDmaSupported : 1;
        USHORT WriteBufferDmaSupported : 1;
        USHORT ReadBufferDmaSupported : 1;
        USHORT DeviceConfigIdentifySetDmaSupported : 1;
        USHORT LPSAERCSupported : 1;
        USHORT DeterministicReadAfterTrimSupported : 1;
        USHORT CFastSpecSupported : 1;
    } AdditionalSupported;
    USHORT ReservedWords70[5];
    USHORT QueueDepth : 5;
    USHORT ReservedWord75 : 11;
    struct {
        USHORT Reserved0 : 1;
        USHORT SataGen1 : 1;
        USHORT SataGen2 : 1;
        USHORT SataGen3 : 1;
        USHORT Reserved1 : 4;
        USHORT NCQ : 1;
        USHORT HIPM : 1;
        USHORT PhyEvents : 1;
        USHORT NcqUnload : 1;
        USHORT NcqPriority : 1;
        USHORT HostAutoPS : 1;
        USHORT DeviceAutoPS : 1;
        USHORT ReadLogDMA : 1;
        USHORT Reserved2 : 1;
        USHORT CurrentSpeed : 3;
        USHORT NcqStreaming : 1;
        USHORT NcqQueueMgmt : 1;
        USHORT NcqReceiveSend : 1;
        USHORT DEVSLPtoReducedPwrState : 1;
        USHORT Reserved3 : 8;
    } SerialAtaCapabilities;
    struct {
        USHORT Reserved0 : 1;
        USHORT NonZeroOffsets : 1;
        USHORT DmaSetupAutoActivate : 1;
        USHORT DIPM : 1;
        USHORT InOrderData : 1;
        USHORT HardwareFeatureControl : 1;
        USHORT SoftwareSettingsPreservation : 1;
        USHORT NCQAutosense : 1;
        USHORT DEVSLP : 1;
        USHORT HybridInformation : 1;
        USHORT Reserved1 : 6;
    } SerialAtaFeaturesSupported;
    struct {
        USHORT Reserved0 : 1;
        USHORT NonZeroOffsets : 1;
        USHORT DmaSetupAutoActivate : 1;
        USHORT DIPM : 1;
        USHORT InOrderData : 1;
        USHORT HardwareFeatureControl : 1;
        USHORT SoftwareSettingsPreservation : 1;
        USHORT DeviceAutoPS : 1;
        USHORT DEVSLP : 1;
        USHORT HybridInformation : 1;
        USHORT Reserved1 : 6;
    } SerialAtaFeaturesEnabled;
    USHORT MajorRevision;
    USHORT MinorRevision;
    struct {
        USHORT SmartCommands : 1;
        USHORT SecurityMode : 1;
        USHORT RemovableMediaFeature : 1;
        USHORT PowerManagement : 1;
        USHORT Reserved1 : 1;
        USHORT WriteCache : 1;
        USHORT LookAhead : 1;
        USHORT ReleaseInterrupt : 1;
        USHORT ServiceInterrupt : 1;
        USHORT DeviceReset : 1;
        USHORT HostProtectedArea : 1;
        USHORT Obsolete1 : 1;
        USHORT WriteBuffer : 1;
        USHORT ReadBuffer : 1;
        USHORT Nop : 1;
        USHORT Obsolete2 : 1;
        USHORT DownloadMicrocode : 1;
        USHORT DmaQueued : 1;
        USHORT Cfa : 1;
        USHORT AdvancedPm : 1;
        USHORT Msn : 1;
        USHORT PowerUpInStandby : 1;
        USHORT ManualPowerUp : 1;
        USHORT Reserved2 : 1;
        USHORT SetMax : 1;
        USHORT Acoustics : 1;
        USHORT BigLba : 1;
        USHORT DeviceConfigOverlay : 1;
        USHORT FlushCache : 1;
        USHORT FlushCacheExt : 1;
        USHORT WordValid83 : 2;
        USHORT SmartErrorLog : 1;
        USHORT SmartSelfTest : 1;
        USHORT MediaSerialNumber : 1;
        USHORT MediaCardPassThrough : 1;
        USHORT StreamingFeature : 1;
        USHORT GpLogging : 1;
        USHORT WriteFua : 1;
        USHORT WriteQueuedFua : 1;
        USHORT WWN64Bit : 1;
        USHORT URGReadStream : 1;
        USHORT URGWriteStream : 1;
        USHORT ReservedForTechReport : 2;
        USHORT IdleWithUnloadFeature : 1;
        USHORT WordValid : 2;
    } CommandSetSupport;
    struct {
        USHORT SmartCommands : 1;
        USHORT SecurityMode : 1;
        USHORT RemovableMediaFeature : 1;
        USHORT PowerManagement : 1;
        USHORT Reserved1 : 1;
        USHORT WriteCache : 1;
        USHORT LookAhead : 1;
        USHORT ReleaseInterrupt : 1;
        USHORT ServiceInterrupt : 1;
        USHORT DeviceReset : 1;
        USHORT HostProtectedArea : 1;
        USHORT Obsolete1 : 1;
        USHORT WriteBuffer : 1;
        USHORT ReadBuffer : 1;
        USHORT Nop : 1;
        USHORT Obsolete2 : 1;
        USHORT DownloadMicrocode : 1;
        USHORT DmaQueued : 1;
        USHORT Cfa : 1;
        USHORT AdvancedPm : 1;
        USHORT Msn : 1;
        USHORT PowerUpInStandby : 1;
        USHORT ManualPowerUp : 1;
        USHORT Reserved2 : 1;
        USHORT SetMax : 1;
        USHORT Acoustics : 1;
        USHORT BigLba : 1;
        USHORT DeviceConfigOverlay : 1;
        USHORT FlushCache : 1;
        USHORT FlushCacheExt : 1;
        USHORT Resrved3 : 1;
        USHORT Words119_120Valid : 1;
        USHORT SmartErrorLog : 1;
        USHORT SmartSelfTest : 1;
        USHORT MediaSerialNumber : 1;
        USHORT MediaCardPassThrough : 1;
        USHORT StreamingFeature : 1;
        USHORT GpLogging : 1;
        USHORT WriteFua : 1;
        USHORT WriteQueuedFua : 1;
        USHORT WWN64Bit : 1;
        USHORT URGReadStream : 1;
        USHORT URGWriteStream : 1;
        USHORT ReservedForTechReport : 2;
        USHORT IdleWithUnloadFeature : 1;
        USHORT Reserved4 : 2;
    } CommandSetActive;
    USHORT UltraDMASupport : 8;
    USHORT UltraDMAActive : 8;
    struct {
        USHORT TimeRequired : 15;
        USHORT ExtendedTimeReported : 1;
    } NormalSecurityEraseUnit;
    struct {
        USHORT TimeRequired : 15;
        USHORT ExtendedTimeReported : 1;
    } EnhancedSecurityEraseUnit;
    USHORT CurrentAPMLevel : 8;
    USHORT ReservedWord91 : 8;
    USHORT MasterPasswordID;
    USHORT HardwareResetResult;
    USHORT CurrentAcousticValue : 8;
    USHORT RecommendedAcousticValue : 8;
    USHORT StreamMinRequestSize;
    USHORT StreamingTransferTimeDMA;
    USHORT StreamingAccessLatencyDMAPIO;
    ULONG StreamingPerfGranularity;
    ULONG Max48BitLBA[2];
    USHORT StreamingTransferTime;
    USHORT DsmCap;
    struct {
        USHORT LogicalSectorsPerPhysicalSector : 4;
        USHORT Reserved0 : 8;
        USHORT LogicalSectorLongerThan256Words : 1;
        USHORT MultipleLogicalSectorsPerPhysicalSector : 1;
        USHORT Reserved1 : 2;
    } PhysicalLogicalSectorSize;
    USHORT InterSeekDelay;
    USHORT WorldWideName[4];
    USHORT ReservedForWorldWideName128[4];
    USHORT ReservedForTlcTechnicalReport;
    USHORT WordsPerLogicalSector[2];
    struct {
        USHORT ReservedForDrqTechnicalReport : 1;
        USHORT WriteReadVerify : 1;
        USHORT WriteUncorrectableExt : 1;
        USHORT ReadWriteLogDmaExt : 1;
        USHORT DownloadMicrocodeMode3 : 1;
        USHORT FreefallControl : 1;
        USHORT SenseDataReporting : 1;
        USHORT ExtendedPowerConditions : 1;
        USHORT Reserved0 : 6;
        USHORT WordValid : 2;
    } CommandSetSupportExt;
    struct {
        USHORT ReservedForDrqTechnicalReport : 1;
        USHORT WriteReadVerify : 1;
        USHORT WriteUncorrectableExt : 1;
        USHORT ReadWriteLogDmaExt : 1;
        USHORT DownloadMicrocodeMode3 : 1;
        USHORT FreefallControl : 1;
        USHORT SenseDataReporting : 1;
        USHORT ExtendedPowerConditions : 1;
        USHORT Reserved0 : 6;
        USHORT Reserved1 : 2;
    } CommandSetActiveExt;
    USHORT ReservedForExpandedSupportandActive[6];
    USHORT MsnSupport : 2;
    USHORT ReservedWord127 : 14;
    struct {
        USHORT SecuritySupported : 1;
        USHORT SecurityEnabled : 1;
        USHORT SecurityLocked : 1;
        USHORT SecurityFrozen : 1;
        USHORT SecurityCountExpired : 1;
        USHORT EnhancedSecurityEraseSupported : 1;
        USHORT Reserved0 : 2;
        USHORT SecurityLevel : 1;
        USHORT Reserved1 : 7;
    } SecurityStatus;
    USHORT ReservedWord129[31];
    struct {
        USHORT MaximumCurrentInMA : 12;
        USHORT CfaPowerMode1Disabled : 1;
        USHORT CfaPowerMode1Required : 1;
        USHORT Reserved0 : 1;
        USHORT Word160Supported : 1;
    } CfaPowerMode1;
    USHORT ReservedForCfaWord161[7];
    USHORT NominalFormFactor : 4;
    USHORT ReservedWord168 : 12;
    struct {
        USHORT SupportsTrim : 1;
        USHORT Reserved0 : 15;
    } DataSetManagementFeature;
    USHORT AdditionalProductID[4];
    USHORT ReservedForCfaWord174[2];
    USHORT CurrentMediaSerialNumber[30];
    struct {
        USHORT Supported : 1;
        USHORT Reserved0 : 1;
        USHORT WriteSameSuported : 1;
        USHORT ErrorRecoveryControlSupported : 1;
        USHORT FeatureControlSuported : 1;
        USHORT DataTablesSuported : 1;
        USHORT Reserved1 : 6;
        USHORT VendorSpecific : 4;
    } SCTCommandTransport;
    USHORT ReservedWord207[2];
    struct {
        USHORT AlignmentOfLogicalWithinPhysical : 14;
        USHORT Word209Supported : 1;
        USHORT Reserved0 : 1;
    } BlockAlignment;
    USHORT WriteReadVerifySectorCountMode3Only[2];
    USHORT WriteReadVerifySectorCountMode2Only[2];
    struct {
        USHORT NVCachePowerModeEnabled : 1;
        USHORT Reserved0 : 3;
        USHORT NVCacheFeatureSetEnabled : 1;
        USHORT Reserved1 : 3;
        USHORT NVCachePowerModeVersion : 4;
        USHORT NVCacheFeatureSetVersion : 4;
    } NVCacheCapabilities;
    USHORT NVCacheSizeLSW;
    USHORT NVCacheSizeMSW;
    USHORT NominalMediaRotationRate;
    USHORT ReservedWord218;
    struct {
        UCHAR NVCacheEstimatedTimeToSpinUpInSeconds;
        UCHAR Reserved;
    } NVCacheOptions;
    USHORT WriteReadVerifySectorCountMode : 8;
    USHORT ReservedWord220 : 8;
    USHORT ReservedWord221;
    struct {
        USHORT MajorVersion : 12;
        USHORT TransportType : 4;
    } TransportMajorVersion;
    USHORT TransportMinorVersion;
    USHORT ReservedWord224[6];
    ULONG ExtendedNumberOfUserAddressableSectors[2];
    USHORT MinBlocksPerDownloadMicrocodeMode03;
    USHORT MaxBlocksPerDownloadMicrocodeMode03;
    USHORT ReservedWord236[19];
    USHORT Signature : 8;
    USHORT CheckSum : 8;
} IDENTIFY_DEVICE_DATA, *PIDENTIFY_DEVICE_DATA;
