В статье Four-F'а "Драйверы режима ядра: Часть 14: Базовая техника. Синхронизация: Использование объекта" (http://www.wasm.ru/article.php?article=drvw2k14) упоминается возможность асинхронного вызова DeviceIoControl с помощью механизма OVERLAPPED, но, к сожалению, не рассматривается подробно. Написано только, что: "Получив такой запрос, драйвер откладывает его завершение до тех пор, пока не произойдет ожидаемое событие и возвращает STATUS_PENDING. На стороне режима пользователя вызов DeviceIoControl возвращает ошибку ERROR_IO_PENDING и поток должен ждать на объекте "событие". Когда происходит ожидаемое событие, драйвер завершает IRP и сигнализирует об этом пользовательскому потоку, освобождая объект "событие". При этом драйвер должен быть готов к тому, что ему придется обрабатывать несколько таких IRP. Т.е. он должен организовать очередь запросов ввода-вывода ожидающих завершения." Где можно посмотреть пример кода такого драйвера, или хотя бы подробное описание, как его правильно построить? Буду благодарен за любую информацию .
DDK\src\general\cancel Для очереди используется Cancel-Safe IRP Queue, но это не принципиально, хотя и удобно. Можно и любую другую. См в DDK "Driver-Managed IRP Queues".