I need Pnp guru advice: Win2000 refuses to unload my WDM driver!


I’ve just gotten a WDM driver to successully load via manual installation
using the “Add/Remove Hardware Wizard” and then shut down via manual
selection of the “Uninstall” command in Device Manager under Windows 2000.

My driver’s handling of AddDevice() all the way through the final
IRP_MN_REMOVE_DEVICE seems to go as expected. The Device Manager says I’m
“working properly” after installation and then correctly updates (removes my
device’s icon, etc.) after the uninstall.

However, my driver’s Unload() routine is not called after the uninstall
sequence is complete (after the IRP_MN_REMOVE_DEVICE returns). Instead, my
DRIVER_OBJECT is left sitting in memory always with exactly 4 references.
Isn’t my driver supposed to be unloaded?

It doesn’t seem my other code is somehow leaving those 4 references because
I can run through whole install/uninstall multiple times (with the never
being unloaded of course) and the final DRIVER_OBJECT reference count is
always 4.

I even tried making the Wizard install a new build of the driver, with an
updated VERSIONINFO resource, in the hopes that this would trigger Windows
to unload and “update” the driver, but it didn’t. It just merrily called
the AddDevice() routine of the old (still in-memory) version of the driver.

Why won’t my driver unload? Any idea where these “phantom” references might
be coming from?

  • Matt