日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC6获取硬盘序列号、型号、修订版本号

發布時間:2023/12/9 c/c++ 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC6获取硬盘序列号、型号、修订版本号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

因為要做個讀取硬盤參數信息的控件,所以在網上找了不少代碼,但是自己作為一個初學者在使用別人代碼時,總會發現有各種各樣的問題:

1. 需要的頭文件未寫明

2. 有些定義未給出

3. 代碼的開發環境未明,導致編譯時出現“XXXX“未定義

3. 添加的代碼寫在哪里不明確

以上這些情況對于初學者是很容易遇到的,所以這里整理了下。

以下是“讀取硬盤序列號、型號、修訂版本號”的完整代碼(win32 C++控制臺程序),開發環境:win XP SP2 + VC6.0

頭文件:Struct_Def.h

// 其實以下的定義多數是來自高版本VC(我機器上是VS2010)的頭文件:C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinIoCtl.htypedef struct _DRIVERSTATUS {BYTE bDriverError; // Error code from driver,// or 0 if no error.BYTE bIDEError; // Contents of IDE Error register.// Only valid when bDriverError// is SMART_IDE_ERROR.BYTE bReserved[2]; // Reserved for future expansion.DWORD dwReserved[2]; // Reserved for future expansion. } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;typedef struct _IDEREGS {BYTE bFeaturesReg; // Used for specifying SMART "commands".BYTE bSectorCountReg; // IDE sector count registerBYTE bSectorNumberReg; // IDE sector number registerBYTE bCylLowReg; // IDE low order cylinder valueBYTE bCylHighReg; // IDE high order cylinder valueBYTE bDriveHeadReg; // IDE drive/head registerBYTE bCommandReg; // Actual IDE command.BYTE bReserved; // reserved for future use. Must be zero. } IDEREGS, *PIDEREGS, *LPIDEREGS;typedef struct _SENDCMDOUTPARAMS {DWORD cBufferSize; // Size of bBuffer in bytesDRIVERSTATUS DriverStatus; // Driver status structure.BYTE bBuffer[1]; // Buffer of arbitrary length in which to store the data read from the // drive. } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;typedef struct _SENDCMDINPARAMS {DWORD cBufferSize; // Buffer size in bytesIDEREGS irDriveRegs; // Structure with drive register values.BYTE bDriveNumber; // Physical drive number to send// command to (0,1,2,3).BYTE bReserved[3]; // Reserved for future expansion.DWORD dwReserved[4]; // For future use.BYTE bBuffer[1]; // Input buffer. } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;typedef struct _GETVERSIONINPARAMS {BYTE bVersion; // Binary driver version.BYTE bRevision; // Binary driver revision.BYTE bReserved; // Not used.BYTE bIDEDeviceMap; // Bit map of IDE devices.DWORD fCapabilities; // Bit mask of driver capabilities.DWORD dwReserved[4]; // For future use. } GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;#define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS) #define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define DFP_SEND_DRIVE_COMMAND SMART_SEND_DRIVE_COMMAND #define GETVERSIONOUTPARAMS GETVERSIONINPARAMS #define DFP_RCV_DRIVE_DATA SMART_RCV_DRIVE_DATA #define DFP_GET_VERSION SMART_GET_VERSION #define IDENTIFY_BUFFER_SIZE 512


主程序:m.cpp

