Нотификация подключения USB Flash - проблемка

Тема в разделе "WASM.WIN32", создана пользователем Deyton, 18 окт 2007.

  1. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Необходимо в user-mode получать нотификацию подключения USB Flash.

    Пробую воспользоваться Removable Storage Manager Functions

    Код (Text):
    1.     HANDLE hSession = OpenNtmsSession( NULL, NULL, 0 );
    2.  
    3.     if( hSession != INVALID_HANDLE_VALUE )
    4.     {
    5.         NTMS_NOTIFICATIONINFORMATION ntms_notification;
    6.  
    7.         hNotify = OpenNtmsNotification( hSession, NTMS_DRIVE );
    8.  
    9.         if( hNotify == INVALID_HANDLE_VALUE )
    10.         {
    11.             DWORD error = GetLastError();
    12.             ShowError( L"OpenNtmsNotification", error );
    13.             CloseNtmsSession( hSession );
    14.             return error;
    15.         }
    16.        
    17.         while( wait_notification )
    18.         if( WaitForNtmsNotification( hNotify, &ntms_notification, INFINITE ) == ERROR_SUCCESS )
    19.         {......}
    20.     }
    Работает, но часто и густо, при первом же запуске функция OpenNtmsSession завершается с ошибкой (устройство не готово), и работает когда со второго, а когда и с 5го раза. Как разрулить проблему? Кроме всего прочего, возник вопрос, будет ли это работать на этапе запуска процесса Winlogon? Возможно, кто-то сможет предложить другие варианты, выслушаю.

    [...edit...]
    Кажется кое-что начинаю понимать... если юзать Removable Storage Manager, стартует новый процесс - rsmsink.exe ( Removable Storage Sink Layer ) стартует его svchost.exe... по дефолту этого процесса нету, это обьясняет почему может не заработать с первой попытки... Тем более, очевидно, что при запуске Winlogon не то что svchost-a нету, нету даже services.exe ... прийдется привязывать запуск нотифи-треда к более позднему событию... Но вот проблему с NtmsSession как корректно решить - помогает использование нескольких попыток вызова функции с таймаутом. Но как-то криво это выходит :dntknw: Догадываюсь, что нужно попробовать запустить какую-то службу...

    [...edit...]
    Блин :) ERROR_NOT_READY
    RSM service has not started. The application should wait and retry.

    P.S топик пока не закрываю - может кто еще подскажет способы в user-mode получать нотификацию подключения USB Flash, и к какому событию привязать запуск нотифай треда, чтобы службы гарантированно работали.
     
  2. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Отлавливать broadcast сообщение WM_DEVICECHANGE (с wParam==DBT_DEVICEARRIVAL) ?

    Хотя, учитывая

    этот метод скорее всего не прокатит, но можно попробовать...