加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

获取硬盘序列号的C++代码

发布时间:2020-12-16 07:44:28 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 // GetHardDiskNum.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

    // GetHardDiskNum.cpp : 定义控制台应用程序的入口点。  
    //  
      
    #include "stdafx.h"  
      
    #ifndef _WIN32_WINNT  
    #define _WIN32_WINNT 0x0501  
    #endif  
      
    #include <windows.h>  
    #include <winioctl.h>  
      
    //  
    BOOL GetPhyDriveSerial(LPTSTR pModelNo,LPTSTR pSerialNo);  
    void ToLittleEndian(PUSHORT pWords,int nFirstIndex,int nLastIndex,LPTSTR pBuf);  
    void TrimStart(LPTSTR pBuf);  
      
    //  
    // Model Number: 40 ASCII Chars  
    // SerialNumber: 20 ASCII Chars  
    //  
    BOOL GetPhyDriveSerial(LPTSTR pModelNo,LPTSTR pSerialNo)  
    {  
        //-1是因为 SENDCMDOUTPARAMS 的结尾是 BYTE bBuffer[1];  
        BYTE IdentifyResult[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];  
        DWORD dwBytesReturned;  
        GETVERSIONINPARAMS get_version;  
        SENDCMDINPARAMS send_cmd = { 0 };  
      
        HANDLE hFile = CreateFile(_T("\.PHYSICALDRIVE0"),GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL);  
        if(hFile == INVALID_HANDLE_VALUE)  
            return FALSE;  
      
        //get version  
        DeviceIoControl(hFile,SMART_GET_VERSION,&get_version,sizeof(get_version),&dwBytesReturned,NULL);  
      
        //identify device  
        send_cmd.irDriveRegs.bCommandReg = (get_version.bIDEDeviceMap & 0x10)? ATAPI_ID_CMD : ID_CMD;  
        DeviceIoControl(hFile,SMART_RCV_DRIVE_DATA,&send_cmd,sizeof(SENDCMDINPARAMS) - 1,IdentifyResult,sizeof(IdentifyResult),NULL);  
        CloseHandle(hFile);  
      
        //adjust the byte order  
        PUSHORT pWords = (USHORT*)(((SENDCMDOUTPARAMS*)IdentifyResult)->bBuffer);  
        ToLittleEndian(pWords,27,46,pModelNo);  
        ToLittleEndian(pWords,10,19,pSerialNo);  
        return TRUE;  
    }  
      
    //把WORD数组调整字节序为little-endian,并滤除字符串结尾的空格。  
    void ToLittleEndian(PUSHORT pWords,LPTSTR pBuf)  
    {  
        int index;  
        LPTSTR pDest = pBuf;  
        for(index = nFirstIndex; index <= nLastIndex; ++index)  
        {  
            pDest[0] = pWords[index] >> 8;  
            pDest[1] = pWords[index] & 0xFF;  
            pDest += 2;  
        }      
        *pDest = 0;  
      
        //trim space at the endof string; 0x20: _T(' ')  
        --pDest;  
        while(*pDest == 0x20)  
        {  
            *pDest = 0;  
            --pDest;  
        }  
    }  
      
    //滤除字符串起始位置的空格  
    void TrimStart(LPTSTR pBuf)  
    {  
        if(*pBuf != 0x20)  
            return;  
      
        LPTSTR pDest = pBuf;  
        LPTSTR pSrc = pBuf + 1;  
        while(*pSrc == 0x20)  
            ++pSrc;  
      
        while(*pSrc)  
        {  
            *pDest = *pSrc;  
            ++pDest;  
            ++pSrc;  
        }  
        *pDest = 0;  
    }  
      
      
    int _tmain(int argc,_TCHAR* argv[])  
    {  
        TCHAR szModelNo[48],szSerialNo[24];  
        if(GetPhyDriveSerial(szModelNo,szSerialNo))  
        {  
            _tprintf(_T("Model No: %sn"),szModelNo);  
            TrimStart(szSerialNo);  
            _tprintf(_T("Serial No: %sn"),szSerialNo);  
        }  
        else  
        {  
            _tprintf(_T("Failed.n"));  
        }  
        getchar();  
        return 0;  
      
        return 0;  
    }  

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读