获取硬盘序列号(转载)

// ReadHarddiskSerial.cpp : Defines the entry point for the console application.
//

/*+++
HDID.CPP
Written by Lu Lin
http://lu0.126.com
2000.11.3
---*/
#include "StdAfx.h"
#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;

char SerialNumber[80] = {0};
ULONG SerialLength = 0;

UINT CopySerialNumber(char *inpBuf,ULONG inlen,char* outpBuf)
{
 int nSerialLength = 0;
 for (ULONG i=0; i<inlen; i++)
 {
  if (inpBuf[i] != ' ')
  {
   outpBuf[nSerialLength] = inpBuf[i];
   nSerialLength++;
  }
 }
 return nSerialLength;
}

UINT GetSerialNumberLength(char *pBuf,ULONG len)
{
 int nSerialLength = 0;
 for (ULONG i=0; i<len; i++)
 {
  if (pBuf[i] != ' ')
  {
   nSerialLength++;
  }
 }
 return nSerialLength;
}

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);
  return;
 }

 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()
{
 ULONG nret = 0;
 char hd[80];
 PIDSECTOR phdinfo;
 char s[80] = {0};
 //char* s = new char[20];
 //ZeroMemory(s,20);

 ZeroMemory(&vers,sizeof(vers));

 SerialLength = 0;
 ULONG uSerialLength[4] = {0};
 char disk[4][20] = {0};

 //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)
  {
    cout<<"open PhysicalDrive%d fail"<<j<<endl;
    continue;
  }
  if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0))
  {
    cout<<"DeviceIoControl fail"<<j<<endl;
    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);
//   nret = GetSerialNumberLength(s,20);

  memcpy(s,phdinfo->sSerialNumber,20);
  s[20] = 0;
  ChangeByteOrder(s,20);
  uSerialLength[j] = CopySerialNumber(s,20,disk[j]);
  //uSerialLength[j] = GetSerialNumberLength(s,20);
  strcat(SerialNumber,disk[j]);
  SerialLength = SerialLength + uSerialLength[j];
  

  //cout<<"/tSerial Number:"<<SerialNumber<<endl;
  //cout<<"/tSerial Number Length:"<<SerialNumber<<endl;
  //cout<<"/tCapacity:"<<phdinfo->ulTotalAddressableSectors/2/1024<<"M"<<endl<<endl;
  CloseHandle(h);  
 }

 cout<<"/tSerial Number:"<<SerialNumber<<endl;
 cout<<"/tSerial Number Length:"<<SerialLength<<endl;

 //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;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值