Всем доброго времени суток. Тут возникла проблема с открытием именованного евента, созденного в драйвере, из приложения. Я создаю именованный евент при старте драйвера в контексте модуля smss.exe (пробовал из SYSTEM- без разницы) как: RtlInitUnicodeString(&uEventName,L"\\BaseNamedObjects\\Event_Name"); pReportEvent=IoCreateNotificationEvent(&uEventName,&hEvent); А потом в приложении делаю так: hReportEvent=OpenEvent(SYNCHRONIZE,FALSE,"Global\\Event_Name"); Если запускать приложение как обычно, то без проблем. Если же запускать приложение через Fast User Switching, то евент не открывается, а код ошибки равен пяти (нет доступа). Как можно было бы поправить ситуацию?
А второй юзер админ? Твой эвент создается с дефолтовым дескриптором безопасности в контексте системного потока. Это значит, что он доступен только из под админа и LocalSystem. Вообще, создавать именованный евент в драйвере не рекомендуется. Можно попробовать через ZwCreateEvent, а SECURITY_DESCRIPTOR создать руками. Можешь поиграться с ACL с помощью WinObjEx. Нужно добавить ACE для Everyone или для твоего второго юзера: Свойства евента -> закладка "Безопосность" -> "Добавить" -> дальше разберешься. WinObjEx тут: http://www.wasm.ru/toollist.php?list=21
Да я это знаю. Но у меня выбора нет, мне нужно указывать приложению о событиях, которые могли случиться ещё до того, как моё приложение будет запущено системой. Да и само приложение млжет быть насмерть затерминейчено. Поэтому стандартный способ- создать евент у себя и бросить в драйвер- как-то не складывается. А не подскажешь, чего ему в SECURITY_DESCRIPTOR надо кинуть? А то инфы в Инете- кот наплакал. Когда-то пытался разобраться с этой подсистемой безопасности и мало что понял из тех туторов, что нашёл. Кстати, а можно поправить атрибуты безопасности прямо у объекта евента? Может, так было бы проще?
А ты создай неименованый евент в драйвере (выдели память и сделай KeInitializeEvent), а приложение пусть делает IOCTL запрос, по которому драйвер сформирует и передаст ему хэндл евента (ObOpenObjectByPointer). И не надо будет мучиться с SECURITY_DESCRIPTOR.
Я так пытался сделать (правда, с созданным мною именованным). В результате получилась странного вида рассинхронизация евента и его хендла. То есть, после срабатывания евента и соотв. обработки ему делался KeClearEvent и он переходил в несигнальное положение, но до хендла в приложении оно не доходило, он так и оставался в сигнальном положении, WaitForSingleObject продолжал срабатывать и прога начинала метаться в цикле. Как-то так не въехал я, чего там такого страншного случилось.... Чудеса! Может, я с параметрами вызова ObOpenObjectByPointer чего напортачил?
А надо ли вообще этот геморрой? Если нужно передавать приложению события происходившие до его запуска, то веди в драйвере их список. Как приложение подключается к драйверу и кидает ему хэндл своего евента, то если список не пустой, то драйвер этот евент устанавливает. Я всегда так делаю, и проблем пока еще небыло. P.S. Не забывай проверять, что приложение передало хэндл именно эвента, а не еще чего-либо, иначе баг с безопасностью может быть.
Почему геморрой? Так проще. Просто, видимо, правильные параметры вызова ObOpenObjectByPointer не подобрал. Никто не знает, случайно, как его вызывать для евента?
<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, а придумать другой механизм взаимодействия. _397696521__WorldSidEvent.rar