DWORD Get_Disk_Serial(int drive, CHAR sSerialNumber[])

來源:互聯網
上載者:User

DWORD Get_Disk_Serial(int drive, CHAR sSerialNumber[])<br />{<br /> typedef struct _IDSECTOR<br /> {<br /> USHORT wGenConfig;<br /> USHORT wNumCyls;<br /> USHORT wReserved;<br /> USHORT wNumHeads;<br /> USHORT wBytesPerTrack;<br /> USHORT wBytesPerSector;<br /> USHORT wSectorsPerTrack;<br /> USHORT wVendorUnique[3];<br /> CHAR sSerialNumber[20];<br /> USHORT wBufferType;<br /> USHORT wBufferSize;<br /> USHORT wECCSize;<br /> CHAR sFirmwareRev[8];<br /> CHAR sModelNumber[40];<br /> USHORT wMoreVendorUnique;<br /> USHORT wDoubleWordIO;<br /> USHORT wCapabilities;<br /> USHORT wReserved1;<br /> USHORT wPIOTiming;<br /> USHORT wDMATiming;<br /> USHORT wBS;<br /> USHORT wNumCurrentCyls;<br /> USHORT wNumCurrentHeads;<br /> USHORT wNumCurrentSectorsPerTrack;<br /> ULONG ulCurrentSectorCapacity;<br /> USHORT wMultSectorStuff;<br /> ULONG ulTotalAddressableSectors;<br /> USHORT wSingleWordDMA;<br /> USHORT wMultiWordDMA;<br /> BYTE bReserved[128];<br /> } IDSECTOR, *PIDSECTOR;</p><p> #define DFP_GET_VERSION 0x00074080<br /> #define DFP_SEND_DRIVE_COMMAND 0x0007c084<br /> #define DFP_RECEIVE_DRIVE_DATA 0x0007c088</p><p> typedef struct _GETVERSIONOUTPARAMS<br /> {<br /> BYTE bVersion; // Binary driver version.<br /> BYTE bRevision; // Binary driver revision.<br /> BYTE bReserved; // Not used.<br /> BYTE bIDEDeviceMap; // Bit map of IDE devices.<br /> DWORD fCapabilities; // Bit mask of driver capabilities.<br /> DWORD dwReserved[4]; // For future use.<br /> } GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;</p><p> typedef struct _SENDCMDINPARAMS<br /> {<br /> DWORD cBufferSize; // Buffer size in bytes<br /> BYTE bFeaturesReg; // Used for specifying SMART "commands".<br /> BYTE bSectorCountReg; // IDE sector count register<br /> BYTE bSectorNumberReg; // IDE sector number register<br /> BYTE bCylLowReg; // IDE low order cylinder value<br /> BYTE bCylHighReg; // IDE high order cylinder value<br /> BYTE bDriveHeadReg; // IDE drive/head register<br /> BYTE bCommandReg; // Actual IDE command.<br /> BYTE bReservedReg; // reserved for future use. Must be zero.<br /> //IDEREGS irDriveRegs; // Structure with drive register values.<br /> BYTE bDriveNumber; // Physical drive number to send<br /> // command to (0,1,2,3).<br /> BYTE bReserved[3]; // Reserved for future expansion.<br /> DWORD dwReserved[4]; // For future use.<br /> BYTE bBuffer[1]; // Input buffer.<br /> } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;</p><p> typedef struct _SENDCMDOUTPARAMS<br /> {<br /> DWORD cBufferSize; // Size of bBuffer in bytes<br /> BYTE bDriverError; // Error code from driver, or 0 if no error.<br /> BYTE bIDEStatus; // Contents of IDE Error register.<br /> // Only valid when bDriverError is SMART_IDE_ERROR.<br /> BYTE bReserved[2]; // Reserved for future expansion.<br /> DWORD dwReserved[2]; // Reserved for future expansion.<br /> //DRIVERSTATUS DriverStatus; // Driver status structure.<br /> BYTE bBuffer[1]; // Buffer of arbitrary length in which<br /> //to store the data read from the // drive.<br /> } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;</p><p>DWORD err = ERROR_SUCCESS;</p><p> //NT system<br /> CString driveName;<br /> driveName.Format(_T("////.//PhysicalDrive%d"),drive);</p><p> HANDLE hPhysicalDriveIOCTL = CreateFile (driveName,<br /> GENERIC_READ | GENERIC_WRITE,<br /> FILE_SHARE_READ | FILE_SHARE_WRITE , NULL,<br /> OPEN_EXISTING, 0, NULL);<br /> if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)<br /> {<br /> GETVERSIONOUTPARAMS VersionParams = {0};<br /> DWORD cbBytesReturned = 0;</p><p> if(DeviceIoControl(hPhysicalDriveIOCTL, DFP_GET_VERSION,<br /> NULL, 0,<br /> &VersionParams,sizeof(GETVERSIONOUTPARAMS),<br /> &cbBytesReturned, NULL) )<br /> {<br /> if(VersionParams.bIDEDeviceMap > 0)<br /> {<br /> SENDCMDINPARAMS SendInParams = {0};<br /> SendInParams.bSectorCountReg = 1;<br /> SendInParams.bSectorNumberReg = 1;<br /> SendInParams.bDriveHeadReg = 0xA0 | ((drive & 1) << 4);</p><p> if(VersionParams.bIDEDeviceMap >> drive & 0x10) // ATAPI IDENTIFY Cmd supported<br /> SendInParams.bCommandReg = 0xA1;<br /> else //IDE IDENTIFY Cmd<br /> SendInParams.bCommandReg = 0xEC;<br /> SendInParams.bDriveNumber = drive;<br /> SendInParams.cBufferSize = 512;</p><p> cbBytesReturned = 0;</p><p> BYTE IdOutCmd [sizeof (SENDCMDOUTPARAMS) + 512 + 1] = {0};</p><p> if(DeviceIoControl(hPhysicalDriveIOCTL, DFP_RECEIVE_DRIVE_DATA,<br /> &SendInParams,sizeof(SENDCMDINPARAMS)-1,<br /> (LPSENDCMDOUTPARAMS)&IdOutCmd,sizeof(SENDCMDOUTPARAMS) + 512,<br /> &cbBytesReturned,NULL))<br /> {<br /> IDSECTOR *pIDinfo = (IDSECTOR *)(((LPSENDCMDOUTPARAMS)&IdOutCmd)->bBuffer);<br /> memcpy(sSerialNumber,pIDinfo->sSerialNumber,20);<br /> }<br /> else<br /> {<br /> err = GetLastError();<br /> }<br /> }<br /> else<br /> {<br /> err = GetLastError();<br /> }<br /> }<br /> CloseHandle (hPhysicalDriveIOCTL);<br /> }<br /> else<br /> {<br /> err = GetLastError();<br /> }</p><p> return(err);<br />}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.