Открытие евента, созданного в драйвере, из приложения по имени.

Тема в разделе "WASM.WIN32", создана пользователем rav, 27 авг 2005.

  1. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Всем доброго времени суток.



    Тут возникла проблема с открытием именованного евента, созденного в драйвере, из приложения. Я создаю именованный евент при старте драйвера в контексте модуля smss.exe (пробовал из SYSTEM- без разницы) как:

    RtlInitUnicodeString(&uEventName,L"\\BaseNamedObjects\\Event_Name");

    pReportEvent=IoCreateNotificationEvent(&uEventName,&hEvent);



    А потом в приложении делаю так:



    hReportEvent=OpenEvent(SYNCHRONIZE,FALSE,"Global\\Event_Name");



    Если запускать приложение как обычно, то без проблем. Если же запускать приложение через Fast User Switching, то евент не открывается, а код ошибки равен пяти (нет доступа). Как можно было бы поправить ситуацию?
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    А второй юзер админ? Твой эвент создается с дефолтовым дескриптором безопасности в контексте системного потока. Это значит, что он доступен только из под админа и LocalSystem. Вообще, создавать именованный евент в драйвере не рекомендуется.



    Можно попробовать через ZwCreateEvent, а SECURITY_DESCRIPTOR создать руками. Можешь поиграться с ACL с помощью WinObjEx. Нужно добавить ACE для Everyone или для твоего второго юзера: Свойства евента -> закладка "Безопосность" -> "Добавить" -> дальше разберешься. WinObjEx тут: http://www.wasm.ru/toollist.php?list=21
     
  3. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва




    Да я это знаю. Но у меня выбора нет, мне нужно указывать приложению о событиях, которые могли случиться ещё до того, как моё приложение будет запущено системой. Да и само приложение млжет быть насмерть затерминейчено. Поэтому стандартный способ- создать евент у себя и бросить в драйвер- как-то не складывается.







    А не подскажешь, чего ему в SECURITY_DESCRIPTOR надо кинуть? А то инфы в Инете- кот наплакал. Когда-то пытался разобраться с этой подсистемой безопасности и мало что понял из тех туторов, что нашёл. Кстати, а можно поправить атрибуты безопасности прямо у объекта евента? Может, так было бы проще?
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    А ты создай неименованый евент в драйвере (выдели память и сделай KeInitializeEvent), а приложение пусть делает IOCTL запрос, по которому драйвер сформирует и передаст ему хэндл евента (ObOpenObjectByPointer).

    И не надо будет мучиться с SECURITY_DESCRIPTOR.
     
  5. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва




    Я так пытался сделать (правда, с созданным мною именованным). В результате получилась странного вида рассинхронизация евента и его хендла. То есть, после срабатывания евента и соотв. обработки ему делался KeClearEvent и он переходил в несигнальное положение, но до хендла в приложении оно не доходило, он так и оставался в сигнальном положении, WaitForSingleObject продолжал срабатывать и прога начинала метаться в цикле. Как-то так не въехал я, чего там такого страншного случилось.... Чудеса! Может, я с параметрами вызова ObOpenObjectByPointer чего напортачил?
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    А надо ли вообще этот геморрой?

    Если нужно передавать приложению события происходившие до его запуска, то веди в драйвере их список.

    Как приложение подключается к драйверу и кидает ему хэндл своего евента, то если список не пустой, то драйвер этот евент устанавливает. Я всегда так делаю, и проблем пока еще небыло.



    P.S. Не забывай проверять, что приложение передало хэндл именно эвента, а не еще чего-либо, иначе баг с безопасностью может быть.
     
  7. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва




    Почему геморрой? Так проще. Просто, видимо, правильные параметры вызова ObOpenObjectByPointer не подобрал. Никто не знает, случайно, как его вызывать для евента?
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ rav</font><!--color--><font color="gray]: А не подскажешь, чего ему в SECURITY_DESCRIPTOR надо кинуть? ]</font><!--color-->



    Подскажу - см. аттач. Тестил только под w2k+sp4 и ничего не гарантирую.





    <font color="gray][ rav</font><!--color--><font color="gray]: Кстати, а можно поправить атрибуты безопасности прямо у объекта евента? Может, так было бы проще? ]</font><!--color-->



    Как это не странно проще создать заново. Если приложение всё равно подключается к драйверу, то правильнее будет не париться с SD, а придумать другой механизм взаимодействия.

    [​IMG] _397696521__WorldSidEvent.rar