Спасибо за своевременный и точный ответ!
не понял - зачем RtlMoveMemory а не RtlCopyMemory?
Вкурил маны. Принимается: она должна быть быстрее и мне заведомо не нужны особенности MoveMemory.
Теперь о том, как реализовал и с чем столкнулся.
-------
Инициализировал в AddDevice:
KeInitializeMutex(&fdoData->WriteMutex, 0);
В обработчике IRP_MJ_WRITE написал:
Диагностика ("начало ожидания лока");
status = KeWaitForSingleObject(&FdoData->WriteMutex, Executive, KernelMode, FALSE, NULL);
Диагностика ("лок занят");
// действия с памятью DMA
// отмашка девайсу "бери память и шли"
В отложенном обработчике прерывания "окончания записи" написал:
Диагностика ("(DPC) освобождение лока");
result= KeReleaseMutex(&fdoData->WriteMutex, FALSE);
-------
В итоге получил не совсем корректное поведение.
Девайс реализует что-то вроде сети. Прерывание выставляет после того, как отправил кадр в сеть. Кадр отправляется только когда девайс "на другом конце" включает приёмник.
В случае, когда запись ведётся в готовую для этого среду (кабель подключен, девайс на другом конце готов принимать) - всё работает как надо. Вижу диагностические сообщения "начало ожидания лока", "лок занят", "(DPC) освобождение лока".
Когда пишу в момент "неготовности" среды (выдёргиваю кабель) - получается корявство.
1. Делаю первую отправку кадра из юзерского приложения.
1.1. Вижу "начало ожидания лока"
1.2. Вижу "лок занят".
1.3. Не вижу "(DPC) освобождение лока"
Всё как надо, ибо прерывание не возникает (девайс слать не может), лок освобождаться не должен и должен висеть в занятом состоянии.
2. Делаю вторую отправку кадра из юзерского приложения.
2.1. Вижу "начало ожидания лока"
2.2. Вижу "лок занят"
ПОЧЕМУ? Ведь мы его уже заняли на первом шаге. WaitForSingleObject не должен отдавать управление коду дальше, пока лок не освободится!
2.3. Приложение пользователя не висит и снова готово слать. Ожидал, что застынет.
3. Совсем странно. Втыкаю кабель (фактически - тут же получаю прерывание).
3.1. Вижу бсод STOP: 0x008E (C0000046, 80502D11, FC8D7BD4, 00000000)
Собственно, отчего WaitForSingleObject не застывает??? Может быть, надо вызывать его с таймаутом (я NULL передавал, думая, что это бесконечность)?
Ну и откуда BSOD при вызове ReleaseMutex???