首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

硬盘序列号的获取,该怎么解决

2012-09-22 
硬盘序列号的获取MSDN中利用WMI方法获取到的硬盘序列号,可不可以作为电脑的唯一标识符?[解决办法]http://b

硬盘序列号的获取
MSDN中利用WMI方法获取到的硬盘序列号,可不可以作为电脑的唯一标识符?

[解决办法]
http://blog.sina.com.cn/s/blog_612b382d0100efdt.html
[解决办法]
用汇编获取cpu id号吧,似乎奔腾4后每个cpu id号都是唯一的,这可以用来做序列号。以下是别人写的代码:
#include<iostream>
#include <string>
using namespace std;

string GetCPUID()
{
char str[256];
string CPUID;
unsigned long s1,s2;
unsigned char vendor_id[]="------------";
char sel;
sel='1';
string VernderID;
string MyCpuID,CPUID1,CPUID2;
switch(sel)
{
case '1':
__asm{
xor eax,eax //eax=0:取Vendor信息
cpuid //取cpu id指令,可在Ring3级使用
mov dword ptr vendor_id,ebx
mov dword ptr vendor_id[+4],edx
mov dword ptr vendor_id[+8],ecx
}
sprintf(str,"%s",vendor_id);
VernderID = str;
printf("%s:productor\n",str);
//VernderID.Format("%s-",vendor_id);
__asm{
mov eax,01h //eax=1:取CPU序列号
xor edx,edx
cpuid
mov s1,edx
mov s2,eax
}
sprintf(str,"%08X%08X",s1,s2);
CPUID1 = str;
printf("%s:cpu2\n",str);
//CPUID1.Format("%08X%08X",s1,s2);
__asm{
mov eax,03h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
sprintf(str,"%08X%08X",s1,s2);
CPUID2 = str;
printf("%s:cpu2\n",str);
//CPUID2.Format("%08X%08X",s1,s2);
break;
case '2':
{
__asm{
mov ecx,119h
rdmsr
or eax,00200000h
wrmsr
}
}
printf("CPU id is disabled");
//AfxMessageBox("CPU id is disabled.");
break;
}
MyCpuID = CPUID1+CPUID2;
CPUID = MyCpuID;
return CPUID;
}

int main()
{
cout << GetCPUID() << endl;
return 0;
}

[解决办法]

C/C++ code
#ifndef ___GETHDSN_H_____#define ___GETHDSN_H_____#include   <windows.h>#include   <iostream>#include   <stdio.h>//#pragma argsused#define DFP_GET_VERSION 0x00074080#define DFP_SEND_DRIVE_COMMAND 0x0007c084#define DFP_RECEIVE_DRIVE_DATA 0x0007c088#pragma pack(1)typedef struct _GETVERSIONOUTPARAMS {    BYTE bVersion; // Binary driver version.    BYTE bRevision; // Binary driver revision.    BYTE bReserved; // Not used.    BYTE bIDEDeviceMap; // Bit map of IDE devices.    DWORD fCapabilities; // Bit mask of driver capabilities.    DWORD dwReserved[4]; // For future use.} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;typedef struct _IDEREGS {    BYTE bFeaturesReg; // Used for specifying SMART "commands".    BYTE bSectorCountReg; // IDE sector count register    BYTE bSectorNumberReg; // IDE sector number register    BYTE bCylLowReg; // IDE low order cylinder value    BYTE bCylHighReg; // IDE high order cylinder value    BYTE bDriveHeadReg; // IDE drive/head register    BYTE bCommandReg; // Actual IDE command.    BYTE bReserved; // reserved for future use. Must be zero.} IDEREGS, *PIDEREGS, *LPIDEREGS;typedef struct _SENDCMDINPARAMS {    DWORD cBufferSize; // Buffer size in bytes    IDEREGS irDriveRegs; // Structure with drive register values.    BYTE bDriveNumber; // Physical drive number to send    // command to (0,1,2,3).    BYTE bReserved[3]; // Reserved for future expansion.    DWORD dwReserved[4]; // For future use.    //BYTE bBuffer[1]; // Input buffer.} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;typedef struct _DRIVERSTATUS {    BYTE bDriverError; // Error code from driver,    // or 0 if no error.    BYTE bIDEStatus; // Contents of IDE Error register.    // Only valid when bDriverError    // is SMART_IDE_ERROR.    BYTE bReserved[2]; // Reserved for future expansion.    DWORD dwReserved[2]; // Reserved for future expansion.} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;typedef struct _SENDCMDOUTPARAMS {    DWORD cBufferSize; // Size of bBuffer in bytes    DRIVERSTATUS DriverStatus; // Driver status structure.    BYTE bBuffer[512]; // Buffer of arbitrary length    // in which to store the data read from the drive.} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;typedef struct _IDSECTOR {    USHORT wGenConfig;    USHORT wNumCyls;    USHORT wReserved;    USHORT wNumHeads;    USHORT wBytesPerTrack;    USHORT wBytesPerSector;    USHORT wSectorsPerTrack;    USHORT wVendorUnique[3];    CHAR sSerialNumber[20];    USHORT wBufferType;    USHORT wBufferSize;    USHORT wECCSize;    CHAR sFirmwareRev[8];    CHAR sModelNumber[40];    USHORT wMoreVendorUnique;    USHORT wDoubleWordIO;    USHORT wCapabilities;    USHORT wReserved1;    USHORT wPIOTiming;    USHORT wDMATiming;    USHORT wBS;    USHORT wNumCurrentCyls;    USHORT wNumCurrentHeads;    USHORT wNumCurrentSectorsPerTrack;    ULONG ulCurrentSectorCapacity;    USHORT wMultSectorStuff;    ULONG ulTotalAddressableSectors;    USHORT wSingleWordDMA;    USHORT wMultiWordDMA;    BYTE bReserved[128];} IDSECTOR, *PIDSECTOR;/*+++Global vars---*/GETVERSIONOUTPARAMS vers;SENDCMDINPARAMS in;SENDCMDOUTPARAMS out;HANDLE h;DWORD i;BYTE j;#define IS_SPACE(c)  (c == ' ' || c == '\t')void swab(char * str){    int len = strlen(str);    for (;*str!='\0';str+=2)    {        str[len] = *str;         memset(str, *(str+1), 1);        memset(str+1, str[len], 1);        str[len] = '\0';    }}void hdid9x(char * outstr){    if (!outstr)    {        return;    }    memset(outstr, 0, strlen(outstr));    ZeroMemory(&vers,sizeof(vers));    //We   start   in   95/98/Me    h=CreateFile("\\\\.\\Smartvsd",0,0,0,CREATE_NEW,0,0);    if   (!h){        //cout<<"open   smartvsd.vxd   failed"<<endl;        exit(0);    }        if   (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0)){        //cout<<"DeviceIoControl   failed:DFP_GET_VERSION"<<endl;        CloseHandle(h);        return;    }    //If   IDE   identify   command   not   supported,   fails         if   (!(vers.fCapabilities&1)){             //cout<<"Error:   IDE   identify   command   not   supported.";        CloseHandle(h);             return;    }        //Identify   the   IDE   drives    for   (j=0;j<4;j++){        PIDSECTOR   phdinfo;        ZeroMemory(&in,sizeof(in));             ZeroMemory(&out,sizeof(out));             if   (j&1){                 in.irDriveRegs.bDriveHeadReg=0xb0;             }else{            in.irDriveRegs.bDriveHeadReg=0xa0;             }             if   (vers.fCapabilities&(16>>j)){                 //We   don't   detect   a   ATAPI   device.                 //cout<<"Drive   "<<(int)(j+1)<<"   is   a   ATAPI   device,   we   don't   detect   it"<<endl;            continue;        }else{                 in.irDriveRegs.bCommandReg=0xec;             }             in.bDriveNumber=j;             in.irDriveRegs.bSectorCountReg=1;             in.irDriveRegs.bSectorNumberReg=1;        in.cBufferSize=512;             if   (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0)){                 //cout<<"DeviceIoControl   failed:DFP_RECEIVE_DRIVE_DATA"<<endl;            CloseHandle(h);                 return;             }        phdinfo=(PIDSECTOR)out.bBuffer;        strcpy_s(outstr, strlen(phdinfo->sSerialNumber)+1, phdinfo->sSerialNumber);        while (IS_SPACE(*outstr)) outstr++;        swab(outstr);        CloseHandle(h);    }     }void hdidnt(char * outstr){    if (!outstr)    {        return;    }    memset(outstr, 0, strlen(outstr));    char hd[80];    PIDSECTOR   phdinfo;    //char s[41];        ZeroMemory(&vers,sizeof(vers));    //We   start   in   NT/Win2000    for (j = 0; j < 4; j++){        sprintf_s(hd, 19, "\\\\.\\PhysicalDrive%d",j);        h = CreateFile(hd,GENERIC_READ|GENERIC_WRITE,            FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);        if (!h) continue;        if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0))        {            CloseHandle(h);            continue;        }        //If   IDE   identify   command   not   supported,   fails        if (!(vers.fCapabilities&1)){            CloseHandle(h);            return;        }                //Identify   the   IDE   drives        ZeroMemory(&in,sizeof(in));        ZeroMemory(&out,sizeof(out));        if (j&1){            in.irDriveRegs.bDriveHeadReg=0xb0;        }        else        {            in.irDriveRegs.bDriveHeadReg=0xa0;        }        if (vers.fCapabilities&(16>>j)) {            //We   don't   detect   a   ATAPI   device.            //cout<<"Drive "<<(int)(j+1)<<" is a ATAPI device, we don't detect it"<<endl;            continue;        }        else        {            in.irDriveRegs.bCommandReg=0xec;        }        in.bDriveNumber=j;        in.irDriveRegs.bSectorCountReg=1;        in.irDriveRegs.bSectorNumberReg=1;        in.cBufferSize=512;        if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0)){            //cout<<"DeviceIoControl   failed:DFP_RECEIVE_DRIVE_DATA"<<endl;            CloseHandle(h);            return;        }        phdinfo=(PIDSECTOR)out.bBuffer;        //     memcpy(s,phdinfo->sModelNumber,40);             //     s[40]=0;        //     ChangeByteOrder(s,40);        //     //cout<<endl<<"Module   Number:"<<s<<endl;        //     memcpy(s,phdinfo->sFirmwareRev,8);             //     s[8]=0;        //     ChangeByteOrder(s,8);        //         //     //cout<<"\tFirmware   rev:"<<s<<endl;        //     memcpy(&s[21],phdinfo->sSerialNumber,20);        //     s[40]=0;        //     ChangeByteOrder(&s[21],20);        //     //cout<<"\tSerial   Number:"<<s<<endl;        //     sprintf(s, "%s",&s[21]);        //     strcpy(&HardDiskNO[j * 20], s);        //     //cout<<"\tCapacity:"<<phdinfo->ulTotalAddressableSectors/2/1024<<"M"<<endl<<endl;        //         char * sn = phdinfo->sSerialNumber;//         while (IS_SPACE(*sn)) sn++;//         strcpy(outstr, sn);//         swab(outstr);        strcpy_s(outstr, strlen(phdinfo->sSerialNumber)+1, phdinfo->sSerialNumber);        while (IS_SPACE(*outstr)) outstr++;        swab(outstr);        CloseHandle(h);    }}#endifvoid GetHDSN(char * out){    if (!out)        return;    OSVERSIONINFO   VersionInfo;    ZeroMemory(&VersionInfo,sizeof(VersionInfo));    VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo);    GetVersionEx(&VersionInfo);        switch (VersionInfo.dwPlatformId){        case VER_PLATFORM_WIN32s:            break;        case VER_PLATFORM_WIN32_WINDOWS:            hdid9x(out);            break;        case VER_PLATFORM_WIN32_NT:            hdidnt(out);            break;    }}//---------------------------------------//char * _stdcall GetHardDiskNO()//{// int main()// {//     //     OSVERSIONINFO   VersionInfo;// //     ZeroMemory(&VersionInfo,sizeof(VersionInfo));//     VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo);//     GetVersionEx(&VersionInfo);// //     memset(HardDiskNO, 0, 200);// //     switch (VersionInfo.dwPlatformId)//     {//         case VER_PLATFORM_WIN32s://           break;//         case VER_PLATFORM_WIN32_WINDOWS://           hdid9x();//           break;//         case VER_PLATFORM_WIN32_NT://           hdidnt();//           break;//     }// //    printf(HardDiskNO);// // } 

热点排行