Click here to Skip to main content
Click here to Skip to main content

Detecting when drives are added or removed

By , 4 Jul 2007
 

Screenshot - Drive_Detect.jpg

Introduction

This is possibly my smallest article, and just shows a method of detecting when drives are added to or removed from the system. What you do with that information is up to you!

Background

I was answering a question from Akin Ocal yesterday, when Matthew Faithful came up with a much deeper answer than mine.

In a fit of pique / curiosity, I thought I'd come up with a different way of doing what he described, using Windows messages to do the heavy lifting. As I had to do a bit of digging from barely remembered details, I thought I'd share the work with others.

Using the code

I created a blank MFC dialog project, and added a handler for WM_DEVICECHANGE. The MFC handler structure exists, but it could not be added with the Class Wizard, so I typed it in manually.

ON_WM_DEVICECHANGE ()

I then added the actual handler, which does nothing except log the fact that a drive has been added or removed.

BOOL CDriveDetectDlg::OnDeviceChange( UINT nEventType, DWORD dwData )
{
    BOOL bReturn = CWnd::OnDeviceChange (nEventType, dwData);

    DEV_BROADCAST_VOLUME *volume = (DEV_BROADCAST_VOLUME *)dwData;
    CString log;

    if (nEventType == DBT_DEVICEARRIVAL)
    {
        if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
        {
            for (int n = 0; n < 32; n++)
            {
                if (IsBitSet (volume->dbcv_unitmask, n))
                {
                    log.Format ("Drive %c: Inserted\n", n + 'A');
                    m_DetectLog.AddString (log);
                }
            }
        }
    }

    if (nEventType == DBT_DEVICEREMOVECOMPLETE)
    {
        if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
        {
            for (int n = 0; n < 32; n++)
            {
                if (IsBitSet (volume->dbcv_unitmask, n))
                {
                    log.Format ("Drive %c: Removed\n", n + 'A');
                    m_DetectLog.AddString (log);
                }
            }
        }
    }

    return bReturn;
}

As you can see, there's not a vast amount of code for the job.

Updates

  • 27/6/2007 - Little drive icons added next to the drives being added / removed. The credit for steering me in the right direction (and providing some code for me to steal^h^h^h^h^hreuse) goes to dgendreau.
  • 20/6/2007 - Original version posted.

License

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

About the Author

Iain Clarke, Warrior Programmer
Software Developer (Senior)
Sweden Sweden
Member
I have now moved to Sweden for love, and recently married a lovely Swede.
 

-----------------
I started programming on BBC micros (6502) when I was six and never quite stopped even while I was supposed to be studying physics and uni.
 
I've been working for ~13 years writing software for machine control and data analysis. I now work on financial transaction transformation software, for a Software company in Gamlastan, Stockholm.
Look at my articles to see my excellent coding skills. I'm modest too!

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5membermanoj kumar choubey18 Feb '12 - 0:02 
QuestionThis code does exactly what I need but the problem is with the MFC components used in it. I need to write the code in Embarcadero c++ builder, can anybody provide suggestions about how to modify the code?memberlilyNaz25 Oct '11 - 20:15 
AnswerRe: This code does exactly what I need but the problem is with the MFC components used in it. I need to write the code in Embarcadero c++ builder, can anybody provide suggestions about how to modify the code?memberIain Clarke, Warrior Programmer12 Dec '11 - 4:27 
GeneralShame : copy from MSDN ...memberkilt8 Oct '09 - 23:32 
GeneralRe: Shame : copy from MSDN ...mvpIain Clarke, Warrior Programmer13 Oct '09 - 4:31 
QuestionFound a bug on Win2000memberwangk070529 Dec '07 - 2:54 
GeneralRe: Found a bug on Win2000memberIain Clarke1 Feb '08 - 3:55 
GeneralDBT_DEVICEQUERYREMOVE supportmember64BitWho12 Oct '07 - 1:13 
GeneralRe: DBT_DEVICEQUERYREMOVE supportmemberIain Clarke12 Oct '07 - 4:12 
GeneralRe: DBT_DEVICEQUERYREMOVE supportmember64BitWho12 Oct '07 - 4:48 
GeneralRe: DBT_DEVICEQUERYREMOVE supportmember64BitWho13 Oct '07 - 4:23 
QuestionRe: DBT_DEVICEQUERYREMOVE supportmemberMember 43522244 Sep '08 - 2:10 
GeneralRe: DBT_DEVICEQUERYREMOVE supportmemberMember 43522244 Sep '08 - 2:20 
GeneralRe: DBT_DEVICEQUERYREMOVE supportmemberIain Clarke7 Sep '08 - 22:40 
GeneralRe: DBT_DEVICEQUERYREMOVE supportmemberIain Clarke7 Sep '08 - 22:43 
GeneralRe: DBT_DEVICEQUERYREMOVE supportmemberMember 43522247 Sep '08 - 23:52 
JokeRe: DBT_DEVICEQUERYREMOVE supportmemberMember 229365217 Sep '09 - 18:23 
QuestionWM_DEVICECHANGE Ok! But what about Linux?memberPeterShilkin12 Jul '07 - 1:11 
AnswerRe: WM_DEVICECHANGE Ok! But what about Linux?memberIain Clarke14 Jul '07 - 3:53 
GeneralMissing filememberXaRoP4 Jul '07 - 7:08 
GeneralRe: Missing filememberIain Clarke4 Jul '07 - 10:35 
GeneralRe: Missing filememberIain Clarke4 Jul '07 - 22:21 
QuestionWhat about insert devicesmemberVC Spark3 Jul '07 - 2:28 
AnswerRe: What about insert devicesmemberIain Clarke3 Jul '07 - 4:16 
GeneralRe: What about insert devicesmemberVC Spark4 Jul '07 - 2:32 

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

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 5 Jul 2007
Article Copyright 2007 by Iain Clarke, Warrior Programmer
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid