程序和源代码参见附件,也可以直接从下面链接页面下载:
http://www.codeproject.com/KB/mcpp/DriveInfoEx.aspx
Introduction
Many people looking for a schema to protect their work need to get some information that is hardware specific like the Mac Address or some hard drive serial number.
Background
If you tried other solutions like , it probably did not work for you because it's using the WMI services. I was able to find a solution that worked reasonably well . It made low level calls to the disk using commands sent by the DeviceIoControl
API. The code was not very reusable unless you used native C++. Therefore I brushed it a bit and made it look more Object Oriented. Most importantly, I exposed the drive information through a .NET collection.
Using the Code
Since the collection is written in MC++, I've included some Microsoft DLLs from the redistributable pack in the demo zip. Also it's mandatory to use .NET 2.0 since the collection is generic.
The code is very easy to use from any .NET language, like C# for instance:
![](http://www.codeproject.com/p_w_picpaths/minus.gif)
m_list = new DriveListEx(); m_list.Load(); //bind to a a grid view m_dataGridView.DataSource = m_list;
Points of Interest
The information about the internal drives is gathered in DiskInfo::LoadDiskInfo();
DiskInfo
is a native singleton class that wraps the calls to ReadPhysicalDriveInNTWithAdminRights()
and ReadIdeDriveAsScsiDriveInNT()
. I ignored the ReadPhysicalDriveInNTWithZeroRights()
that did not seem to work anyways.
Both functions will call AddIfNew()
if they can retrieve the information.
Internally there is a list that holds the raw information about the drives and that is updated when a new drive information was found.
![](http://www.codeproject.com/p_w_picpaths/minus.gif)
BOOL DiskInfo::AddIfNew(USHORT *pIdSector){ BOOL bAdd = TRUE; for(UINT i =0; i< m_list.size();i++) { if(memcmp(pIdSector,m_list[i],256 * sizeof(WORD)) == 0) { bAdd = false; break; } } if(bAdd) { WORD* diskdata = new WORD[256]; ::memcpy(diskdata,pIdSector,256*sizeof(WORD)); m_list.push_back(diskdata); } return bAdd;}
If you are stuck with a non .NET compiler, you could still use the source code from UnmanagedCode.cpp, just uncomment the #define NATIVE_CODE
line.
History
- Version 1.1: Added
ReadPhysicalDriveInNTUsingSmart
for reading the HDD info. P.S. I did not get a chance to test it for Windows 95 and alike.
License
This article, along with any associated source code and files, is licensed under