Невозможно зарегистрировать события устройства TrueCrypt - PullRequest
0 голосов
/ 06 июня 2011

У меня проблема при попытке использовать функцию 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, то все уши.

1 Ответ

0 голосов
/ 06 июня 2011

Скорее всего, причина в том, что truecrypt отправляет уведомление только в свой собственный сеанс, а ваша служба работает в другом сеансе.В наших продуктах Virtual Storage мы внедрили вспомогательную DLL, которая загружается проводником в каждом сеансе пользователя.Он связывается с кодом монтирования и отправляет широковещательные сообщения далее, в каждом загруженном сеансе.Скорее всего, вам нужно будет сделать что-то подобное.

...