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

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产福利电影一区二区三区久久久久成人精品综合 | 色综合合久久天天综合绕视看| 无码国产69精品久久久久网站| 热re99久久精品国99热| 亚洲欧美日韩精品久久| 欧美一级久久久久久久大| 伊人久久综合无码成人网| 亚洲国产精品久久久久婷婷老年| 99久久久久| 欧美一区二区三区久久综合| 品成人欧美大片久久国产欧美| 伊人色综合久久天天人守人婷| 久久精品国产亚洲77777| 久久精品国产国产精品四凭| 日韩人妻无码精品久久免费一| 久久久久九九精品影院| 成人国内精品久久久久一区| 国产精品乱码久久久久久软件| 91精品国产综合久久精品| 2021最新久久久视精品爱| 亚洲国产精品婷婷久久| 无码人妻久久一区二区三区免费| 久久久久国产视频电影| 精品久久久久久无码中文字幕一区| 亚洲国产成人久久笫一页| 国产精品美女久久久久AV福利| 久久久久久人妻无码| 漂亮人妻被黑人久久精品| 久久午夜免费视频| 日日狠狠久久偷偷色综合免费| segui久久国产精品| 岛国搬运www久久| 国产国产成人久久精品| 99久久精品九九亚洲精品| 国产99久久精品一区二区| AV无码久久久久不卡网站下载| 亚洲精品tv久久久久久久久| 久久久午夜精品| 国产A三级久久精品| 无码日韩人妻精品久久蜜桃 | 99久久亚洲综合精品成人|