看流星社区

 找回密码
 注册账号
查看: 2450|回复: 3

[易语言源码] DeviceIoControl取硬盘序列号 支持win8.1 X64位源码

[复制链接]

该用户从未签到

发表于 2015-7-1 11:31:25 | 显示全部楼层 |阅读模式
DeviceIoControl取硬盘序列号 支持win8.1 X64位源码

// IOCTL控制码
// #define  DFP_SEND_DRIVE_COMMAND   0x0007c084
#define  DFP_SEND_DRIVE_COMMAND   CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
// #define  DFP_RECEIVE_DRIVE_DATA   0x0007c088
#define  DFP_RECEIVE_DRIVE_DATA   CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#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
  
// ATA/ATAPI指令
#define  IDE_ATA_IDENTIFY           0xEC     // ATA的ID指令(IDENTIFY DEVICE)
  
// IDE命令寄存器
typedef struct _IDEREGS
{
    BYTE bFeaturesReg;       // 特征寄存器(用于SMART命令)
    BYTE bSectorCountReg;    // 扇区数目寄存器
    BYTE bSectorNumberReg;   // 开始扇区寄存器
    BYTE bCylLowReg;         // 开始柱面低字节寄存器
    BYTE bCylHighReg;        // 开始柱面高字节寄存器
    BYTE bDriveHeadReg;      // 驱动器/磁头寄存器
    BYTE bCommandReg;        // 指令寄存器
    BYTE bReserved;          // 保留
} IDEREGS, *PIDEREGS, *LPIDEREGS;
  
