0

我在尝试使用 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。顺便说一句,它们都工作得很好。

问题是,我可以从 Window 应用程序通过 WM_DEVICECHANGE 获得通知。但是由于我的应用程序是一项服务,因此我无法收到该消息。

因此,如果有人之前遇到过这个问题,或者如果有办法在 Windows 服务中获取 TrueCrypt 设备通知,我会全力以赴。

4

1 回答 1

0

最可能的原因是 truecrypt 仅将通知发送到它自己的会话,并且您的服务在不同的会话中工作。在我们的虚拟存储产品中,我们实现了一个由 Explorer 在每个用户会话中加载的帮助 DLL。它与安装代码通信并在每个加载的会话中进一步发送广播。您很可能需要做类似的事情。

于 2011-06-06T09:21:37.583 回答