读取硬盘序列号

news/2025/1/12 3:58:07/
#pragma hdrstop
#pragma argsused#include <tchar.h>
#include <stdio.h>
#include <windows.h>
#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 flagDWORD readed;                   // discard resultsHANDLE hDevice;WORD i;sprintf(sFilePath, "\\\\.\\PHYSICALDRIVE%d", driver);hDevice = CreateFile(sFilePath, // drive to openGENERIC_READ | GENERIC_WRITE,     // access to the driveFILE_SHARE_READ | FILE_SHARE_WRITE, //share modeNULL,             // default security attributesOPEN_EXISTING,    // disposition0,                // file attributesNULL            // 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 cmdBYTE btIDCmd;SENDCMDINPARAMS inParams;BYTE nDrive =0;btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;// output structureBYTE outParams[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];   // + 512 - 1//fill in the input bufferinParams.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 attributesresult = 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 numbermemset(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 numbermemset(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 numbermemset(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=支持DMAUSHORT  LBA:1;     // 1=支持LBAUSHORT  DisIORDY:1;    // 1=可不使用IORDYUSHORT  IORDY:1;    // 1=支持IORDYUSHORT  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=已选择模式0USHORT  Mode1Sel:1;    // 1=已选择模式1USHORT  Mode2Sel:1;    // 1=已选择模式2USHORT  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-1USHORT  ATA2:1;     // 1=支持ATA-2USHORT  ATA3:1;     // 1=支持ATA-3USHORT  ATA4:1;     // 1=支持ATA/ATAPI-4USHORT  ATA5:1;     // 1=支持ATA/ATAPI-5USHORT  ATA6:1;     // 1=支持ATA/ATAPI-6USHORT  ATA7:1;     // 1=支持ATA/ATAPI-7USHORT  ATA8:1;     // 1=支持ATA/ATAPI-8USHORT  ATA9:1;     // 1=支持ATA/ATAPI-9USHORT  ATA10:1;    // 1=支持ATA/ATAPI-10USHORT  ATA11:1;    // 1=支持ATA/ATAPI-11USHORT  ATA12:1;    // 1=支持ATA/ATAPI-12USHORT  ATA13:1;    // 1=支持ATA/ATAPI-13USHORT  ATA14:1;    // 1=支持ATA/ATAPI-14USHORT  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=已选择模式0USHORT  Mode1Sel:1;    // 1=已选择模式1USHORT  Mode2Sel:1;    // 1=已选择模式2USHORT  Mode3Sel:1;    // 1=已选择模式3USHORT  Mode4Sel:1;    // 1=已选择模式4USHORT  Mode5Sel:1;    // 1=已选择模式5USHORT  Mode6Sel:1;    // 1=已选择模式6USHORT  Mode7Sel:1;    // 1=已选择模式7} wUltraDMA;      // WORD 88:  Ultra DMA支持能力USHORT    wReserved89[167];   // WORD 89-255
} IDINFO, *PIDINFO;




http://www.ppmy.cn/news/204538.html

相关文章

获取硬盘物理序列号

获取硬盘物理序列号 最近才做完了这个获取 IDE 硬盘物理序列号的程序。声明一下&#xff0c;这个程序是我根据 Lynn McGuire 的那个 DiskID32 的源代码做了些自以为是的改动得到的&#xff0c;只能在 NT 平台下获得第一块 IDE 硬盘的物理序列号。同时&#xff0c;这个程序用到了…

Windows系统查看硬盘序列号

CMD命令输入 diskpart list disk DISKPART> select disk 0 磁盘 0 现在是所选磁盘。 DISKPART> detail disk GLOWAY STK2TS3-S7 磁盘 ID: {4ACFE89E-ED51-45EE-9FCB-11C9B0EE9F52} 类型 : RAID 状态 : 联机 路径 : 0 目标 : 1 LUN ID : 0 位置路径 : PCIROOT(0)…

如何查看计算机的硬盘序列号,电脑上的硬盘序列号如何查

相信大家都被电脑上的硬盘序列号如何查困扰着吧&#xff0c;想要解决这个问题的话&#xff0c;不妨就来IE浏览器中文网看小编带来的查询电脑硬盘序列号方法&#xff0c;说不定可以帮助到大家解决呦。 方法/步骤分享&#xff1a; 一、首先我们先演示第一种方法&#xff0c;用AID…

怎么查询电脑的磁盘序列号和各种硬件信息(Windows系统)

之前实习时遇到过这种情况&#xff0c;听说国家保密局要统计高校领导办公电脑的磁盘信息&#xff0c;防止信息泄露&#xff0c;就让我和同事就统计磁盘的序列号&#xff0c;很简单&#xff0c;就是电脑太多&#xff0c;统计速度太慢啦&#xff0c;都是Windows系统&#xff0c;没…

查询电脑硬盘序列号

cmd wmic diskdrive get serialnumber

命令行查看硬盘序列号

1.按WinR打开运行&#xff0c;输入cmd,回车&#xff1a; 2.在命令提示符中输入diskpart,点击回车来启动diskpart程序&#xff0c;通过这个程序来查看硬盘序列号&#xff1a; 3.接着输入并执行list disk, 也就是把电脑上的所有硬盘都罗列出来&#xff0c;图中只有一个硬盘&#…

怎么看计算机的硬盘牌子,硬盘序列号,详细教您怎么查看硬盘序列号

有的时候在一些非常时期&#xff0c;我们会需要知道硬盘的序列号&#xff0c;那么这个时候我们要怎么查看电脑的硬盘序列号呢&#xff1f;不慌&#xff0c;稳住。小编现在就带你们打破地方水晶&#xff01;&#xff01;接下来我就来告诉你们怎么查看电脑硬盘序列号。 小伙伴们&…

查看硬盘序列号

使用diskpart命令 WinR键运行cmd&#xff0c;进入命令行界面&#xff1a; 1.diskpart 2.list disk 查看有几块硬盘 3.select disk 0 选择第一块硬盘 4.detail disk 显示选择的硬盘详细信息 显示的第一行是硬盘型号&#xff0c;第二行ID是序列号。 5.若有多块硬盘&#xff0c;返…