Здравствуйте. Есть драйвер который перехватывает NtCreateFile. В теле перехватчика мне надо узнать полное имя файла который желают создать. Делаю это при помощи функции ZwQueryInformationFile. Но вот здесь http://www.wasm.ru/article.php?article=lockfileswork, прочитал следующие: Так вот хочется узнать как избежать этого зависания?
Nouzui Вызывается, однако обычно в NtAPI идёт проверка на предыдущий режим, если KernelMode то действия иногда могут отличаться.
тогда ее надо вызывать через workitem'ы или из отделного потока ядра - при обработке DeviceIoControl или ReadFile/WriteFile PreviousMode==UserMod
заюзай для получения имени файла по хендлу ObReferenceObjectByHandle => ObQueryNameString и не парься
1. если уж на то пошло, то имя создаваемого файла передается в NtCreateFile через третий параметр - ObjectAttributes 2. ObQueryNameString вроде бы вернет что-то вроде "\\Device\\HardDiskVolumeX". или я что-то путаю?
Код (Text): 2. ObQueryNameString вроде бы вернет что-то вроде "\\Device\\HardDiskVolumeX". или я что-то путаю? ага, вернёт что-то вроде \\Device\\HardDiskVolumeX\\path\\to\\file\\somefile.exe
Я конечно новичок тут, но насколько я помню имя файла передается в OBJECT_ATTRIBUTES.ObjectName А будет без девайсов, а сразу c:\\path\\newfile.txt
из ring0 - и не парься там всё рульно. а из ring3 - создаёшь поток перед вызовом ZwQueryInformationFile и потоке делаешь обращение к файлу по полученному хэндлу. Если поток не отзывается (проверять WaitForSingleObject) - валишь его ZwTerminateThread и этот хэндл лучше пропустить, иначе - все в норме.
если я хочу открыть файл в текущем каталоге, там будет только имя. а ему нужен полный путь. имхо лучший вариант - ObReferenceObjectByHandle
С именем файла при перехвате все понятно. А как узнать имя процесса, который открыл этот файл ( вызвал ф-цию)?
нет, боюсь мне это не поможет. Как определяет filemon имя процесса? Читал где-то на васме, что надо получить доступ к какой-то структуре и там будет это поле. А вот где читал, не помню, поиск в гугле не помог. Ладно, поищу сорцы filemon
ProfessorNimnull в EPROCESS есть поле ImageFileName насколько я помню =\ так же там есть указатель на PEB, где в списке модулей можно найти и экзешник с полным путём
если я не ошибаюсь получить указатель я смогу через регистр fs. хотя в ядре, вроде, fs указывает на что-то другое... А можно по подробнее как получить указатель, вообще, я в правильном направлении мыслю или ход моих мыслей приведет меня в тупик. Добавленно: ой, нет, fs же вроде на TEB указывает Добавленно еще раз: Нашел, что можно получить через ZwQueryInformationProcess