首页
社区
课程
招聘
[求助]怎样取HD-CN 转一取硬盘,CPU序列号代码
发表于: 2007-12-14 12:13 6254

[求助]怎样取HD-CN 转一取硬盘,CPU序列号代码

2007-12-14 12:13
6254
1,看见鸡蛋壳发的一个取硬件ID的小工具,收集下了资料,不知道 Hd-CN(见注1) 什么意思?哪位能提供下信息供参考下

2,程序1,2是收集的取硬盘序列号和CPU ID的程序。两个都有点问题
   1,我在网吧取不到硬盘序列号 估计是因为网吧是无盘工作站的缘故
   2,CPU ID在我双核机上每取20次左右会变化,是双核的缘故?

注1,
---------------------------
本机硬件ID:
---------------------------
Hd0ID:                                

Hd-CN:58A8-ED08                       

CpuID:AuthenticAMD                    

CpuID:00060FB10002080000002001178BFBFF

MacID:00-E0-4C-0C-4C-A9                 

程序1.
/////////////////////////////////////////////
///////////////////////////////////////////
//从一软件直接拉出来的汇编 简单改了下
//     可以这样调用         int a[4] = {0};
//                        getCPUID(a);     得到CPU ID建议不要用在软件中,我测试的时候每取20下CPU ID 就会发生变化,不知道为什么,难道因为我的机子是双核,有两个ID?或者是代码错了?
/////////////////////////////////////////////

void __declspec(naked) getCPUID(int *a)   
{
        _asm
        {
                 
                PUSH EBX
                PUSH EDI
                MOV EAX, [esp + 0xc]
                 MOV EDI,EAX
                MOV EAX,1
                CPUID
                STOS DWORD PTR ES:[EDI]
                MOV EAX,EBX
                STOS DWORD PTR ES:[EDI]
                MOV EAX,ECX
                STOS DWORD PTR ES:[EDI]
                MOV EAX,EDX
                STOS DWORD PTR ES:[EDI]
                POP EDI
                POP EBX
                RETN
        }

}
程序2.
// 12.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

  #include   <windows.h>     
  #include   <iostream>     
  #include   <stdio.h>     
using namespace std;
   
  #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;     
   
  void   CopyRight(){     
  cerr<<endl<<"HDD   identifier   v1.0   for   WIN95/98/Me/NT/2000.   written   by   Lu   Lin"<<endl;     
  cerr<<"For   more   information,   please   visit   Inside   Programming:   http://lu0.126.com"<<endl;     
  cerr<<"2000.11.3"<<endl<<endl;     
  }     
  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;     
  }     
  }     
   
  void   DetectIDE(BYTE   bIDEDeviceMap){     
  if   (bIDEDeviceMap&1){     
    if   (bIDEDeviceMap&16){     
      cout<<"ATAPI   device   is   attached   to   primary   controller,   drive   0."<<endl;     
    }else{     
      cout<<"IDE   device   is   attached   to   primary   controller,   drive   0."<<endl;     
    }     
  }     
  if   (bIDEDeviceMap&2){     
    if   (bIDEDeviceMap&32){     
      cout<<"ATAPI   device   is   attached   to   primary   controller,   drive   1."<<endl;     
    }else{     
      cout<<"IDE   device   is   attached   to   primary   controller,   drive   1."<<endl;     
    }     
  }     
  if   (bIDEDeviceMap&4){     
    if   (bIDEDeviceMap&64){     
      cout<<"ATAPI   device   is   attached   to   secondary   controller,   drive   0."<<endl;     
    }else{     
      cout<<"IDE   device   is   attached   to   secondary   controller,   drive   0."<<endl;     
    }     
  }     
  if   (bIDEDeviceMap&8){     
    if   (bIDEDeviceMap&128){     
      cout<<"ATAPI   device   is   attached   to   secondary   controller,   drive   1."<<endl;     
    }else{     
      cout<<"IDE   device   is   attached   to   secondary   controller,   drive   1."<<endl;     
    }     
  }     
  }     
   
  void   hdid9x(){     
  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;     
  }     
  //Display   IDE   drive   number   detected     
  DetectIDE(vers.bIDEDeviceMap);     
  //Identify   the   IDE   drives     
  for   (j=0;j<4;j++){     
    PIDSECTOR   phdinfo;     
    char   s[41];     
   
    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,phdinfo->sSerialNumber,20);     
    s[20]=0;     
    ChangeByteOrder(s,20);     
    cout<<"\tSerial   Number:"<<s<<endl;     
    cout<<"\tCapacity:"<<phdinfo->ulTotalAddressableSectors/2/1024<<"M"<<endl<<endl;     
  }     
   
  //Close   handle   before   quit     
  CloseHandle(h);     
  CopyRight();     
   
  }     
   
  void   hdidnt(){     
  char   hd[80];     
  PIDSECTOR   phdinfo;     
  char   s[41];     
   
  ZeroMemory(&vers,sizeof(vers));     
  //We   start   in   NT/Win2000     
  for   (j=0;j<4;j++){     
    sprintf(hd,"\\\\.\\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)){     
      cout<<"Error:   IDE   identify   command   not   supported.";     
      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,phdinfo->sSerialNumber,20);     
    s[20]=0;     
    ChangeByteOrder(s,20);     
    cout<<"\tSerial   Number:"<<s<<endl;     
    cout<<"\tCapacity:"<<phdinfo->ulTotalAddressableSectors/2/1024<<"M"<<endl<<endl;     
    CloseHandle(h);     
  }     
  CopyRight();     
  }     
   
int _tmain(int argc, _TCHAR* argv[])
{
   
  OSVERSIONINFO   VersionInfo;     
   
  ZeroMemory(&VersionInfo,sizeof(VersionInfo));     
  VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo);     
  GetVersionEx(&VersionInfo);     
   
  switch   (VersionInfo.dwPlatformId){     
  case   VER_PLATFORM_WIN32s:     
    cout<<"Win32s   is   not   supported   by   this   programm."<<endl;     
    return 0;     
  case   VER_PLATFORM_WIN32_WINDOWS:     
    hdid9x();     
    return 0;     
  case   VER_PLATFORM_WIN32_NT:     
    hdidnt();     
    return 0;     
  }     
  }

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
问题已解决
1,Hd-CN:58A8-ED08      这个原来是逻辑序列号
        DWORD dwIDESerial;
        ::GetVolumeInformation("C:\\", NULL, NULL, &dwIDESerial, NULL, NULL, NULL, NULL);  这样即可得到
2,在网吧取不到硬盘序列号是因为网吧用的无盘工作站 可能用了RAID 在服务器上用了磁盘阵列
3,取CPU ID本来就是随机的 单核也是这样    一个网友提示的 谢谢他了
2007-12-14 20:53
0
游客
登录 | 注册 方可回帖
返回
//