Click here to Skip to main content
14,236,299 members

Get Physical HDD Serial Number without WMI

Rate this:
4.79 (62 votes)
Please Sign up or sign in to vote.
4.79 (62 votes)
6 May 2008CPOL
Retrieve the physical Hard drive ID and other info using low level APIs like DeviceIOControl

Sample Image - DriveInfo.png

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 like this one, 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 here. 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:

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.

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.
This build is for Windows XP 32 bit systems. If you need it for Vista or 64 bit systems, you should select the right include and lib folders when building and should not use the additional DLLs from the release.zip archive, since they are 32 bit for Windows XP.

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 The Code Project Open License (CPOL)

Share

About the Author

dmihailescu
Software Developer (Senior)
United States United States
Decebal Mihailescu is a software engineer with interest in .Net, C# and C++.

Comments and Discussions

 
GeneralDriveInfo with Drive Letter Pin
Feilong8416-Jun-08 6:03
memberFeilong8416-Jun-08 6:03 
GeneralWindows Vista Business 32Bit issue Pin
Francesco774-Jun-08 4:23
memberFrancesco774-Jun-08 4:23 
GeneralRe: Windows Vista Business 32Bit issue Pin
dmihailescu4-Jun-08 12:53
memberdmihailescu4-Jun-08 12:53 
GeneralRe: Windows Vista Business 32Bit issue Pin
Patrick Chang12-Jul-08 5:00
memberPatrick Chang12-Jul-08 5:00 
GeneralRe: Windows Vista Business 32Bit issue Pin
dmihailescu12-Jul-08 9:49
memberdmihailescu12-Jul-08 9:49 
Generalerror in DiskInfo::ReadPhysicalDriveInNTUsingSmart (void) [modified] Pin
ocelot11-May-08 7:03
memberocelot11-May-08 7:03 
GeneralRe: error in DiskInfo::ReadPhysicalDriveInNTUsingSmart (void) Pin
dmihailescu12-May-08 3:48
memberdmihailescu12-May-08 3:48 
QuestionRAID Disks Pin
lostone2-May-08 4:49
memberlostone2-May-08 4:49 
Firs of all thanks for this nice solution, but we have a problem about it.

We have Raid disks in use. We also want to get a serial no from these disks but code returns only null values.Any unique number from hardware would be very usefull for me. But software changes shouldn't be an effect on this number.

Do anyone have an idea what can be done for this situation?
QuestionRe: RAID Disks Pin
lostone2-May-08 22:17
memberlostone2-May-08 22:17 
AnswerRe: RAID Disks Pin
dmihailescu5-May-08 17:26
memberdmihailescu5-May-08 17:26 
AnswerRe: RAID Disks Pin
TheWizardOfOz28-Aug-08 3:26
memberTheWizardOfOz28-Aug-08 3:26 
GeneralNot working on Vista Ultimate 64bit Pin
pikob22-Apr-08 3:28
memberpikob22-Apr-08 3:28 
GeneralRe: Not working on Vista Ultimate 64bit Pin
dmihailescu23-Apr-08 4:07
memberdmihailescu23-Apr-08 4:07 
GeneralYou don't check memory allocation in sample code. Pin
CPallini21-Dec-07 6:28
mveCPallini21-Dec-07 6:28 
Questionthis solution not working on vista 64bit with AMD athlon 64bit Pin
swapnil gulhane4-Nov-07 21:25
memberswapnil gulhane4-Nov-07 21:25 
AnswerRe: this solution not working on vista 64bit with AMD athlon 64bit Pin
dmihailescu5-Nov-07 16:14
memberdmihailescu5-Nov-07 16:14 
Questionit will be nice to add also the volume number Pin
albgen23-Jul-07 0:44
memberalbgen23-Jul-07 0:44 
AnswerRe: it will be nice to add also the volume number Pin
albgen23-Jul-07 1:00
memberalbgen23-Jul-07 1:00 
GeneralRe: it will be nice to add also the volume number Pin
dmihailescu24-Jul-07 9:01
memberdmihailescu24-Jul-07 9:01 
GeneralRe: it will be nice to add also the volume number Pin
albgen24-Jul-07 9:17
memberalbgen24-Jul-07 9:17 
QuestionCould anyone please port this code to use in C++ ??? Pin
amach18-May-07 13:24
memberamach18-May-07 13:24 
AnswerRe: Could anyone please port this code to use in C++ ??? Pin
dmihailescu21-May-07 11:01
memberdmihailescu21-May-07 11:01 
GeneralOK, thanks! Now it would be great to achieve it for SCSI... [modified] Pin
amach22-May-07 8:21
memberamach22-May-07 8:21 
NewsRe: OK, thanks! Now it would be great to achieve it for SCSI... Pin
amach25-May-07 7:56
memberamach25-May-07 7:56 
QuestionRe: OK, thanks! Now it would be great to achieve it for SCSI... Pin
Sir.Costy28-May-07 1:58
memberSir.Costy28-May-07 1:58 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Article
Posted 29 Dec 2006

Stats

818K views
57K downloads
178 bookmarked