如何获取硬盘序列号?并转化为字符串?谢谢高手!

解决方案 »

  1.   

    CString strResult;
    char Name[MAX_PATH];
    DWORD serno;
    DWORD length;
    DWORD FileFlag;
    char FileName[MAX_PATH];
    BOOL Ret;
    Ret = GetVolumeInformation(strRoot, Name, MAX_PATH, &serno, &length, &FileFlag, FileName, MAX_PATH);
    if (Ret)
    strResult.Format("%ld", serno);
    return strResult.AllocSysString();
      

  2.   

    http://www.codeproject.com/system/system_information.asp
      

  3.   

    //获得当前驱动器名
    CString strRootPathName;
    GetWindowText(strRootPathName);
    //
             LPCTSTR lpRootPathName = strRootPathName;
    LPTSTR lpVolumeNameBuffer=new char[12];
    DWORD nVolumeNameSize=12;
    DWORD VolumeSerialNumber;
    DWORD MaximumComponentLength;
    DWORD FileSystemFlags;
    LPTSTR lpFileSystemNameBuffer=new char[10];
    DWORD nFileSystemNameSize=10;
    GetVolumeInformation(lpRootPathName,
    lpVolumeNameBuffer, nVolumeNameSize,
    &VolumeSerialNumber, 
    &MaximumComponentLength,
    &FileSystemFlags,
    lpFileSystemNameBuffer, nFileSystemNameSize); //显示磁盘序列号
    CString str;
    str.Format("当前磁盘序列号:",strRootPathName,VolumeSerialNumber);
              AfxMessageBox(str);
      

  4.   

    http://www.vckbase.com/document/viewdoc.asp?id=706
      

  5.   

    // CHardwareID.cpp : Implementation of CHardwareID
    #include "stdafx.h"
    #include "HardwareID.h"
    #include "CHardwareID.h"#include <stdio.h>
    #include <Iphlpapi.h>
    /////////////////////////////////////////////////////////////////////////////
    // CHardwareID#ifdef _UNICODE
    #define _tsprintf wsprintf
    #else
    #define _tsprintf sprintf
    #endif#define DFP_GET_VERSION 0x00074080 
    #define DFP_SEND_DRIVE_COMMAND 0x0007c084 
    #define DFP_RECEIVE_DRIVE_DATA 0x0007c088 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; 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 StrToHex(char* s, CComBSTR& bstr)
    {
    int sLen = strlen(s);
    char sTmp[3] = {NULL}; for (int i = 0; i < sLen; i ++)
    {
    sprintf(sTmp, "%x", s[i]);
    bstr += sTmp;
    }
    }char* RTrim(char* s)
    {
    int sLen = strlen(s);
    for (int i = 0; i < sLen; i ++)
    {
    if (isspace(s[sLen - i]))
    s[sLen - i] = NULL;
    } return s;
    }STDMETHODIMP CHardwareID::GetCPUID(BSTR *bstrCPUID)
    {
    CComBSTR bstr("");
    char szCPUID[129] = {NULL};
    char szTmp[33] = {NULL};
    unsigned long s1 = 0,
    s2 = 0;
    _asm
    {
     mov eax,01h
    xor edx,edx
    cpuid
    mov s1,edx
    mov s2,eax
    }
    sprintf(szTmp, "%08X%08X", s1, s2);
    strcpy(szCPUID, szTmp);
    _asm
    {
     mov eax,03h
    xor ecx,ecx
    xor edx,edx
    cpuid
    mov s1,edx
    mov s2,ecx
    }
    sprintf(szTmp, "%08X%08X", s1, s2);
    strcat(szCPUID, szTmp);
    bstr = szCPUID; *bstrCPUID = bstr.Copy(); return S_OK;
    }STDMETHODIMP CHardwareID::GetHardDiskID(BSTR *bstrHardDiskID)
    {
    GETVERSIONOUTPARAMS vers; 
    SENDCMDINPARAMS in; 
    SENDCMDOUTPARAMS out; 
    HANDLE h; 
    DWORD i; 
    BYTE j;  //char hd[80]; 
    TCHAR hd[80]; 
    PIDSECTOR phdinfo; 
    char s[41]; 
    CComBSTR bstr(""); ZeroMemory(&vers,sizeof(vers)); 
    for (j=0;j<4;j++)

    //sprintf(hd,"\\\\.\\PhysicalDrive%d",j); 
    _tsprintf(hd, TEXT("\\\\.\\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 (!(vers.fCapabilities & 1))

    CloseHandle(h); 
    goto ErrHandle; 

    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))

    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))

    CloseHandle(h); 
    goto ErrHandle; 

    phdinfo=(PIDSECTOR)out.bBuffer; 
    memcpy(s,phdinfo->sModelNumber,40); 
    s[40]=0; 
    ChangeByteOrder(s,40); 
    memcpy(s,phdinfo->sFirmwareRev,8); 
    s[8]=0; 
    ChangeByteOrder(s,8); 
    memcpy(s,phdinfo->sSerialNumber,20); 
    s[20]=0; 
    ChangeByteOrder(RTrim(s),20); 
    //bstr = s;
    StrToHex(s, bstr);
    CloseHandle(h);  break;
    } ErrHandle:
    *bstrHardDiskID = bstr.Copy(); return S_OK;
    }STDMETHODIMP CHardwareID::GetNetworkCardID(BSTR *bstrNetworkCardID)
    {
    HMODULE hLib = LoadLibrary(TEXT("IPHLPAPI.DLL"));
    PIP_ADAPTER_INFO piai = NULL;
    ULONG ul = 0;
    char sTmp[4] = {NULL};
    CComBSTR bstr("");
    typedef DWORD (WINAPI *pgai)(PIP_ADAPTER_INFO, PULONG); pgai p = (pgai)GetProcAddress(hLib, "GetAdaptersInfo");
    p(piai, &ul);
    piai = (PIP_ADAPTER_INFO)new BYTE[ul];
    p(piai, &ul);
    for (int i = 0; i < (int)piai->AddressLength; i ++)
    {
    if (i < (int)piai->AddressLength - 1)
    sprintf(sTmp, "%02x-", piai->Address[i]);
    else
    sprintf(sTmp, "%02x", piai->Address[i]); bstr += sTmp;
    } FreeLibrary(hLib); *bstrNetworkCardID = bstr.Copy(); return S_OK;
    }
      

  6.   

    就在第一个扇区里面,自己找出来好了,fat12/16在偏移39字节处,fat32在偏移67字节处,(ntfs我忘了,不好意思),4字节长
      

  7.   

    已经用VC.NET2003封装好放进www.tom.com的信箱里,用户名:mycsdn2003密码111111,你看看吧
      

  8.   

    一个更狠的,不止能获取,还能修改
    http://www.codeproject.com/system/change_drive_sn.asp
      

  9.   

    : 在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中 
    : 我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是 
    : 软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序 
    : 列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个 
    : api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所 
    : 以以读硬盘序列号为例, 
    : 下面就先介绍一下我们要用到的api函数 
    : BOOL GetVolumeInformation( 
    : LPCTSTR lpRootPathName, // 硬盘的路径 
    : LPTSTR lpVolumeNameBuffer, // 硬盘的卷标 
    : DWORD nVolumeNameSize, // 卷标的字符串长度 
    : LPDWORD lpVolumeSerialNumber, // 硬盘的序列号 
    : LPDWORD lpMaximumComponentLength, // 最大的文件长度 
    : LPDWORD lpFileSystemFlags, // 文件系统的一此标志 
    : LPTSTR lpFileSystemNameBuffer, // 存储所在盘符的分区类型的长指针变 
    : 量 
    : 量 
    : DWORD nFileSystemNameSize // 分区类型的长指针变量所指向的字符 
    : 串长度 
    : ); 
    : 如果上述函数成功就返回一个非0值。 

    : 光说不做,是不行了,我们还得实践一下:// 最大的文件长度 
    : 首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID, 
    : 点击finish。 
    : 加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码: 
    : LPCTSTR lpRootPathName="c:\\"; //取C盘 
    : LPTSTR lpVolumeNameBuffer=new char[12];//磁盘卷标 
    : DWORD nVolumeNameSize=12;// 卷标的字符串长度 
    : DWORD VolumeSerialNumber;//硬盘序列号 
    : DWORD MaximumComponentLength;// 最大的文件长度 
    : LPTSTR lpFileSystemNameBuffer=new char[10];// 存储所在盘符的分区类型的 
    : 长指针变量 
    : DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度 

    : DWORD FileSystemFlags;// 文件系统的一此标志 
    : ::GetVolumeInformation(lpRootPathName, 
    : lpVolumeNameBuffer, nVolumeNameSize, 
    : &VolumeSerialNumber, &MaximumComponentLength, 
    : &FileSystemFlags, 
    : lpFileSystemNameBuffer, nFileSystemNameSize); 

    : CString str; 
    : str.Format("Seria Num is %lx ",VolumeSerialNumber); 
    : AfxMessageBox(str); 
      

  10.   

    http://expert.csdn.net/Expert/topic/2748/2748251.xml?temp=.4880792