博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读取硬盘序列号
阅读量:4709 次
发布时间:2019-06-10

本文共 8425 字,大约阅读时间需要 28 分钟。

#pragma hdrstop#pragma argsused#include 
#include
#include
#include "hdd.h"const WORD IDE_ATAPI_IDENTIFY = 0xA1; // 读取ATAPI设备的命令const WORD IDE_ATA_IDENTIFY = 0xEC; // 读取ATA设备的命令const int DISK_PATH_LEN = 128;const int DISK_INFO_BUF_LEN = 128;void ChangeByteOrder(PCHAR szString, USHORT uscStrSize){ USHORT i; CHAR temp; for (i = 0; i < uscStrSize; i+=2) { temp = szString[i]; szString[i] = szString[i+1]; szString[i+1] = temp; }}DWORD GetDiskModelNumber(DWORD driver, CHAR *modelNumber, CHAR *sn_buf, CHAR * fw_buf){ CHAR sFilePath[DISK_PATH_LEN]; BOOL result; // results flag DWORD readed; // discard results HANDLE hDevice; WORD i; sprintf(sFilePath, "\\\\.\\PHYSICALDRIVE%d", driver); hDevice = CreateFile( sFilePath, // drive to open GENERIC_READ | GENERIC_WRITE, // access to the drive FILE_SHARE_READ | FILE_SHARE_WRITE, //share mode NULL, // default security attributes OPEN_EXISTING, // disposition 0, // file attributes NULL // do not copy file attribute ); if (hDevice == INVALID_HANDLE_VALUE) { fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError()); return (DWORD)-1; } GETVERSIONINPARAMS gvopVersionParams; result = DeviceIoControl( hDevice, SMART_GET_VERSION, NULL, 0, &gvopVersionParams, sizeof(gvopVersionParams), &readed, NULL); if (!result) //fail { fprintf(stderr, "SMART_GET_VERSION Error: %ld\n", GetLastError()); (void)CloseHandle(hDevice); return (DWORD)-1; } if(0 == gvopVersionParams.bIDEDeviceMap) { return (DWORD)-1; } // IDE or ATAPI IDENTIFY cmd BYTE btIDCmd; SENDCMDINPARAMS inParams; BYTE nDrive =0; btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY; // output structure BYTE outParams[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1]; // + 512 - 1 //fill in the input buffer inParams.cBufferSize = 0; //or IDENTIFY_BUFFER_SIZE ? inParams.irDriveRegs.bFeaturesReg = READ_ATTRIBUTES; inParams.irDriveRegs.bSectorCountReg = 1; inParams.irDriveRegs.bSectorNumberReg = 1; inParams.irDriveRegs.bCylLowReg = 0; inParams.irDriveRegs.bCylHighReg = 0; inParams.irDriveRegs.bDriveHeadReg = (nDrive & 1) ? 0xB0 : 0xA0; inParams.irDriveRegs.bCommandReg = btIDCmd; //inParams.bDriveNumber = nDrive; //get the attributes result = DeviceIoControl( hDevice, SMART_RCV_DRIVE_DATA, &inParams, sizeof(SENDCMDINPARAMS) - 1, outParams, sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1, &readed, NULL); if (!result) //fail { fprintf(stderr, "SMART_RCV_DRIVE_DATA Error: %ld\n", GetLastError()); (void)CloseHandle(hDevice); return (DWORD)-1; } (void)CloseHandle(hDevice); IDINFO *ip = (IDINFO *)((SENDCMDOUTPARAMS*)outParams)->bBuffer ; // get firmware number memset(fw_buf, 0, 8); memcpy(fw_buf, ip->sFirmwareRev, 8); fw_buf[8] = '\0'; ChangeByteOrder(fw_buf, 8); printf("\n->Firmware: %s", fw_buf); // get Serial number memset(sn_buf, 0, 20); memcpy(sn_buf, ip->sSerialNumber, 20); sn_buf[20] = '\0'; ChangeByteOrder(sn_buf, 20); printf("\n->Serial: %s", sn_buf); // get model number memset(modelNumber, 0, 40); memcpy(modelNumber, ip->sModelNumber, 40); modelNumber[40] = '\0'; ChangeByteOrder(modelNumber, 40); printf("\n->Model: %s", modelNumber); return 0;}int _tmain(int argc, _TCHAR* argv[]){ char model_buf[40+1], sn_buf[20+1], fw_buf[8+1]; GetDiskModelNumber(0, model_buf, sn_buf, fw_buf);// printf("Model: %s\nFirmware: %s\nSN: %s", model_buf, fw_buf, sn_buf); getchar(); return 0;}

hdd.h

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;



转载于:https://www.cnblogs.com/mengfanrong/p/4047803.html

你可能感兴趣的文章
(转)log4j(二)——如何控制日志信息的输出?
查看>>
JavaScript简介
查看>>
php.ini中safe_mode开启对PHP系统函数的影响
查看>>
gdb
查看>>
字符串与整数、浮点数、无符号整数之间的转换常用函数
查看>>
ubuntu清理旧内核
查看>>
有关UIImageView+AFNetworking 下载图片的线程问题
查看>>
Node之安装篇
查看>>
Android的Animation之LayoutAnimation使用方法
查看>>
二分图最大匹配算法-Hopcroft-Karp模板
查看>>
发布和订阅的删除
查看>>
如何使用qtp12 utf进行功能测试
查看>>
使用LinQ进行增删改查
查看>>
关于iOS适配问题
查看>>
C语言博客作业--嵌套循环
查看>>
内部类 ( Inner Class )
查看>>
Linux 使用者 群组 权限
查看>>
【PAT】B1047 编程团体赛(20 分)
查看>>
iPad软件提交注意事项
查看>>
约束和异常处理
查看>>