Как узнать открыто ли было устройство?
От: Serega41  
Дата: 19.03.07 19:30
Оценка:
Скажите, как узнать, что устройство было открыто с помощью CreateFile, скажем, в другом процессе.
Т.е. вызываю я в одном процессе нечто подобное:
CreateFile('\\.\GpdDev', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);

Как мне узнать в другом процессе, что GpdDev уже открыт?
Re: Как узнать открыто ли было устройство?
От: Аноним  
Дата: 19.03.07 20:19
Оценка:
ZwQueryObject/ObjectBasicInformation HandleCount
Но смею предположить что то что вы задумали — кривохак, и делать это надо по другому.
Re[2]: Как узнать открыто ли было устройство?
От: Serega41  
Дата: 19.03.07 21:05
Оценка:
Ну почему сразу кривохак )
Задача такая:
Одно приложение открывает устройство1 и полноценно работает с ним.
Второе запущенное приложение должно определить, что устройство1 занято и подключиться к следующему, если такое существует, иначе написать сообщение о недоступности свободных устройств.
Уверен, что это как-то несложно решается, но вот что-то в голову ничего простого не приходит, кроме как завести что-то типа map-файла и помечать устройства.

Может у вас есть какие-то дельные мысли по этому поводу?)
Re[3]: Как узнать открыто ли было устройство?
От: Аноним  
Дата: 19.03.07 22:45
Оценка:
S>Может у вас есть какие-то дельные мысли по этому поводу?)
1) Немного недокументированно но быстро: поставить Exclusive в TRUE в IoCreateDevice в драйвере
2) Ввести в драйвере проверку SHARE_ACCESS флагов и возвращать STATUS_SHARING_VIOLATION в IRP_MJ_CREATE как делают все нормальные пацаны.
Re[4]: Как узнать открыто ли было устройство?
От: Аноним  
Дата: 26.03.07 13:58
Оценка:
О! спасибо!
Но я уже обошелся своим счетчиков в драйвере) Тем более, если он будет эксклюзивным, я не получу к нему доступ, чтобы считать с него информацию, если он уже будет открыт.

Вопрос вдогонку)
А случайно не знаете как реальные пацаны получают в драйвере DeviceID PCI карточки?
Re[5]: Как узнать открыто ли было устройство?
От: Alter_ Украина http://alter.org.ua
Дата: 26.03.07 18:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос вдогонку)

А>А случайно не знаете как реальные пацаны получают в драйвере DeviceID PCI карточки?

Вы имеете ввиду это ?
HalGetBusData(PCIConfiguration, ...)
--
Alter, http://alter.org.ua
Re[6]: Как узнать открыто ли было устройство?
От: Аноним  
Дата: 26.03.07 19:30
Оценка: 3 (1)
Да, именно! Я уже нашел)
Если кому то интересно, делается это так:
ULONG BusNumber, propertyAddress, length;
USHORT FunctionNumber, DeviceNumber, DeviceID;
PCI_COMMON_CONFIG PCIDeviceConfig;

IoGetDeviceProperty(
    PhysicalDeviceObject,
    DevicePropertyBusNumber,
    sizeof(ULONG),
    (PVOID)&BusNumber,
    &length
    );
IoGetDeviceProperty(
    PhysicalDeviceObject,
    DevicePropertyAddress,
    sizeof(ULONG),
    (PVOID)&propertyAddress,
    &length
    );
FunctionNumber = (USHORT)((propertyAddress) & 0x0000FFFF);
DeviceNumber = (USHORT)(((propertyAddress) >> 16) & 0x0000FFFF);
HalGetBusData(
    PCIConfiguration,
    BusNumber,
    DeviceNumber | (FunctionNumber << 5),
    &PCIDeviceConfig,
    sizeof(PCIDeviceConfig)
    );
DeviceID = PCIDeviceConfig.DeviceID;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.