Перехват отмены IRP

Тема в разделе "WASM.NT.KERNEL", создана пользователем vasalvit, 30 мар 2010.

  1. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Здравствуйте.

    Ситуация следующая. Есть устройство. 'Общение' с ним происходит в три этапа:
    1. посылается команда
    2. посылаются/принимаются данные
    3. принимается состояние команды

    Эту последовательность прерывать нельзя. Т.е. при получении команды нужно ждать, пока не завершится предыдущая команда.

    Я завёл событие (synchronization event), которое находится в сигнальном состоянии, когда команду можно отправлять.

    При получении команды я жду по этому событию:
    Код (Text):
    1. KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
    После обработки статуся, я сигналю этим событием:
    Код (Text):
    1. KeSetEvent(&Event, IO_NO_INCREMENT, FALSE);
    Проблема в том, что приложение может захотеть отменить свой запрос, но т.к. идёт ожидание по событию - приложение 'повиснет'.

    Идея такая. Я хочу завести ещё одно событие (Cancelled). Это событие (по идее) должно устанавливаться при отмене IRP. А я буду ждать по двум событиям - Event и Cancelled.

    Как правильно реализовать такой алгоритм ?

    Я подразумеваю, что надо устанавливать IoSetCancelRoutine и в ней сигналить. Или нужно как-то по-другому реагировать?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Если общение с драйвером осуществляется посредством отправки ему определённых IRP, то да, ты идёшь в правильном направлении.
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Так ли необходимо второй эвент?