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 には、USB、ディスク/ボリューム、HID、および LAN を含む一連のデバイス GUID が保持されます。ちなみに、それらはすべて完全に機能します。

問題は、Windows アプリケーションから WM_DEVICECHANGE を介して通知を受け取ることができるということです。しかし、私のアプリケーションはサービスであるため、そのメッセージを受け取ることができません。

したがって、誰かが以前にこの問題を抱えていた場合、または Windows サービスで TrueCrypt デバイスの通知を取得するための回避策がある場合は、耳を傾けてください。

4

1 に答える 1

0

ほとんどの場合、truecrypt は自身のセッションにのみ通知を送信し、サービスは別のセッションで動作するためです。仮想ストレージ製品では、各ユーザー セッションで Explorer によって読み込まれるヘルパー DLL を実装しました。ロードされた各セッションで、マウンティング コードと通信し、さらにブロードキャストを送信します。ほとんどの場合、同様のことを行う必要があります。

于 2011-06-06T09:21:37.583 に答える