Спасибо за быстрый ответ.
ваша железка нормально эти данные выдает? какую скорость она способна осилить?
если 32Мб запросить - будет на 5 сек зависать?
есть возможность время транзакции чем-то измерить, в железке прошивкой счетчиков и ловушек наставить?
Данные передаются нормально, ошибок не обнаружено.
При 32 МБ задержка 6.45 сек. (судя по принтам в DebugView). (Раньше передавал немного меньше 64 МБ, а зависание длилось немного более 10 сек., так что тут вроде бы всё сходится.)
Как измерить время транзакции на плате не знаю. Могу только обернуть принтами вызов одиночной HAL ф-ции чтения.
StartIO выполняется на Dispatch, но вроде в многоядерном варианте должно только на данном ядре переключение задач блокировать. может так вышло что на этом же ядре принудительно все системное исполняется но вроде не должно. попробуйте тестово на низком IRQL выполнить.
Ф-ция DispatchReadWrite для этого подойдёт? Не уверен, но по-моему она на PASSIVE_LEVEL выполняется.
DriverObject->MajorFunction[IRP_MJ_READ] = DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchReadWrite;
В ней вообще можно напрямую осуществлять запись / чтение без StartIo или в общем случае так лучше не делать (реентерабельность страдает).
Кстати, ф-ция IoStartPacket (которую я пока что использую) вроде бы использует глобальную спин-блокировку. Это случайно не может служить причиной зависания?