Проблема с ntQueryDirectoryFile

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

  1. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Здравствуйте!
    Появилась проблема с перехватом ntQueryDirectoryFile. А именно:
    - Эта ф-ция имеет параметр bReturnOnlyOneEntry, который заставляет ее возвращать только один элемент каталога. Вот, и когда программы пытаются получить список файлов/каталогов, то первым делом, эта ф-ция выполняется с установленным bReturnOnlyOneEntry, а затем, если что-то возвратилось(т.е. каталог не пуст) то получают все остальное(если оно тоже есть). Что-то в этом роде.

    Так вот: Если спрятать файл/каталог, который является первым в своем каталоге(проверялось в корневом), то в перехватчике будет цепочка FileInformation со всего одним элементом - который мы и прячем возвращая STATUS_NO_SUCH_FILE. После чего, повторного вызова ntQueryDirectoryFile уже не происходит(а зачем? Ведь мы ему сказали что больше ничего нет!) и соответственно происходит "исчезание" всего что было в каталоге!

    Если я все правильно понял, и вызов ntQueryDirectoryFile происходит дважды, то при втором вызове должен быть выставлен параметр bRestartQuery(продолжить поиск в каталоге, выполняется совместно с bReturnOnlyOneEntry), но он всегда 0!
    Можно предположить что угодно, но проблема остается.

    Попробывал решить задачу так, в перехватчике:
    - Выполнить оригинальную ntQueryDirectoryFile с оригинальными параметрами;
    - Ищем в цикле запрещенные элементы каталога;
    - Если нашли, он первый и bReturnOnlyOneEntry выставлен, то вызываем наш перехватчик еще раз, но с установленным bRestartQuery. Тем самым продолжая искать первый разрешенный элемент. Рекурсия.
    Результат - БСОД.

    Иной путь:
    - Выполнить оригинальную ntQueryDirectoryFile с оригинальными параметрами КРОМЕ bReturnOnlyOneEntry, его выставляем в 0;
    - Ищем-ищем-ищем, нашли не нашли, в общем строим выходную цепочку как обычно, отбрасывая все запрещенное;
    - После цикла смотрим, был ли установлен bReturnOnlyOneEntry? Если да, то рихтуем первый элемент цепочки, обнуляя его NextEntryOffset и тем самым подготавливая результат.
    Результат - исчезает то что нужно и что не нужно(пара следующих файлов/каталогов). Но на этот раз каталог не пустеет и нет БСОДа. Причем от последнего действия(третий тезис) уже ничего не зависит; есть он или нет - результат один.

    Остаются вопросы:
    - Используется ли bRestartQuery?
    - Как все это победить?

    Может кто сталкивался....
    Спасибо
     
  2. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Begemot
    Поищи по форуму: где-то проскакивал код, который отлично работает :)
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Зачем bRestartQuery? Просто вызвать еще раз с установленным флагом bReturnOnlyOneEntry
     
  4. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    gilg
    Не помогло, теперь просто вылетает та прога, которая во всю эту байду лезет(в смысле пытается получить список файлов).
    Причем просто закрывается, без ошибок и сообщений...
     
  5. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Stub
    Не удалось найти :dntknw:
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    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
     
  7. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Да, я видел эти посты.
    Но они также не избавлены от описанной проблемы.
     
  8. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    fluderast
    Да, это то что нужно.
    Спасибо, господа!