• <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 飛天 閱讀(1665) 評論(0)  編輯 收藏 引用 所屬分類: C++Builder

            導航

            統計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            Blogs

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲欧美日韩久久精品| 久久无码国产| 青青草国产成人久久91网| 国产午夜精品久久久久九九| 色综合久久88色综合天天| 国产L精品国产亚洲区久久| 伊人久久大香线蕉综合5g| 嫩草伊人久久精品少妇AV| 久久久久国色AV免费观看| 亚洲精品乱码久久久久66| 久久狠狠一本精品综合网| 久久国产精品77777| 99久久这里只精品国产免费| 久久这里只精品国产99热| 狠狠色丁香久久婷婷综合_中| 国内精品伊人久久久久| 国产成人精品久久| 亚洲综合久久夜AV | 亚洲成人精品久久| 久久久亚洲欧洲日产国码二区| 久久免费观看视频| 99久久国产综合精品成人影院| 人妻精品久久久久中文字幕一冢本 | 日韩久久无码免费毛片软件| 久久久噜噜噜www成人网| 狠狠色丁香久久婷婷综合图片 | 婷婷久久五月天| 久久久久亚洲AV综合波多野结衣 | 奇米影视7777久久精品人人爽 | 久久精品亚洲精品国产色婷| 国产99久久久国产精品小说| 日本精品久久久久影院日本| 久久无码人妻精品一区二区三区 | 国产V综合V亚洲欧美久久| 少妇高潮惨叫久久久久久| 日日噜噜夜夜狠狠久久丁香五月| 国内精品久久久久影院薰衣草 | 久久青青草原精品国产软件| 久久精品无码免费不卡| 久久人人爽人爽人人爽av| 亚洲?V乱码久久精品蜜桃 |