• 读取光驱序列号、型号、分位


    本代码仅仅是通过DeviceIoControl 发送指令能获得Identity Data。
    当中,获取型号等部分内容没有根据。仅仅是根据dump 的内容来确定大概位置。

    若有人有根据的还请帮忙留言。

    谢啦。

    获取光驱序列号、分位、型号代码

    头文件例如以下(有些部分没实用到):

    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h>
    #include <winioctl.h>
    #include <ntddscsi.h>
    
    
    // TODO: reference additional headers your program requires here
    
    //static void dump_buffer(const char* title, const unsigned char* buffer, int len);
    //void ChangeByteOrder(char *szString, USHORT uscStrSize);
    
    #define  IDENTIFY_BUFFER_SIZE  512
    
    
    //  IOCTL commands
    #define  DFP_GET_VERSION          0x00074080
    #define  DFP_SEND_DRIVE_COMMAND   0x0007c084
    #define  DFP_RECEIVE_DRIVE_DATA   0x0007c088
    
    #define  FILE_DEVICE_SCSI              0x0000001b
    #define  IOCTL_SCSI_MINIPORT_IDENTIFY  ((FILE_DEVICE_SCSI << 16) + 0x0501)
    #define  IOCTL_SCSI_MINIPORT 0x0004D008  //  see NTDDSCSI.H for definition
    
    #define  IDE_ATAPI_IDENTIFY  0xA1  //Returns ID sector for ATAPI.
    #define  IDE_ATA_IDENTIFY    0xEC  //Returns ID sector for ATA.
    
    typedef struct _IDENTIFY_DEVICE_OUTDATA {
    	SENDCMDOUTPARAMS    sSendCmdOutParam;
        BYTE				pData[IDENTIFY_BUFFER_SIZE-1];
    } IDENTIFY_DEVICE_OUTDATA, *PIDENTIFY_DEVICE_OUTDATA;
    
    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 ReservedWord2;
      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;
      USHORT ReservedWord48;
      struct {
        UCHAR  ReservedByte49;
        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  :13;
      USHORT NumberOfCurrentCylinders;
      USHORT NumberOfCurrentHeads;
      USHORT CurrentSectorsPerTrack;
      ULONG  CurrentSectorCapacity;
      UCHAR  CurrentMultiSectorSetting;
      UCHAR  MultiSectorSettingValid  :1;
      UCHAR  ReservedByte59  :7;
      ULONG  UserAddressableSectors;
      USHORT ObsoleteWord62;
      USHORT MultiWordDMASupport  :8;
      USHORT MultiWordDMAActive  :8;
      USHORT AdvancedPIOModes  :8;
      USHORT ReservedByte64  :8;
      USHORT MinimumMWXferCycleTime;
      USHORT RecommendedMWXferCycleTime;
      USHORT MinimumPIOCycleTime;
      USHORT MinimumPIOCycleTimeIORDY;
      USHORT ReservedWords69[6];
      USHORT QueueDepth  :5;
      USHORT ReservedWord75  :11;
      USHORT ReservedWords76[4];
      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 Resrved3  :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 Reserved4  :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  :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 Reserved4  :2;
      } CommandSetActive;
      USHORT UltraDMASupport  :8;
      USHORT UltraDMAActive  :8;
      USHORT ReservedWord89[4];
      USHORT HardwareResetResult;
      USHORT CurrentAcousticValue  :8;
      USHORT RecommendedAcousticValue  :8;
      USHORT ReservedWord95[5];
      ULONG  Max48BitLBA[2];
      USHORT StreamingTransferTime;
      USHORT ReservedWord105;
      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 WriteReadVerifySupported  :1;
        USHORT Reserved01  :11;
        USHORT Reserved1  :2;
      } CommandSetSupportExt;
      struct {
        USHORT ReservedForDrqTechnicalReport  :1;
        USHORT WriteReadVerifyEnabled  :1;
        USHORT Reserved01  :11;
        USHORT Reserved1  :2;
      } CommandSetActiveExt;
      USHORT ReservedForExpandedSupportandActive[6];
      USHORT MsnSupport  :2;
      USHORT ReservedWord1274  :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 MaximumCurrentInMA2  :12;
        USHORT CfaPowerMode1Disabled  :1;
        USHORT CfaPowerMode1Required  :1;
        USHORT Reserved0  :1;
        USHORT Word160Supported  :1;
      } CfaPowerModel;
      USHORT ReservedForCfaWord161[8];
      struct {
        USHORT SupportsTrim  :1;
        USHORT Reserved0  :15;
      } DataSetManagementFeature;
      USHORT ReservedForCfaWord170[6];
      USHORT CurrentMediaSerialNumber[30];
      USHORT ReservedWord206;
      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 ReservedWord220[35];
      USHORT Signature  :8;
      USHORT CheckSum  :8;
    } IDENTIFY_DEVICE_DATA, *PIDENTIFY_DEVICE_DATA;
    
    static void dump_buffer(const char* title, const unsigned char* buffer, int len)
    {
       int i = 0;
       int j;
    
       printf ("
    -- %s --
    ", title);
       if (len > 0)
       {
          printf ("%8.8s ", " ");
          for (j = 0; j < 16; ++j)
          {
    	    printf (" %2X", j);
          }
          printf ("  ");
          for (j = 0; j < 16; ++j)
          {
    	    printf ("%1X", j);
          }
          printf ("
    ");
       }
       while (i < len)
       {
          printf("%08x ", i);
          for (j = 0; j < 16; ++j)
          {
    	 if ((i + j) < len)
    	    printf (" %02x", (int) buffer[i +j]);
    	 else
    	    printf ("   ");
          }
          printf ("  ");
          for (j = 0; j < 16; ++j)
          {
    	 if ((i + j) < len)
    	    printf ("%c", isprint (buffer[i + j]) ?

    buffer [i + j] : '.'); else printf (" "); } printf (" "); i += 16; } printf ("-- DONE -- "); }



  • 相关阅读:
    《社会动物》笔记
    对长城汽车品牌多样化的一点思考
    LightGBM简单例子
    mysql拆分字符串为多行(逗号等分割)
    vue中$refs、$emit、$on的使用场景
    js中的call()和apply()和bind()方法
    Vue.js中this.$nextTick()的使用
    Vue中ref和$refs的介绍及使用
    ES6(异步操作和Async函数&await)
    vue项目在git commit时,使用eslint检测
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7026944.html
Copyright © 2020-2023  润新知