Приветствую всех!
пишу первый драйвер для PCI-железки в среде WDF, драйвер выполняет всё, что от него требуется, но есть одна ситуация, наилучшее решение которой я пока не придумал и хочу спросить совета у бывалых.
кратко об окружении
железка производит ввод/вывод через ReadFile/WriteFile и конфигурится через DeviceIoControl. железку нежелательно, хотя и можно переконфигурировать, если она выполняет какую-либо операцию обмена, а операции чтения и записи строго последовательно, т.к. только на плате только один канал DMA. ввиду указанных фактов единственная очередь запросов проинициализирована как sequential. сам драйвер имеет некоторые счётчики внутри себя, которые мне необходимо регулярно читать. делаю я это через DeviceIoControl.
о проблеме
если имеется постоянный приём железкой из канала данных, возврат из ReadFile происходит при завершении операции копирования данных из платы в ОЗУ ПК, а если данных в линии нет, запрос не будет завершён до тех пор, пока не придут данные. и в этом случае я лишаюсь возможности считывать счётчики из драйвера: ioctl запрос заблокирован, пока не закончится read. ioctl-запросы, относящиеся только к драйверу, необходимо обрабатывать даже при незавершённых запросах к самой железке. я пробовал делать очередь parallel, пробовал делать две sequential очереди, в одну указывал обработчик EvtDeviceControl, в другую EvtIoRead и EvtIoWrite. но WDF не настолько умная и мои неправильные просьбы не понимает: при наличии незавершённого запроса read в случае одной параллельной очереди всё равно приостанавливается выполнение ioctl-запросов. а (видимо неверная) попытка объяснить, что я хочу две очереди, приводит к тому, что запросы read/write вообще отвергаются.
собственно, как бы мне сделать наиболее корректно обработку запросов, относящихся к самому драйверу (только ioctl), но не железке: нужно, чтобы они обрабатывались всегда, а запросы к железке (ioctl, read, write) помещались в последовательную очередь как обычно? сегодня с утра родился вариант, но я его ещё не пробовал, и не знаю, насколько оно корректно/реализуемо: default-очередь драйвера инициализируется как параллельная, указывается единственный обработчик EvtIoDefault, который смотрит, что за запрос пришёл, и по типу/коду запроса решает, завершить запрос сейчас, т.к. это запрос к драйверу, или поместить запрос во вторую очередь (последовательную). вторая очередь будет инициализирована с обработчиками EvtDeviceControl, EvtIoRead, EvtIoWrite, которые выполняют только работу с моей железкой. так можно?

или даже нужно?) в документации к WDK именно такая ситуация не расписана, там делят самым обычным способом (+ указание, какие события ловить) на 3 очереди: wdfQueueIoctl, wdfQueueRead, wdfQueueWrite, а мне же нужно обязательно совместить в одну последовательную очередь запросы на чтение и запись. указанным в документашке способом нельзя указать сбор запросов сразу двух типов, т.к. они не битовая маска, а последовательно пронумерованные значения(
заранее спасибо всем откликнувшимся,
с уважением, Богдан