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

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            Blogs

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            一极黄色视频久久网站| 狼狼综合久久久久综合网| 久久精品国产WWW456C0M| 久久精品国产一区二区三区不卡| 色综合合久久天天给综看| 精品无码久久久久国产动漫3d| 欧美一区二区三区久久综| 久久综合综合久久狠狠狠97色88| 欧美激情精品久久久久久| 亚洲AV无码久久| 久久亚洲天堂| 久久福利青草精品资源站免费| 久久精品亚洲欧美日韩久久| 亚洲精品tv久久久久久久久 | 97精品国产97久久久久久免费| 久久精品国产亚洲av影院| 色综合久久久久综合99| 久久久久久狠狠丁香| 日韩av无码久久精品免费| 伊人久久大香线蕉成人| 久久精品视频91| 狠狠色伊人久久精品综合网 | 久久人妻少妇嫩草AV蜜桃| 国产成人久久精品一区二区三区| 国产精品久久久久a影院| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久国产精品视频| 久久美女网站免费| 97精品国产91久久久久久| 亚洲精品国精品久久99热一| 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲AV日韩精品久久久久久久| 少妇久久久久久被弄到高潮| 久久国产三级无码一区二区| 久久国产成人亚洲精品影院| 国产高清美女一级a毛片久久w| 91久久精品电影| 久久97久久97精品免视看秋霞| 久久久久国产精品三级网| 久久久久九国产精品| 久久久高清免费视频|