看流星社区

 找回密码
 注册账号
查看: 1881|回复: 1

VC++ MFC如何获取CPU ID及硬盘的序列号?

[复制链接]

该用户从未签到

发表于 2014-7-16 08:43:01 | 显示全部楼层 |阅读模式
是物理的,不是分区的,就是取得的东西必须是机子独一无二的标识”。
看了网上有关于这方面资料,还是不会搞,希望有高手愿意赐教!谢谢。
希望提供完整的源码  谢谢!
怎么没有读取SATA硬盘序列号的?
能实现VC++ MFC 里和C#联合开发吗?
如果可以,请附上关键源码,谢谢!测试通过也是最佳答案。请高人指点!
多谢!

该用户从未签到

发表于 2014-7-16 08:43:37 | 显示全部楼层
楼主你好!

  我也想知道怎么获取CPU的ID,但是,我现在有一个怎么获取硬盘物理序列号的,下面贴给你,你只需要放进一个*.cpp文件里就行了,用VC6(我也是网上找的)。

  这个是完全可以的,非常成功:

  /*+++
  HDID.CPP
  ---*/
  #include   <windows.h>
  #include   <iostream.h>
  #include   <stdio.h>

  #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;
  szString   =   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();
  }

  void   main(){
  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;
  case   VER_PLATFORM_WIN32_WINDOWS:
  hdid9x();
  return;
  case   VER_PLATFORM_WIN32_NT:
  hdidnt();
  return;
  }
  }

  希望能为你带来帮助,谢谢!
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-19 22:15

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表