Здравствуйте! Появилась проблема с перехватом ntQueryDirectoryFile. А именно: - Эта ф-ция имеет параметр bReturnOnlyOneEntry, который заставляет ее возвращать только один элемент каталога. Вот, и когда программы пытаются получить список файлов/каталогов, то первым делом, эта ф-ция выполняется с установленным bReturnOnlyOneEntry, а затем, если что-то возвратилось(т.е. каталог не пуст) то получают все остальное(если оно тоже есть). Что-то в этом роде. Так вот: Если спрятать файл/каталог, который является первым в своем каталоге(проверялось в корневом), то в перехватчике будет цепочка FileInformation со всего одним элементом - который мы и прячем возвращая STATUS_NO_SUCH_FILE. После чего, повторного вызова ntQueryDirectoryFile уже не происходит(а зачем? Ведь мы ему сказали что больше ничего нет!) и соответственно происходит "исчезание" всего что было в каталоге! Если я все правильно понял, и вызов ntQueryDirectoryFile происходит дважды, то при втором вызове должен быть выставлен параметр bRestartQuery(продолжить поиск в каталоге, выполняется совместно с bReturnOnlyOneEntry), но он всегда 0! Можно предположить что угодно, но проблема остается. Попробывал решить задачу так, в перехватчике: - Выполнить оригинальную ntQueryDirectoryFile с оригинальными параметрами; - Ищем в цикле запрещенные элементы каталога; - Если нашли, он первый и bReturnOnlyOneEntry выставлен, то вызываем наш перехватчик еще раз, но с установленным bRestartQuery. Тем самым продолжая искать первый разрешенный элемент. Рекурсия. Результат - БСОД. Иной путь: - Выполнить оригинальную ntQueryDirectoryFile с оригинальными параметрами КРОМЕ bReturnOnlyOneEntry, его выставляем в 0; - Ищем-ищем-ищем, нашли не нашли, в общем строим выходную цепочку как обычно, отбрасывая все запрещенное; - После цикла смотрим, был ли установлен bReturnOnlyOneEntry? Если да, то рихтуем первый элемент цепочки, обнуляя его NextEntryOffset и тем самым подготавливая результат. Результат - исчезает то что нужно и что не нужно(пара следующих файлов/каталогов). Но на этот раз каталог не пустеет и нет БСОДа. Причем от последнего действия(третий тезис) уже ничего не зависит; есть он или нет - результат один. Остаются вопросы: - Используется ли bRestartQuery? - Как все это победить? Может кто сталкивался.... Спасибо
gilg Не помогло, теперь просто вылетает та прога, которая во всю эту байду лезет(в смысле пытается получить список файлов). Причем просто закрывается, без ошибок и сообщений...
Begemot http://www.wasm.ru/forum/viewtopic.php?id=17199 http://www.wasm.ru/forum/viewtopic.php?id=17369 http://www.wasm.ru/forum/viewtopic.php?id=16904 http://www.wasm.ru/forum/viewtopic.php?id=16445 http://www.wasm.ru/forum/viewtopic.php?id=11454