Re: WM_SETTINGCHANGE and Explorer

BroadcastSystemMessage is the right way to go but the parameter values are not
correct. Download RAMDisk.exe from
http://users.compaqnet.be/cn021945/RAMDisk/ramdiskfree.htm
and look into RAMDisk.cpp of the RAMDisk.dll

C.

----- Original Message -----
From: “Andrey Subbotin”
Newsgroups: ntdev
To: “Windows System Software Devs Interest List”
Sent: Sunday, September 11, 2005 6:38 PM
Subject: [ntdev] WM_SETTINGCHANGE and Explorer

> Hello all,
>
> Those of you who read this list on a regular basis may have come across
> and remembered my previous posts where I was trying to figure out how to
> do proper drive letter assignments via the Mount Manager in my disk
> driver. Well, this seems to be no longer a question.
>
> What I’m stuck with now is how to make Explorer refresh its My Computer
> view so the newly created drive becomes visible there.
>
> The MSDN states that the DefineDosDevice() function will create a
> symbolic link and then send an appropriate WM_SETTINGCHANGE message to
> all the interested parties. This has proven to work.
>
> The problem is I have been creating the link via the Mount Manager and,
> therefore, all that’s left now is doing a proper notification.
>
> Given that, I have tried different ways to notify the user space apps,
> namely Explorer. But none of them has ever worked. Below comes a little
> code snippet I was trying to use. I would really appreciate any ideas or
> links to some sample code that does the notification.
>
> == 8< == the code snippet goes below == 8< ==
>
> printf(“Sending notify… \n”);
> DWORD_PTR ret;
> SendMessageTimeout(HWND_BROADCAST,
> WM_SETTINGCHANGE,
> 0L,
> (LPARAM) “SYSTEM\MountedDevices”,
> SMTO_ABORTIFHUNG,
> 5000,
> &ret);
> printf(“Done.\n”);
>
> printf(“Second try…\n”);
> SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
> printf(“Done.\n”);
>
> printf(“third try…\n”);
> LPITEMIDLIST pidlMyComputer = NULL;
> SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidlMyComputer);
> SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidlMyComputer, 0L);
> printf(“Done.\n”);
>
> printf(“Fourth try…\n”);
> DEV_BROADCAST_VOLUME hdr;
> hdr.dbcv_devicetype = DBT_DEVTYP_VOLUME;
> hdr.dbcv_flags &= DBTF_MEDIA;
> hdr.dbcv_unitmask = 0xffffffff;
> SendMessageTimeout(HWND_BROADCAST,
> WM_DEVICECHANGE,
> DBT_DEVICEARRIVAL,
> (LPARAM)&hdr,
> SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG,
> 5000,
> &ret
> );
> printf(“Done.\n”);
>
> printf(“Fifth try…\n”);
> BroadcastSystemMessage(BSF_FORCEIFHUNG |
> BSF_IGNORECURRENTTASK |
> BSF_NOTIMEOUTIFNOTHUNG,
> BSM_ALLCOMPONENTS,
> WM_DEVICECHANGE,
> DBT_DEVICEARRIVAL,
> (LPARAM)&hdr
> );
> printf(“Done.\n”);
>
> printf(“Sixth try…\n”);
> BroadcastSystemMessage(BSF_FORCEIFHUNG |
> BSF_IGNORECURRENTTASK |
> BSF_NOTIMEOUTIFNOTHUNG,
> BSM_ALLCOMPONENTS,
> WM_SETTINGCHANGE,
> NULL,
> NULL
> );
> printf(“Done.\n”);
>
> == 8< == the code snippet ends here == 8< ==
>
> I guess the first thing that comes to mind is that I may have created my
> device objects or symlinks somehow wrong, but a simple restart of
> Explorer shows the drive in the My Computer view… so therefore, I
> guess, the device objects and symlinks are created okay. The
> notification doesn’t work though. :-/
>
> –
> Andrey Subbotin
> ICQ UIN: 114087545
> LiveJournal: http://www.livejournal.com/users/e_ploko/
>
> —
> Questions? First check the Kernel Driver FAQ at http://www.osronline.com/article.cfm?id=256
>
> You are currently subscribed to ntdev as: xxxxx@compaqnet.be
> To unsubscribe send a blank email to xxxxx@lists.osr.com
>

Christiaan Ghijselinck wrote:

BroadcastSystemMessage is the right way to go but the parameter
values are not correct. Download RAMDisk.exe from
http://users.compaqnet.be/cn021945/RAMDisk/ramdiskfree.htm
and look into RAMDisk.cpp of the RAMDisk.dll

Thanks, Christiaan. It works like a charm. :slight_smile:


Andrey Subbotin
ICQ UIN: 114087545
LiveJournal: http://www.livejournal.com/users/e_ploko/