Кто открыл/закрыл драйвер?

Тема в разделе "WASM.WIN32", создана пользователем CRA, 31 окт 2006.

  1. CRA

    CRA New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    6
    Добрый день!

    Можно ли в обработчиках IRP_MJ_CREATE (IRP_MJ_CLOSE) в драйвере идентифицировать (или дифференцировать, т.е. различать) приложение, которое вызвало этот create/close? В частности нужно знать, МОЁ ли приложение закрыло драйвер.

    Вообще наблюдаю такую картину: менеджер ввода вывода ИНОГДА открывает драйвер, шлёт ему несколько ioctl и закрывает его. IRP_MJ_READ и IRP_MJ_WRITE могут быть переданы драйверу и без его предварительного открытия (счетчик открытий == 0). Драйвер под XP.

    Вижу несколько решений, например установленный флаг в реестре перед открытием драйвера моим приложением с последующим запретом открытия драйвера, но может быть есть более красивые решения?
     
  2. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    ирпы приходят в контексте вызыващего их процесса, т.е. поток, делая CreateFile, в конечном счете переходит в режим ядра. Идентифицируй по PID.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    PsGetCurrentProcess
     
  4. CRA

    CRA New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    6
    Спасибо за идею!

    Сперва попробовал идентифицировать приложение по PsGetCurrentProcessId, действительно значение хэндла совпадает со значением, возврааемым GetCurrentProcessId в приложении. Но как проще всего сообщить драйверу, что именно этот IRP пришел от моего приложения? Можно, конечно явно собщить драйверу хендл процеесса приложения, но я попытался найти способ идентифицировать приложение по IRP. В IRP есть поле Tail.Overlay.Thread, в котором сохраняется указатель на некий caller's thread control block. Поскольку я использую монолитный драйвер, то считаю, что это поле может быть идентификатором процесса usermode. По крайней мере, у всех IRP от моей проги это поле одинаковое. В обработчике IOCTL, который приходит только от моей проги, я запоминаю Tail.Overlay.Thread, и если в обработчике IRP_MJ_CLOSE эти поля совпадают, значит прога закрыла драйвер.