вообще говоря... не пробовал, но подозреваю что никто не мешает и две DPC очереди сделать.
Таки вычитал в У.Они. Можно сделать дополнительный DPC, кроме "бесплатного", даваемого сразу. Для создания надо сделать KeInitializeDpc, а для её планирования изнутри ISR - вызвать KeInsertQueueDpc.
Если я правильно понимаю, очередь DPC - она всё равно одна. Просто станет два "типа" DPC, которые можно добавлять в очередь, а доселе был один "тип".
но опять же - остается шанс что при ДЕЙСТВИТЕЛЬНО быстрой передаче, позникнет две пары ISR на 2чтения и 2 записи. прежде, чем выполнится DPC?
Нет. Именно в DPC я разрешаю снова колбасить прерывания: активизирую приёмник или передатчик железки. Таким образом, пока не закончится DPC, вызванное чтением, не дёрнется ISR чтения. И пока не закончится DPC, вызванное записью - не дёрнется ISR записи. Таким образом, до выполнения DPC может произойти строго или 1, или 2 ISR. Раньше предполагал, что только 1...
если такое гарантированно не произойдет... можно просто обойтись внешней структуркой с двумя флагами:
в ISR R/W флаги взводить путем ExInterlockedXXX. в DPC - сбрасывать так же. а DPC использовать одно.
Это на первый взгляд грозит нестабильностью. Надо подумать...
DPC исчезает из очереди прямо перед моментом её вызова. То есть, похоже, возможны случаи, когда проверка флага ничего не даст.
насчет "Тогда что совать в параметры IoInitializeDpcRequest при старте устройства?" - а раньше вы что туда совали?))))
PS а зачем вы вообще DPC используете?)
Что совать - это я выяснил уже, в начале поста "сам себе" написал
IoInitializeDpcRequest - применяет "бесплатный" DPC. Для заведения дополнительного - другие функции.
В общем, буду пробовать заводить два DPC и один ISR. Это кажется самым правильным подходом.
А зачем использую DPC - вроде уже пояснил. На нём я работаю с очередями IRP, копирую DMA в буфер пользователя, включаю приёмник и т.п, то есть делаю действия, которые нельзя или не следует делать на ISR.