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 デバイスの通知を取得するための回避策がある場合は、耳を傾けてください。