// 从驱动程序返回的状态
typedef struct _DRIVERSTATUS
{
    BYTE bDriverError;      // 错误码
    BYTE bIDEStatus;        // IDE状态寄存器
    BYTE bReserved[2];      // 保留
    DWORD dwReserved[2];    // 保留
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
  
// IDE设备IOCTL输入数据结构
typedef struct _SENDCMDINPARAMS
{
    DWORD cBufferSize;      // 缓冲区字节数
    IDEREGS irDriveRegs;    // IDE寄存器组
    BYTE bDriveNumber;      // 驱动器号
    BYTE bReserved[3];      // 保留
    DWORD dwReserved[4];    // 保留
    BYTE bBuffer[1];        // 输入缓冲区(此处象征性地包含1字节)
} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
  
// IDE设备IOCTL输出数据结构
typedef struct _SENDCMDOUTPARAMS
{
    DWORD cBufferSize;          // 缓冲区字节数
    DRIVERSTATUS DriverStatus;  // 驱动程序返回状态
    BYTE bBuffer[1];            // 输入缓冲区(此处象征性地包含1字节)
} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
  
// IDE的ID命令返回的数据
// 共512字节(256个WORD),这里仅定义了一些感兴趣的项(基本上依据ATA/ATAPI-4)
typedef struct _IDINFO
{
    USHORT  wGenConfig;                 // WORD 0: 基本信息字
    USHORT  wNumCyls;                   // WORD 1: 柱面数
    USHORT  wReserved2;                 // WORD 2: 保留
    USHORT  wNumHeads;                  // WORD 3: 磁头数
    USHORT  wReserved4;                 // WORD 4: 保留
    USHORT  wReserved5;                 // WORD 5: 保留
    USHORT  wNumSectorsPerTrack;        // WORD 6: 每磁道扇区数
    USHORT  wVendorUnique[3];           // WORD 7-9: 厂家设定值
    CHAR    sSerialNumber[20];          // WORD 10-19:序列号
    USHORT  wBufferType;                // WORD 20: 缓冲类型
    USHORT  wBufferSize;                // WORD 21: 缓冲大小
    USHORT  wECCSize;                   // WORD 22: ECC校验大小
    CHAR    sFirmwareRev[8];            // WORD 23-26: 固件版本
    CHAR    sModelNumber[40];           // WORD 27-46: 内部型号
    USHORT  wMoreVendorUnique;          // WORD 47: 厂家设定值
    USHORT  wReserved48;                // WORD 48: 保留
    struct {
        USHORT  reserved1:8;
        USHORT  DMA:1;                  // 1=支持DMA
        USHORT  LBA:1;                  // 1=支持LBA
        USHORT  DisIORDY:1;             // 1=可不使用IORDY
        USHORT  IORDY:1;                // 1=支持IORDY
        USHORT  SoftReset:1;            // 1=需要ATA软启动
        USHORT  Overlap:1;              // 1=支持重叠操作
        USHORT  Queue:1;                // 1=支持命令队列
        USHORT  InlDMA:1;               // 1=支持交叉存取DMA
    } wCapabilities;                    // WORD 49: 一般能力
    USHORT  wReserved1;                 // WORD 50: 保留
    USHORT  wPIOTiming;                 // WORD 51: PIO时序
    USHORT  wDMATiming;                 // WORD 52: DMA时序
    struct {
        USHORT  CHSNumber:1;            // 1=WORD 54-58有效
        USHORT  CycleNumber:1;          // 1=WORD 64-70有效
        USHORT  UnltraDMA:1;            // 1=WORD 88有效
        USHORT  reserved:13;
    } wFieldValidity;                   // WORD 53: 后续字段有效性标志
    USHORT  wNumCurCyls;                // WORD 54: CHS可寻址的柱面数
    USHORT  wNumCurHeads;               // WORD 55: CHS可寻址的磁头数
    USHORT  wNumCurSectorsPerTrack;     // WORD 56: CHS可寻址每磁道扇区数
    USHORT  wCurSectorsLow;             // WORD 57: CHS可寻址的扇区数低位字
    USHORT  wCurSectorsHigh;            // WORD 58: CHS可寻址的扇区数高位字
    struct {
        USHORT  CurNumber:8;            // 当前一次性可读写扇区数
        USHORT  Multi:1;                // 1=已选择多扇区读写
        USHORT  reserved1:7;
    } wMultSectorStuff;                 // WORD 59: 多扇区读写设定
    ULONG  dwTotalSectors;              // WORD 60-61: LBA可寻址的扇区数
    USHORT  wSingleWordDMA;             // WORD 62: 单字节DMA支持能力
    struct {
        USHORT  Mode0:1;                // 1=支持模式0 (4.17Mb/s)
        USHORT  Mode1:1;                // 1=支持模式1 (13.3Mb/s)
        USHORT  Mode2:1;                // 1=支持模式2 (16.7Mb/s)
        USHORT  Reserved1:5;
        USHORT  Mode0Sel:1;             // 1=已选择模式0
        USHORT  Mode1Sel:1;             // 1=已选择模式1
        USHORT  Mode2Sel:1;             // 1=已选择模式2
        USHORT  Reserved2:5;
    } wMultiWordDMA;                    // WORD 63: 多字节DMA支持能力
    struct {
        USHORT  AdvPOIModes:8;          // 支持高级POI模式数
        USHORT  reserved:8;
    } wPIOCapacity;                     // WORD 64: 高级PIO支持能力
    USHORT  wMinMultiWordDMACycle;      // WORD 65: 多字节DMA传输周期的最小值
    USHORT  wRecMultiWordDMACycle;      // WORD 66: 多字节DMA传输周期的建议值
    USHORT  wMinPIONoFlowCycle;         // WORD 67: 无流控制时PIO传输周期的最小值
    USHORT  wMinPOIFlowCycle;           // WORD 68: 有流控制时PIO传输周期的最小值
    USHORT  wReserved69[11];            // WORD 69-79: 保留
    struct {
        USHORT  Reserved1:1;
        USHORT  ATA1:1;                 // 1=支持ATA-1
        USHORT  ATA2:1;                 // 1=支持ATA-2
        USHORT  ATA3:1;                 // 1=支持ATA-3
        USHORT  ATA4:1;                 // 1=支持ATA/ATAPI-4
        USHORT  ATA5:1;                 // 1=支持ATA/ATAPI-5
        USHORT  ATA6:1;                 // 1=支持ATA/ATAPI-6
        USHORT  ATA7:1;                 // 1=支持ATA/ATAPI-7
        USHORT  ATA8:1;                 // 1=支持ATA/ATAPI-8
        USHORT  ATA9:1;                 // 1=支持ATA/ATAPI-9
        USHORT  ATA10:1;                // 1=支持ATA/ATAPI-10
        USHORT  ATA11:1;                // 1=支持ATA/ATAPI-11
        USHORT  ATA12:1;                // 1=支持ATA/ATAPI-12
        USHORT  ATA13:1;                // 1=支持ATA/ATAPI-13
        USHORT  ATA14:1;                // 1=支持ATA/ATAPI-14
        USHORT  Reserved2:1;
    } wMajorVersion;                    // WORD 80: 主版本
    USHORT  wMinorVersion;              // WORD 81: 副版本
    USHORT  wReserved82[6];             // WORD 82-87: 保留
    struct {
        USHORT  Mode0:1;                // 1=支持模式0 (16.7Mb/s)
        USHORT  Mode1:1;                // 1=支持模式1 (25Mb/s)
        USHORT  Mode2:1;                // 1=支持模式2 (33Mb/s)
        USHORT  Mode3:1;                // 1=支持模式3 (44Mb/s)
        USHORT  Mode4:1;                // 1=支持模式4 (66Mb/s)
        USHORT  Mode5:1;                // 1=支持模式5 (100Mb/s)
        USHORT  Mode6:1;                // 1=支持模式6 (133Mb/s)
        USHORT  Mode7:1;                // 1=支持模式7 (166Mb/s) ???
        USHORT  Mode0Sel:1;             // 1=已选择模式0
        USHORT  Mode1Sel:1;             // 1=已选择模式1
        USHORT  Mode2Sel:1;             // 1=已选择模式2
        USHORT  Mode3Sel:1;             // 1=已选择模式3
        USHORT  Mode4Sel:1;             // 1=已选择模式4
        USHORT  Mode5Sel:1;             // 1=已选择模式5
        USHORT  Mode6Sel:1;             // 1=已选择模式6
        USHORT  Mode7Sel:1;             // 1=已选择模式7
    } wUltraDMA;                        // WORD 88:  Ultra DMA支持能力
    USHORT    wReserved89[167];         // WORD 89-255
} IDINFO, *PIDINFO;
  
// SCSI驱动所需的输入输出共用的结构
typedef struct _SRB_IO_CONTROL
{
   ULONG HeaderLength;        // 头长度
   UCHAR Signature[8];        // 特征名称
   ULONG Timeout;             // 超时时间
   ULONG ControlCode;         // 控制码
   ULONG ReturnCode;          // 返回码
   ULONG Length;              // 缓冲区长度
} SRB_IO_CONTROL, *PSRB_IO_CONTROL;

本例中,我们要用到ATA/APAPI的IDENTIFY DEVICE指令。ATA/APAPI是国际组织T13起草和发布的IDE/EIDE/UDMA硬盘及其它可移动存储设备与主机接口的标准,至今已经到了ATA/APAPI-7版本。该接口标准规定了ATA/ATAPI设备的输入输出寄存器和指令集。欲了解更详细的ATA/ATAPI技术资料,可访问T13的站点。

游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

发表于 2015-9-18 20:42:24 | 显示全部楼层
qwewqeqe1awd

该用户从未签到

发表于 2016-4-10 19:59:35 | 显示全部楼层
来看看 收藏一下 谢谢分享

该用户从未签到

发表于 2016-8-11 22:08:24 | 显示全部楼层
多谢分享,看下。。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-20 17:25

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表