/*功能:VC6獲取硬盤序列號、型號、修訂版本號 */#include <iostream> #include <windows.h> #include <winioctl.h> #include "Struct_Def.h"using namespace std;const WORD IDE_ATAPI_IDENTIFY = 0xA1; //讀取ATAPI設備的命令 const WORD IDE_ATA_IDENTIFY = 0xEC; //讀取ATA設備的命令 const int MAX_IDE_DRIVES = 1; //最多IDE設備數string Trim(string str) // cut off leading and tailing blanks {string::size_type pos = str.find_last_not_of(' ');if(pos != string::npos){str.erase(pos + 1);pos = str.find_first_not_of(' ');if(pos != string::npos) str.erase(0, pos);}else str.erase(str.begin(), str.end());return str; }// fetch characters what we need from DiskData[FirstIndex ... LastIndex] string __fastcall ConvertToString(DWORD DiskData[256], int FirstIndex, int LastIndex) {int i = 0;char ResBuf[1024] = {0};for(char *p = (char*)(DiskData + FirstIndex); p <= (char*)(DiskData + LastIndex); p += sizeof(DiskData)){ResBuf[i++] = *(p+1);ResBuf[i++] = *p;}return Trim(ResBuf); // cut off leading and tailing blanks }BOOL __fastcall DoIdentify(HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP, PSENDCMDOUTPARAMS pSCOP, byte bIDCmd, byte bDriveNum, PDWORD lpcbBytesReturned) {// Set up data structures for IDENTIFY command.pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;pSCIP->irDriveRegs.bFeaturesReg = 0;pSCIP->irDriveRegs.bSectorCountReg = 1;pSCIP->irDriveRegs.bSectorNumberReg = 1;pSCIP->irDriveRegs.bCylLowReg = 0;pSCIP->irDriveRegs.bCylHighReg = 0;//Compute the drive number.(主盤和從盤所對應的值是不一樣的)pSCIP->irDriveRegs.bDriveHeadReg = (bDriveNum & 1) ? 0xB0 : 0xA0;// The command can either be IDE identify or ATAPI identify.pSCIP->irDriveRegs.bCommandReg = bIDCmd;pSCIP->bDriveNumber = bDriveNum;pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;return DeviceIoControl(hPhysicalDriveIOCTL, DFP_RCV_DRIVE_DATA, (LPVOID)pSCIP, sizeof(SENDCMDINPARAMS) - 1, (LPVOID)pSCOP, sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1, lpcbBytesReturned, NULL); }// 獲取硬盤型號、序列號、修訂版本號 void __fastcall ReadPhysicalDriveOnNT() {//IDENTIFY_BUFFER_SIZE = 512byte IdOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];char serialNo[21], modelNo[21], revisionNo[21];for(int Drive=0; Drive < 4; Drive++){HANDLE hPhysicalDriveIOCTL;char DriveName[32];sprintf(DriveName, "\\\\.\\PhysicalDrive%d", Drive);hPhysicalDriveIOCTL = CreateFile(DriveName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);if(hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE){DWORD cbBytesReturned = 0;GETVERSIONOUTPARAMS VersionParams;// Get the version, etc of PhysicalDrive IOCTLZeroMemory(&VersionParams, sizeof(GETVERSIONOUTPARAMS));if(!DeviceIoControl(hPhysicalDriveIOCTL, DFP_GET_VERSION, NULL, 0, &VersionParams, sizeof(VersionParams), &cbBytesReturned, NULL)){continue;}if(VersionParams.bIDEDeviceMap > 0){// IDE or ATAPI IDENTIFY cmdbyte bIDCmd = 0;SENDCMDINPARAMS InParams;// Now, get the ID sector for all IDE devices in the system.// If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,// otherwise use the IDE_ATA_IDENTIFY command// 具體所得結果請參考上面的說明bIDCmd = (VersionParams.bIDEDeviceMap >> Drive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;ZeroMemory(&InParams, sizeof(SENDCMDINPARAMS));ZeroMemory(IdOutCmd, sizeof(IdOutCmd));if(DoIdentify(hPhysicalDriveIOCTL, &InParams, (PSENDCMDOUTPARAMS)IdOutCmd, (BYTE)bIDCmd,(BYTE)Drive, &cbBytesReturned)){DWORD DiskData[256];USHORT *pIDSector; // 對應結構IDSECTOR,見頭文件pIDSector = (USHORT*)((SENDCMDOUTPARAMS*)IdOutCmd)->bBuffer;for(int i=0; i < 256; i++)DiskData[i] = pIDSector[i];FILE *fp = NULL;if(NULL != (fp = fopen("a.log", "w"))){fwrite(DiskData, sizeof(DiskData), 1, fp);fclose(fp);cout<<"Write file successful"<<endl;}strcpy(serialNo, ConvertToString(DiskData, 10, 19).c_str()); // get serial numberstrcpy(modelNo, ConvertToString(DiskData, 27, 46).c_str()); // get model typestrcpy(revisionNo, ConvertToString (DiskData, 23, 26).c_str()); // 獲取修訂版本號printf("SerialNo=%s\nModelNo=%s\nRevisionNo=%s\n", serialNo, modelNo, revisionNo);}}CloseHandle(hPhysicalDriveIOCTL);}} }int main() {ReadPhysicalDriveOnNT();return 0; }


運行結果:

Write file successful SerialNo=6VMSHFW9 ModelNo=ST3500418AS RevisionNo=CC68 Press any key to continue


?

總結

以上是生活随笔為你收集整理的VC6获取硬盘序列号、型号、修订版本号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。