Прежде чем я перейду к своему вопросу, я расскажу, над чем я сейчас работаю, чтобы у вас было хорошее представление о том, что я уже сделал/пробовал.
У меня есть многопоточное пользовательское приложение Windows Desktop, которое отправляет вызовы DeviceIOControl драйверу KMDF (чисто программное обеспечение, без оборудования). Существует 5 отдельных потоков, которые постоянно выполняют один и тот же пользовательский вызов IOCTL к драйверу. Этот запрос состоит из:
- PsLookupProcessByProcessId, чтобы процесс считывал память.
- MmCopyVirtualMemory для копирования запрошенной памяти в предоставленный буфер.
- ObDereferenceObject для уменьшения счетчика ссылок.
Драйвер в настоящее время делает это последовательно, и основным узким местом в моем приложении пользовательского режима является ожидание завершения чтения памяти, и все должно быть завершено, прежде чем сцена может быть «отрисована».
Я максимально уменьшил количество запросов DeviceIOControl, поэтому теперь я изучаю перекрывающиеся операции ввода-вывода и разрешаю каждому потоку отправлять запросы асинхронно. Мой вопрос в том, стоит ли это вообще пытаться, так как я не знаю, могу ли я использовать несколько потоков в своем драйвере для одновременного чтения с разных адресов.
The driver is currently doing this serially
- так ты используешьWdfIoQueueDispatchSequential
? почему неWdfIoQueueDispatchParallel
? - person RbMm   schedule 09.02.2017FILE_FLAG_OVERLAPPED
(или безFILE_SYNCHRONOUS_IO_[NO]NALERT
). водитель со своей стороны должен использовать тип очередиWdfIoQueueDispatchParallel
- person RbMm   schedule 09.02.2017