У меня проблема при попытке использовать функцию Windows RegisterDeviceNotification для регистрации уведомлений для дисков TrueCrypt.Мой код является службой Windows, и часть регистрации выглядит следующим образом:
TCHAR volumePath[MAX_PATH];
_stprintf( volumePath, _T("\\\\.\\%c:"), (*lpcDrive));
//Create File and add notification
HANDLE hDevice = CreateFile( volumePath,
GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL );
if (hDevice == INVALID_HANDLE_VALUE)
{
bResult=FALSE;
goto end;
}
DEV_BROADCAST_HANDLE filter = {0};
filter.dbch_size = sizeof(filter);
filter.dbch_devicetype = DBT_DEVTYP_HANDLE;
filter.dbch_handle = hDevice;
filter.dbch_hdevnotify = RegisterDeviceNotification(m_hStatus, &filter, DEVICE_NOTIFY_SERVICE_HANDLE);
Путь к тому на диске truecrypt: "\\. \ M:" дескриптор m_hStatus - это дескриптор, который я получаю, когдазарегистрировать мой обработчик элемента управления, используя RegisterServiceCtrlHandlerEx.и его действительный дескриптор.
Дескриптор файла также действителен, однако при вызове RegisterDeviceNotification возвращает NULL.Теперь я не уверен, почему он не регистрируется правильно, так как все другие диски / устройства регистрируются успешно.Я искал в Интернете решение этой проблемы, но ничего не смог найти.Я не уверен, что проблема в типе устройства, но я просмотрел код TrueCrypt, и кажется, что они регистрируют свое подключенное устройство как DBT_DEVTYP_VOLUME.
Все необходимые типы устройств регистрируются при запуске службы с использованиемследующий код:
HANDLE hDevNotify = new HDEVNOTIFY[sizeof(GUID_DEVINTERFACE_LIST)/sizeof(GUID)];
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
for(int i=0; i<sizeof(GUID_DEVINTERFACE_LIST)/sizeof(GUID); i++)
{
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
hDevNotify[i] = RegisterDeviceNotification(h,&NotificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE);
}
GUID_DEVINTERFACE_LIST содержит набор GUID устройств, включая USB, диски / тома, HID и LAN.Кстати, все они отлично работают.
Дело в том, что из приложения Windows я могу получить уведомление через WM_DEVICECHANGE.Но так как мое приложение является службой, я не могу получить это сообщение.
Так что, если у кого-то была эта проблема раньше или если есть обходной путь для получения уведомлений устройства TrueCrypt в службе Windows, то все уши.