Click here to Skip to main content
12,635,398 members (24,616 online)
Click here to Skip to main content
Add your own
alternative version


176 bookmarked

Get Physical HDD Serial Number without WMI

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

Sample Image - DriveInfo.png


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.


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();
//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;
      WORD* diskdata = new WORD[256];
  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 archive, since they are 32 bit for Windows XP.


  • 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.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

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

You may also be interested in...

Comments and Discussions

Questionmac add, ip add, motherboard serial no, processor, local drive Pin
Praveen S22-Jul-12 21:38
memberPraveen S22-Jul-12 21:38 
GeneralMy vote of 5 Pin
Nox PasNox11-May-12 5:43
memberNox PasNox11-May-12 5:43 
Answeranother method Pin
y_sir10-May-12 0:06
membery_sir10-May-12 0:06 
GeneralMy vote of 5 Pin
Amir Dashti16-Feb-12 5:08
memberAmir Dashti16-Feb-12 5:08 
QuestionHow to get HDD Device Driver without WMI? Pin
Holt24517-Dec-11 16:29
memberHolt24517-Dec-11 16:29 
Question[My vote of 1] Code from WinSim Inc. Pin
_DiZ29-Nov-11 7:45
member_DiZ29-Nov-11 7:45 
AnswerRe: [My vote of 1] Code from WinSim Inc. Pin
dmihailescu29-Nov-11 17:14
memberdmihailescu29-Nov-11 17:14 
GeneralMy vote of 2 Pin
zomorrod.company14-Nov-11 2:18
memberzomorrod.company14-Nov-11 2:18 
this do not work in C# 4.
and have error in win7
GeneralRe: My vote of 2 Pin
dmihailescu29-Nov-11 17:19
memberdmihailescu29-Nov-11 17:19 
QuestionDrive letter Pin
edy_3dz9-Aug-11 11:04
memberedy_3dz9-Aug-11 11:04 
Generaldriveinfoex.dll requires administrator rights in win 7 - how to solve it Pin
nileshrajkot22-Apr-11 21:38
membernileshrajkot22-Apr-11 21:38 
GeneralMy vote of 4 Pin
nileshrajkot22-Apr-11 21:34
membernileshrajkot22-Apr-11 21:34 
GeneralVery nice............It has get me out of My very hard problem....... Pin
Pritesh Aryan15-Apr-11 3:30
memberPritesh Aryan15-Apr-11 3:30 
GeneralSorry, i'm a noob Pin
blthbllala18-Jan-11 12:17
memberblthbllala18-Jan-11 12:17 
GeneralMy vote of 2 Pin
Member 164379218-Dec-10 6:01
memberMember 164379218-Dec-10 6:01 
GeneralRe: My vote of 2 Pin
dmihailescu29-Nov-11 17:21
memberdmihailescu29-Nov-11 17:21 
GeneralSerial ID RAID Pin
big_buka12-Dec-10 22:13
memberbig_buka12-Dec-10 22:13 
Generalworks with Win7 x86 not working with xp Pin
Member 437972011-Nov-10 2:46
memberMember 437972011-Nov-10 2:46 
GeneralRe: works with Win7 x86 not working with xp Pin
nethsu28-Nov-10 22:54
membernethsu28-Nov-10 22:54 
GeneralREAL Hard disk serial number Pin
hingman3-Nov-10 21:50
memberhingman3-Nov-10 21:50 
GeneralRe: REAL Hard disk serial number Pin
DizZ11-Jan-11 4:54
memberDizZ11-Jan-11 4:54 
GeneralRe: REAL Hard disk serial number Pin
hingman11-Jan-11 17:38
memberhingman11-Jan-11 17:38 
GeneralMy vote of 5 Pin
Archit937328444829-Oct-10 20:33
memberArchit937328444829-Oct-10 20:33 
GeneralUnable to run on 64 bit Pin
ilke ALTINPULLUK26-Oct-10 5:12
memberilke ALTINPULLUK26-Oct-10 5:12 
Questioncan we write this with c sharp Pin
nethsu25-Oct-10 0:47
membernethsu25-Oct-10 0:47 

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.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.161208.2 | Last Updated 6 May 2008
Article Copyright 2006 by dmihailescu
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid