Click here to Skip to main content
14,093,423 members
Click here to Skip to main content
Add your own
alternative version

Stats

813K views
56.8K downloads
178 bookmarked
Posted 29 Dec 2006
Licenced CPOL

Get Physical HDD Serial Number without WMI

, 6 May 2008
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

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

You may also be interested in...

Pro

Comments and Discussions

 
Generalerror loading driveinfoex.dll Pin
mano_meee17-Aug-09 22:58
membermano_meee17-Aug-09 22:58 
GeneralRe: error loading driveinfoex.dll Pin
dmihailescu18-Aug-09 13:55
memberdmihailescu18-Aug-09 13:55 
GeneralRe: error loading driveinfoex.dll Pin
Pete Souza IV1-Sep-09 3:59
professionalPete Souza IV1-Sep-09 3:59 
GeneralRe: error loading driveinfoex.dll Pin
InvXeesh11-Nov-10 22:03
memberInvXeesh11-Nov-10 22:03 
Generalit worked on vista for me. Pin
Wendel Renner18-Jun-09 4:01
memberWendel Renner18-Jun-09 4:01 
Questionvista problem Pin
Member 148265329-May-09 21:10
memberMember 148265329-May-09 21:10 
AnswerRe: vista problem Pin
razvar15-Oct-09 2:08
memberrazvar15-Oct-09 2:08 
Questiongiving the .dll a strong name Pin
AKopetzky30-Mar-09 14:05
memberAKopetzky30-Mar-09 14:05 
firstly i want to thank you a lot for sharing your code! it is exactly what i was looking for.

the only thing i can't really figure out, is how to give the .dll a strong name.
i recompiled your project in visual basic 2005.
placing in /keyfile:strongkf.snk /delaydesign and
in "$(FrameworkSDKDir).\Bin\sn.exe" -q -Ra "$(TargetPath)""$(ProjectDir).\strongkf.snk"
works fine so far in XP/2000 but not under Vista.

Exception of HRESULT: 0x80131040

Do you have any ideas on that or any other solution tackling this issue?
I am very much looking forward to your answer!

Thanks a lot!
QuestionRe: giving the .dll a strong name Pin
AKopetzky30-Mar-09 14:07
memberAKopetzky30-Mar-09 14:07 
AnswerRe: giving the .dll a strong name Pin
AKopetzky30-Mar-09 22:31
memberAKopetzky30-Mar-09 22:31 
GeneralReadPhysicalDriveInNTWithZeroRights is the right way Pin
fatass26-Feb-09 11:16
memberfatass26-Feb-09 11:16 
GeneralError Loading DriveinfoEx.dll Pin
Vikash Yadav17-Feb-09 16:43
groupVikash Yadav17-Feb-09 16:43 
GeneralRe: Error Loading DriveinfoEx.dll Pin
dmihailescu18-Feb-09 12:42
memberdmihailescu18-Feb-09 12:42 
GeneralRe: Error Loading DriveinfoEx.dll Pin
Cannoneer19-Jun-09 6:42
memberCannoneer19-Jun-09 6:42 
GeneralRe: Error Loading DriveinfoEx.dll Pin
dmihailescu22-Jun-09 1:43
memberdmihailescu22-Jun-09 1:43 
GeneralRe: Error Loading DriveinfoEx.dll Pin
Pete Souza IV1-Sep-09 3:30
professionalPete Souza IV1-Sep-09 3:30 
GeneralRe: Error Loading DriveinfoEx.dll Pin
InvXeesh11-Nov-10 22:06
memberInvXeesh11-Nov-10 22:06 
QuestionSize of DriveInfoEx.dll... Pin
softwaretry6-Feb-09 1:34
membersoftwaretry6-Feb-09 1:34 
AnswerRe: Size of DriveInfoEx.dll... Pin
dmihailescu6-Feb-09 13:06
memberdmihailescu6-Feb-09 13:06 
GeneralRe: Size of DriveInfoEx.dll... Pin
softwaretry16-Feb-09 7:10
membersoftwaretry16-Feb-09 7:10 
GeneralRe: Size of DriveInfoEx.dll... Pin
dmihailescu18-Feb-09 12:44
memberdmihailescu18-Feb-09 12:44 
AnswerRe: Size of DriveInfoEx.dll... Pin
Vikash Yadav16-Feb-09 21:04
groupVikash Yadav16-Feb-09 21:04 
Generalnot able to use the DriveInfoEx.dll in c# Pin
Ravi Tejas23-Jan-09 1:26
memberRavi Tejas23-Jan-09 1:26 
GeneralRe: not able to use the DriveInfoEx.dll in c# Pin
dmihailescu23-Jan-09 12:50
memberdmihailescu23-Jan-09 12:50 
QuestionVisual Studio 2008 shows errors... Pin
softwaretry19-Jan-09 6:46
membersoftwaretry19-Jan-09 6:46 

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.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web05 | 2.8.190518.1 | Last Updated 6 May 2008
Article Copyright 2006 by dmihailescu
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid