Перехват ntQueryDirectoryFile

Тема в разделе "WASM.WIN32", создана пользователем Progr, 16 ноя 2006.

  1. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Никак не могу понять... У меня есть список "запрещенных" файлов. Я проверяю в перехватчике, есть ли они среди возвращенных ориганальной ф-цией и в случае совпадения - прячу их. В общем ничего нового и принцип тот же что и у всех, но прячится только один файл, а не все что есть в списке запрещенных.

    Вот код перехватчика:

    Код (Text):
    1.     case FileBothDirectoryInformation:
    2.         FileBothDirectoryInfo = NULL;
    3.         do {
    4.                    LastFileBothDirectoryInfo = FileBothDirectoryInfo;
    5.           FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
    6.           neededSize = (uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) * sizeof(wchar_t);
    7.           Name = (wchar_t *)ExAllocatePool(PagedPool, neededSize);
    8.           RtlZeroMemory(Name, neededSize);
    9.                    //достраиваем путь к файлу
    10.           wcsncpy(Name, uPath.Buffer, uPath.Length / sizeof(wchar_t));
    11.           wcsncat(Name, L"\\", 1);
    12.           wcsncat(Name, FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength / sizeof(wchar_t));
    13.           Name[(uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) / sizeof(wchar_t)] = 0;
    14.           RtlInitUnicodeString(&uniFileName, Name);
    15.           if (IsHidden(uniFileName)) {
    16.                 if (!FileBothDirectoryInfo->NextEntryOffset) {
    17.                     if (LastFileBothDirectoryInfo) {
    18.                         LastFileBothDirectoryInfo->NextEntryOffset = 0;
    19.                     } else {
    20.                         ns=STATUS_NO_SUCH_FILE;
    21.                     }
    22.                     return ns;
    23.                  }
    24.                  else
    25.                  {
    26.                     if (LastFileBothDirectoryInfo) {
    27.                         LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
    28.                         continue;
    29.                     }
    30.                  }
    31.           }
    32.           ExFreePool(Name);
    33.           Offset += FileBothDirectoryInfo->NextEntryOffset;
    34.         } while (FileBothDirectoryInfo->NextEntryOffset);
    35.       break;
    И ф-ции IsHidden:

    Код (Text):
    1. BOOLEAN IsHidden (IN UNICODE_STRING uniFileName) {
    2.     ULONG uPos;
    3.     PHIDDEN_FILE_ENTRY pEntry;
    4.     UNICODE_STRING uniHideDirFile;
    5.  
    6.     pEntry = pFirstEntry;
    7.     for (uPos = 0; uPos < uEntriesCount; uPos++) {
    8.         RtlInitUnicodeString(&uniHideDirFile, pEntry->FileName);
    9.         if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) {
    10.             return TRUE;
    11.         }
    12.         if (pEntry->NextEntry != 0) pEntry=pEntry->NextEntry; else break;
    13.     }
    14.     return FALSE;
    15. }
    Список строится нормально, проблема видимо в алгоритме перехватчика.
    Если кто знает, подскажите, плиз...
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Посмотри здесь, почти рабочий код http://www.wasm.ru/forum/viewtopic.php?id=16904
     
  3. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    "Почти"?
    Кстати, не вижу разницы...
     
  4. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Так в чем же дело?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Сделай DbgPrint с выводом имён и посмотри всё ли обрабатывает.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    чевствую, что корявость есть, а вот где - неохота искать =)
     
  7. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Кажись нашел дырку. Вроде все работает в таком виде:

    Код (Text):
    1. LastFileBothDirectoryInfo = FileBothDirectoryInfo = NULL;
    2.         do {
    3.           //LastFileBothDirectoryInfo = FileBothDirectoryInfo;
    4.           FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
    5.           neededSize = (uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) * sizeof(wchar_t);
    6.           Name = (wchar_t *)ExAllocatePool(PagedPool, neededSize);
    7.           RtlZeroMemory(Name, neededSize);
    8.                    //достраиваем путь к файлу
    9.           wcsncpy(Name, uPath.Buffer, uPath.Length / sizeof(wchar_t));
    10.           wcsncat(Name, L"\\", 1);
    11.           wcsncat(Name, FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength / sizeof(wchar_t));
    12.           Name[(uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) / sizeof(wchar_t)] = 0;
    13.           RtlInitUnicodeString(&uniFileName, Name);
    14.           if (IsHidden(uniFileName)) {
    15.                 if (!FileBothDirectoryInfo->NextEntryOffset) {
    16.                     if (LastFileBothDirectoryInfo) {
    17.                         LastFileBothDirectoryInfo->NextEntryOffset = 0;
    18.                     } else {
    19.                         ns=STATUS_NO_SUCH_FILE;
    20.                     }
    21.                     return ns;
    22.                  }
    23.                  else
    24.                  {
    25.                     if (LastFileBothDirectoryInfo) {
    26.                         LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
    27.                         continue;
    28.                     }
    29.                  }
    30.           } else {
    31.               LastFileBothDirectoryInfo = FileBothDirectoryInfo;
    32.      }
    33.           ExFreePool(Name);
    34.           Offset += FileBothDirectoryInfo->NextEntryOffset;
    35.         } while (FileBothDirectoryInfo->NextEntryOffset);
    Если кто вдруг видит другие баги - буду рад их исправить ;)

    И еще один вопрос: во всех примерах перехвата данной ф-ции указывается, что все четыре структуры должны обрабатываться одинаково, но так ли это? Нет ли тонкостей и нюансов, которые нужно учитывать? Особенно интересен момент с FileNamesInformation...

    Заранее, крайне, благодарен!
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Неа. Обычно их вообще одним кодом обрабатывают, прибавляя смещение полей
     
  9. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    gilg
    Да уж, об этом я не думал.
    Ну ладно, будет как есть - четыре копии одного и того же.
    Всем спасибо. С этим вроде все.