Мне кажется, что причиной этому может быть то, что в поле ObjectName передается только имя файла без пути
Ну так кажется или точно?
Вобще-то ZwOpenFile эквивалентна ZwCreateFile, точнее
ZwOpenFile(handle, DesiredAccess,oa,IoStatusBlock, SharedAccess, OpenOptions)==
ZwCreateFile(handle, DesiredAccess, oa, IoStatusBlock,0,0,SharedAccess, FILE_OPEN, OpenOptions,0,0).
Если там действительно nahdle то получи название директории через handle.
Последовательность действий такая- получить по handle указатель на FileObject, далее или помучить FileObject пытаясь из него выцарапать директорию, или послать запрос IRP_MJ_QUERY_INFORMATION на драйвер файловой системы.
Из Handle получить FILE_OBJECT можно при помощи ObReferenceObjectByHandle.
В FILE_OBJECT имя содержится в поле FileName, но там нет имени диска, надо его получить- указатель на диск на котором файл находится можно взять из поля DeviceObject или Vpb->RealDevice, а Vpb->DeviceObject указывает на DEVICE_OBJECT драйвера файловой системы. Имя диска(но не букву) можно получить при помощи ObQueryNameString, и заранее получить соответсвие символьной ссылки(буквы) имени DEVICE_OBJECT для диска- ZwQuerySymbolicLinkObject . Далее сложить все имена- и вот полное имя.
Возможно в FILE_OBJECT имя составное и начало имени в поле RelatedFileObject->FileName.
Вместо всего вышеприведенного можно попытаться использовать NtQueryInformationFile для класса FileNameInformation на твой handle директории. Но имя диска скорей всего придется получать как сказано выше.
Если чего неясно- спрашивай, будем дальше разбираться.
Будь всегда осторожен, пытаясь что-то открывать при фильтрации Create запросов- можно зациклится, так как послав Create запрос ты можешь опять попасть в свой фильтр. Применяй Nt ф-ции(они не обращаются к таблице функций, но помни- они не изменяют RequestMode- подробнее вот тут
http://www.osronline.com/article.cfm?id=257 ) и думай что делаешь.