硬盘序列号的获取
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);// // }