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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать прерывание выполнения цикла? [DriverStudio]  (Прочитано 8092 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Monsta
Гость
« : 15-10-2004 09:36 » new

Пишу драйвер на NuMega DriverStudio 2.0.
Понадобилось сделать ф-цию, которая в бесконечном цикле производит постоянную запись в память PCI-девайса. Выход из цикла - только по команде от проги, которая обращается к драйверу.
Я хотел сделать в цикле проверку какой-нибудь переменной, но ф-ция на время выполнения "повисает", т.е. не возвращает STATUS_SUCCESS или что-нить такое, а без этого, насколько я понимаю, вызвать из проги во второй раз DeviceIoControl не получится.
Подскажите, может, в драйвере можно создать потоки или что-нить ещё, чтобы цикл выполнялся "на фоне"?
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #1 : 15-10-2004 11:15 » 

Да, присоединюсь к Monsta,  меня тоже интересует можно ли в одной апликашке, в которой я запускаю два потока, в каждом из потоков использовать DeviceIoControl ?
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Серж
Гость
« Ответ #2 : 15-10-2004 12:30 » 

Monsta, конечно, нужно сделать поток, в DriverStudio есть класс KSystemThread, который будет записывать в память и проверять флаг окончания, а обработчик IRP должен будет этот флаг установить.
MOPO3, а почему нет, по-моему, можно.
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #3 : 17-10-2004 10:24 » 

Серж, попробую в понедельник Улыбаюсь сейчас нет под рукой сырцов, да и желания програмить на выходных нет сегодня у меня Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MassarakshI
Гость
« Ответ #4 : 20-01-2005 21:28 » 

Помогите пожалуйста, что я делаю не так:
Один поток вызывают DeviceIoControl. Драйвер принимает IRP помещает его в KDriverManagedQueueEx (не в системную!) и делает его PENDING до прихода прерывания (DPC должна через этот IRP вернуть данные). Второй поток тоже вызывает DeviceIoControl к тому же устройству, но с другим CTL_CODE и несколько раз. IRP от второго потока должны завершаться непосредственно в диспечерской функции, вне зависимости от прерывания (такая проверка состояния устройства). Однако эти IRP до диспечерской функции доходят только тогда, когда завершается IRP от первого потока, который PENDING, причём все сразу. Почему блокируется диспечерская функция, ведь IRP pending в отдельной очереди? Такое впечатление, что IRP от второго потока висят в какой-то очереди, в какой, спрашивается, если драйвер системной очередью не пользуется? Или я что-то не понимаю? DeviceIoControl не OVERLAPPED, может в этом дело?
Driver Studio 3.0beta, W2K Pro sp4, W2K DDK, Visual Studio 6.0

Позднее примкчание: Получилось, действительно вызов DeviceIoControl должен быть OVERLAPPED, тогда всё работает.
« Последнее редактирование: 22-01-2005 11:02 от MassarakshI » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines