• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            飛天

            快樂的生活......

             

            讀取串口硬盤序列號(出廠唯一的序列號)(csdn)

            #define  IDENTIFY_BUFFER_SIZE  512

            #define  IDE_ATAPI_IDENTIFY  0xA0
            #define  IDE_ATA_IDENTIFY    0xEC
            #define  DFP_RECEIVE_DRIVE_DATA   0x0007c088

            #pragma pack(1)
            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;

            typedef
            struct _DRIVERSTATUS
            {
                BYTE  bDriverError;
                BYTE  bIDEStatus;
                BYTE  bReserved[
            2];
                DWORD  dwReserved[
            2];
            } DRIVERSTATUS,
            *PDRIVERSTATUS, *LPDRIVERSTATUS;

            typedef
            struct _SENDCMDOUTPARAMS
            {
                DWORD         cBufferSize;
                DRIVERSTATUS  DriverStatus;
                BYTE          bBuffer[
            1];
            } SENDCMDOUTPARAMS,
            *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;

            typedef
            struct _IDEREGS
            {
                BYTE bFeaturesReg;
                BYTE bSectorCountReg;
                BYTE bSectorNumberReg;
                BYTE bCylLowReg;
                BYTE bCylHighReg;
                BYTE bDriveHeadReg;
                BYTE bCommandReg;
                BYTE bReserved;
            } IDEREGS,
            *PIDEREGS, *LPIDEREGS;

            typedef
            struct _SENDCMDINPARAMS
            {
                DWORD     cBufferSize;
                IDEREGS   irDriveRegs;
                BYTE bDriveNumber;
                BYTE bReserved[
            3];
                DWORD     dwReserved[
            4];
                BYTE      bBuffer[
            1];
            } SENDCMDINPARAMS,
            *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;

            #pragma pack()

            void ChangeByteOrder(LPSTR lpString, int nLen)
            {
                USHORT i;
                CHAR c;

               
            // 63 63 72 75 6E 2E 63 6F 6D
                for(int i = 0; i < nLen; i += 2)
                {
                    c
            = lpString[i];
                    lpString[i]
            = lpString[i+1];
                    lpString[i
            +1] = c;
                }
            }

            bool CrnGetHDSerialNumber(LPSTR lpBuf)
            {
                strcpy(lpBuf,
            "");

                HANDLE hDevice;

               
            if(Win32Platform == VER_PLATFORM_WIN32_NT)
                   
            // 獲取第一個硬盤,如果有多個,更改PhysicalDrive?就可以了。
                    hDevice = CreateFile("\\\\.\\PhysicalDrive0",
                            GENERIC_READ
            | GENERIC_WRITE,
                            FILE_SHARE_READ
            | FILE_SHARE_WRITE,
                            NULL,
                            OPEN_EXISTING,
                           
            0,
                           
            0);
               
            else
                    hDevice
            = CreateFile("\\\\.\\SMARTVSD", 0, 0, NULL, CREATE_NEW, 0, 0);

               
            if(hDevice == INVALID_HANDLE_VALUE) return false;

                SENDCMDINPARAMS scip
            = { 0 };
               
            char szBuffer[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE] = { 0 };
                DWORD dwBytesRet
            = 0;
               
            bool bSuccess = false;
               
            try
                {
                    scip.cBufferSize
            = IDENTIFY_BUFFER_SIZE;

                    scip.irDriveRegs.bSectorCountReg
            = 1;
                    scip.irDriveRegs.bSectorNumberReg
            = 1;
                    scip.irDriveRegs.bDriveHeadReg
            = IDE_ATAPI_IDENTIFY;
                    scip.irDriveRegs.bCommandReg
            = IDE_ATA_IDENTIFY;

                   
            if(DeviceIoControl(hDevice,
                            DFP_RECEIVE_DRIVE_DATA,
                           
            &scip,
                           
            sizeof(SENDCMDINPARAMS) - 1,
                            szBuffer,
                           
            sizeof(szBuffer),
                           
            &dwBytesRet,
                            NULL))
                    {
                        PSENDCMDOUTPARAMS pOut
            = (PSENDCMDOUTPARAMS)szBuffer;
                        PIDSECTOR pIdSec
            = (PIDSECTOR)(pOut->bBuffer);
                        ChangeByteOrder(pIdSec
            ->sSerialNumber, sizeof(pIdSec->sSerialNumber));
                        strncpy(lpBuf, pIdSec
            ->sSerialNumber, 20);
                        bSuccess
            = true;
                    }
                }
                __finally
                {
                    CloseHandle(hDevice);
                }

               
            return bSuccess;
            }
            //---------------------------------------------------------------------------
            // 測試一哈
            void __fastcall TForm1::Button2Click(TObject *Sender)
            {
               
            char sz[255];
                CrnGetHDSerialNumber(sz);
                ShowMessage(String(sz).Trim());
            }
            http://topic.csdn.net/u/20071120/01/ace8c302-4260-4be2-99d7-faba80c68e8e.html

            posted on 2007-12-03 21:29 飛天 閱讀(1668) 評論(0)  編輯 收藏 引用 所屬分類: C++Builder

            導航

            統計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            Blogs

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            欧美久久综合九色综合| 精品久久香蕉国产线看观看亚洲| 青青青青久久精品国产h| 东方aⅴ免费观看久久av| 久久中文字幕精品| 久久精品无码午夜福利理论片| 久久亚洲精品国产精品婷婷| 国内精品伊人久久久影院| 午夜精品久久久久久| 久久乐国产综合亚洲精品| 久久亚洲精品国产精品| 97精品伊人久久久大香线蕉| 中文字幕精品久久久久人妻| 人妻无码久久精品| 久久人爽人人爽人人片AV| 久久免费精品视频| 狠狠色婷婷综合天天久久丁香 | 久久这里的只有是精品23| 午夜精品久久久久久影视riav| 久久精品国产亚洲AV高清热| 久久婷婷五月综合国产尤物app| 99999久久久久久亚洲| 热RE99久久精品国产66热| 国产精品久久国产精品99盘 | 久久久国产精华液| 久久国产热这里只有精品| 国产午夜精品理论片久久影视| 精品多毛少妇人妻AV免费久久| 国产伊人久久| 色偷偷偷久久伊人大杳蕉| 99久久这里只精品国产免费| 中文字幕久久波多野结衣av| 91精品日韩人妻无码久久不卡 | 亚洲国产精品人久久| 国产精品久久久久久福利漫画| 少妇久久久久久被弄高潮| 久久香蕉国产线看观看精品yw| 久久婷婷综合中文字幕| 久久久久亚洲精品天堂久久久久久| 亚洲国产精品久久久久网站| …久久精品99久久香蕉国产|