Еще раз про взаимодействие User-Kernel mode

Тема в разделе "WASM.WIN32", создана пользователем ksu_ant, 6 дек 2005.

  1. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Я попробовал, но доступа получить не смог (т.е. программа, первая открывающая устройство, получает монопольные права на доступ к нему). Один маленький момент: программы открывают разные устройства (т.к. это фильтр), т.е. одна, работающая с оборудованием, открывает физическое устройсво, например - порт, а другая, управляющая драйвером, открывает виртуальное устройство.

    Некоторые технические подробности ситуации с ошибкой совместного доступа.



    Создание устройства и ссылки на него:
    Код (Text):
    1.     status = IoCreateDevice(
    2.         pDriverObj,
    3.         sizeof(DEVICE_EXTENSION),
    4.         &DeviceName,      
    5.         FILE_DEVICE_UNKNOWN,
    6.         0,
    7.         FALSE,
    8.         &pFilterDeviceObj
    9.     );
    10. status = IoCreateSymbolicLink(&SymbolicLinkName, // имя создаваемой символической ссылки
    11.                                 &DeviceName);    // имя устройства


    Также (было использовано в примере, для организации выдачи событий по таймеру) (я думаю, здесь нет ничего,

    влияющего на ситуацию, хотя, - как знать)
    Код (Text):
    1.     KeInitializeDpc(
    2.         &pdx->Dpc, // Dpc
    3.         CustomTimerDPC,         // DeferredRoutine
    4.         pFilterDeviceObj        // DeferredContext
    5.         );
    6.  
    7.     KeInitializeTimer(
    8.         &pdx->Timer  // Timer
    9.         );
    10.     pdx->hEvent = NULL;
    11.     pdx->References = 0L;


    Открываю в программе таким способом:
    Код (Text):
    1.     hDevice = CreateFile(
    2.                 "\\\\.\\MyDrv",                     // Мое устройство
    3.                 GENERIC_READ | GENERIC_WRITE,      
    4.                 FILE_SHARE_READ | FILE_SHARE_WRITE,
    5.                 NULL,                              
    6.                 OPEN_EXISTING,                      
    7.                 FILE_ATTRIBUTE_NORMAL,
    8.                 NULL                                
    9.                 );


    Имеется также код на Delphi
    Код (Text):
    1.   hFile := CreateFile(PChar(DevName),//реальное устройство
    2.     GENERIC_WRITE,
    3.     0,
    4.     nil,
    5.     OPEN_EXISTING,
    6.     FILE_ATTRIBUTE_NORMAL,
    7.     0);


    Если открыть файл, используя нижний код, то попытка открытия моего драйвера программой его управления заканчивается с кодом ошибки (GetLastError()) либо

    - 5 (ERROR_ACCESS_DENIED) (почти всегда), либо - 32 (ERROR_SHARING_VIOLATION). Пробовал открывать и в C, - разницы, естественно, нет.

    Подскажите пожалуйста, в чем моя ошибка при предоставлении доступа к виртуальному устройству сразу нескольким приложениям.
     
  2. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Снова здравствуйте!

    Ошибка ERROR_ACCESS_DENIED возникает, если я пытаюсь дважды открыть драйвер, а ERROR_SHARING_VIOLATION - если, при открытом физическом устройстве попытаться открыть драйвер.

    У меня подозрение на функцию IoInitializeRemoveLock(&pdx->RemoveLock, 0, 0, 0);,

    вызываемую в процедуре добавления устройства, т.к. ее не было в различных исходниках, описывающих ситуации совместного доступа к виртуальному устройству.

    Может быть я ошибаюсь, - пока не проверял.

    Кто что может сказать по поводу ошибки доступа?
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Так ты что, создаешь именованный фильтр, сажаешь его в стек и ещё ему символьную ссылку пристёгиваешь?! Если да, то это в корне неверно. Фильтр должен быть безымянным, а для управления драйвером создается отдельный девайс, называемый в терминологии MS "Control Device Object". Некоторые называют его "Shadow Device Object".



    Интересно как ты обрабатываешь IRP_MJ_CREATE? Как ты распознаешь, что это запрос именно к твоему фильтру?



    Посмотри исходники Toaster'a в ДДК ( \src\general\toaster\filter ).



    ЗЫ: IoInitializeRemoveLock не при чём.
     
  4. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Спасибо.

    Буду разбираться.
     
  5. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Сделал.

    Теперь доступ не блокируется.

    Спасибо большое за Вашу помощь.