From: PhilG on
Hello,

I'm trying to activate custom device notification between a kernel mode
driver
and a user application. As stated on the subject line, my call to
RegisterDeviceNotification fails with code 1066,
ERROR_SERVICE_SPECIFIC_ERROR.
Here's the code.

DEV_BROADCAST_HANDLE notifyFilter = { 0 };
notifyFilter.dbch_size = sizeof notifyFilter;
notifyFilter.dbch_handle = devHdl; // from CreateFile call with driver
name
notifyFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
itsDevNotifyHdl = RegisterDeviceNotification(m_hWnd, &notifyFilter,
DEVICE_NOTIFY_WINDOW_HANDLE); // returns 0, GetLastError() = 1066

Not much explanation on this error in the MSDN (or WDK) so I searched the
web.
There are many posts related to this very same problem, but offered answers
fall into two
categories: 1. No answer; 2. use DEV_BROADCAST_DEVICEINTERFACE
(DBT_DEVTYPE_DEVICEINTERFACE).

Unfortunately, I cannot use DEV_BROADCAST_DEVICEINTERFACE because I need the
DBT_CUSTOMEVENT-only flelds in DEV_BROADCAST_HANDLE.

Ironically, I've gotten this to work before in an earlier version of this
driver
(for a legacy ISA board) based on the old Driver::Works framework. The driver
I'm developing now is a straight WDM driver (not KMDF) for a PCI card. The
basic
driver came with the board kit. It did not have a IRP dispatch routine for
IRP_MJ_SYSTEM_CONTROL,
but I added one because ERROR_SERVICE_SPECIFIC_ERROR seems to be related
mainly
to the WMI classes. That hasn't made a difference.

Any clues out there as to why RegisterDeviceNotification would fail with
ERROR_SERVICE_SPECIFIC_ERROR?

Thanks,

Phil