国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

完善DriveInfoEx源代碼 獲取計算機硬盤序列號

2019-11-17 02:56:05
字體:
來源:轉載
供稿:網友

完善DriveInfoEx源代碼 獲取計算機硬盤序列號

概述:

獲取計算機硬盤序列號用途很多,在網上找到了一個C++的源代碼DriveInfoEx(點這里查看)。非常好的一個DLL,.NET項目可以直接引用,而且源代碼里有示例。

但這個DLL在Win7非管理員權限下,無法獲取硬盤序列號,所以我就完善了一下這個DLL,讓其支持Win7 非管理員。

源代碼:

https://github.com/Xiongpq/DriveInfoExFull

編譯時請注意

源代碼內的一些方法,在VC90里已經被系統直接支持,所以就不用再重復定義,不然編譯不過,所以如果在VC90及大于VC90平臺編譯的話,需要加一個“VC90”的“預處理器定義”。

代碼中我做了判斷,如果預定義了“VC90”就不會定義一些方法。在VC80及小于VC80平臺編譯的話,不用做這個設置。

DriveInfoExFull/DriveInfoEx/bin 目錄下有已經編譯好的DLL,這兩個DLL支持.NET Framework 2.0

代碼分析:

原作者的代碼已經能很好支持非管理員權限下的硬盤序列號獲取,我就不再分析原來的代碼,只是大概說下我修改的內容。

ReadPhysicalDriveInNTWithZeroRights這個方法被原作者注釋掉了,不知道什么原因,這個方法就是在沒有權限的情況下獲取硬盤序列號。

用這個方法如果找到的硬盤編號滿足要求就添加到m_serizalNoVec中,這是一個vector<char*>

然后在Load方法中判斷如果常規方法找到的硬盤個數為0,則將m_serizalNoVec中的硬盤信息添加到結果中。這個只包括硬盤的序列號,不包括大小等信息。

下面就是這個方法:

int DiskInfo::ReadPhysicalDriveInNTWithZeroRights (void){   int done = FALSE;   int drive = 0;   for (drive = 0; drive < MAX_IDE_DRIVES; drive++)   {      HANDLE hPhysicalDriveIOCTL = 0;         //  Try to get a handle to PhysicalDrive IOCTL, report failure         //  and exit if can't.      TCHAR driveName [256];      swPRintf (driveName, L"http:////.//PhysicalDrive%d", drive);         //  Windows NT, Windows 2000, Windows xp - admin rights not required      hPhysicalDriveIOCTL = CreateFile (driveName, 0,                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,                               OPEN_EXISTING, 0, NULL);      if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)      {         STORAGE_PROPERTY_QUERY query;         DWord cbBytesReturned = 0;         char buffer [10000];         memset ((void *) & query, 0, sizeof (query));         query.PropertyId = StorageDeviceProperty;         query.QueryType = PropertyStandardQuery;         memset (buffer, 0, sizeof (buffer));         if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,                   & query,                   sizeof (query),                   & buffer,                   sizeof (buffer),                   & cbBytesReturned, NULL) )         {                      STORAGE_DEVICE_DESCRipTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;             char* serialNumber  = new char[1000];             strcpy (serialNumber,                      flipAndCodeBytes ( & buffer [descrip -> SerialNumberOffset]));             int isAlnumAndSpace = TRUE;             int isAllSpace = TRUE;             int length=strlen(serialNumber);             for(int i=0;i<length;i++){                if(!isalnum(serialNumber[i]) && serialNumber[i] != ' '){                     isAlnumAndSpace=FALSE;                     break;                }                if(isAllSpace && serialNumber[i] != ' '){                    isAllSpace=FALSE;                }             }            //硬盤編號為字母、數字和空格,但不是純空格             if(isAlnumAndSpace && !isAllSpace){                m_serizalNoVec.push_back(serialNumber);             }                          done=TRUE;         }        CloseHandle (hPhysicalDriveIOCTL);      }   }   return done;}

INT Load()        {                DiskInfo& di = DiskInfo::GetDiskInfo();                UINT cnt = di.LoadDiskInfo();                for(UINT i=0; i < cnt; i++)                    this->Add(gcnew DriveInfoEx(i));                //判斷如果常規方法找到的硬盤為0,則將m_serizalNoVec中的硬盤信息添加到結果中。                //這個只包括硬盤的序列號,不包括大小等信息。                if(cnt == 0){                    UINT zeroRightCount = di.m_serizalNoVec.size();                    for(UINT i=0; i < zeroRightCount; i++){                        this->Add(gcnew DriveInfoEx(di.m_serizalNoVec[i]));                    }                }                return this->Count;        };

還有一些其他的修改就不再詳細介紹,想了解的可以看看源代碼。

不想了解的,下載DLL直接使用吧,哈哈~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 孝感市| 墨玉县| 股票| 西充县| 利津县| 上栗县| 苏尼特右旗| 乐山市| 象州县| 侯马市| 祁门县| 安塞县| 齐齐哈尔市| 旺苍县| 遂宁市| 兴城市| 花莲市| 西宁市| 兖州市| 马尔康县| 尼玛县| 呼伦贝尔市| 房产| 霍山县| 淮阳县| 左云县| 海阳市| 宕昌县| 吉木乃县| 龙井市| 兴城市| 阳高县| 波密县| 松潘县| 久治县| 开封县| 牙克石市| 兖州市| 栾川县| 郧西县| 郴州市|