Добрый день! Можно ли в обработчиках IRP_MJ_CREATE (IRP_MJ_CLOSE) в драйвере идентифицировать (или дифференцировать, т.е. различать) приложение, которое вызвало этот create/close? В частности нужно знать, МОЁ ли приложение закрыло драйвер. Вообще наблюдаю такую картину: менеджер ввода вывода ИНОГДА открывает драйвер, шлёт ему несколько ioctl и закрывает его. IRP_MJ_READ и IRP_MJ_WRITE могут быть переданы драйверу и без его предварительного открытия (счетчик открытий == 0). Драйвер под XP. Вижу несколько решений, например установленный флаг в реестре перед открытием драйвера моим приложением с последующим запретом открытия драйвера, но может быть есть более красивые решения?
ирпы приходят в контексте вызыващего их процесса, т.е. поток, делая CreateFile, в конечном счете переходит в режим ядра. Идентифицируй по PID.
Спасибо за идею! Сперва попробовал идентифицировать приложение по PsGetCurrentProcessId, действительно значение хэндла совпадает со значением, возврааемым GetCurrentProcessId в приложении. Но как проще всего сообщить драйверу, что именно этот IRP пришел от моего приложения? Можно, конечно явно собщить драйверу хендл процеесса приложения, но я попытался найти способ идентифицировать приложение по IRP. В IRP есть поле Tail.Overlay.Thread, в котором сохраняется указатель на некий caller's thread control block. Поскольку я использую монолитный драйвер, то считаю, что это поле может быть идентификатором процесса usermode. По крайней мере, у всех IRP от моей проги это поле одинаковое. В обработчике IOCTL, который приходит только от моей проги, я запоминаю Tail.Overlay.Thread, и если в обработчике IRP_MJ_CLOSE эти поля совпадают, значит прога закрыла драйвер.