Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема: разделение доступа к драйверу  (Прочитано 9043 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Gas
Гость
« : 08-10-2003 12:17 » 

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

Пробовал менять флаги Sharing в CreateFile:

hDev=CreateFile ( SymLink, (ReadOnly)? GENERIC_READ :GENERIC_WRITE,
                      FILE_SHARE_READ,
                      (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      (HANDLE)NULL );

При этом Несколько приложений спокойно открывают драйвер и на запись, и на чтение! (При испытаниях на локальном файле вместо драйвера sharing работает нормально).

Может подскажете, где копать?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 08-10-2003 12:45 » 

Так это надо самому в обработчике IRP_MJ_CREATE сделать- смотри с какими правами пытаются создать handle на драйвер и решай- разрешать или нет. То есть если уже один открыл на запись- больше никому не разрешать на запись открывать. А в IRP_MJ_CLOSE/IRP_MJ_CLEANUP смотреть кто закрылся. Помни, что IRP_MJ_CLEANUP идет в контексте процесса, его открывшего, а IRP_MJ_CLOSE в произвольном контексте.
Записан
Gas
Гость
« Ответ #2 : 09-10-2003 06:30 » 

Спасибо за совет!
Попытался я так сделать, но почему-то не получилось.

в обработчике  IRP_MJ_CREATE:

PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
PFILE_OBJECT fop = stack->FileObject;
if (fop->ReadAccess) .....
if (fop->WriteAccess) .....

так вот, при любом доступе эти поля равны FALSE Жаль(
При этом они еще и в DDK не описаны - откопал в wdm.h
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 09-10-2003 08:08 » 

Не FALSE, а ноль.  С чего ты их там ищешь. Вот тут их смотри
stack->Parameters.Create.SecurityContext->DesiredAccess
READ_ACCESS
WRITE_ACCESS
Записан
Gas
Гость
« Ответ #4 : 10-10-2003 07:35 » 

Ура! Все заработало!
Огромное спасибо!

Мне вот только интересно,  где вы все это прочитали? В DDK из описания IRP_MJ_CREATE ничего не узнать Жаль
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 10-10-2003 07:57 » 

Цитата

Мне вот только интересно, где вы все это прочитали? В DDK из описания IRP_MJ_CREATE ничего не узнать


Сам уже не помню. Глянул на код одного из своих драйверов, где это делал, и написал.
Записан
maaaaaad
Гость
« Ответ #6 : 10-10-2003 15:55 » new

Можно догадаться по названию=))
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines