Никак не могу понять... У меня есть список "запрещенных" файлов. Я проверяю в перехватчике, есть ли они среди возвращенных ориганальной ф-цией и в случае совпадения - прячу их. В общем ничего нового и принцип тот же что и у всех, но прячится только один файл, а не все что есть в списке запрещенных. Вот код перехватчика: Код (Text): case FileBothDirectoryInformation: FileBothDirectoryInfo = NULL; do { LastFileBothDirectoryInfo = FileBothDirectoryInfo; FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset); neededSize = (uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) * sizeof(wchar_t); Name = (wchar_t *)ExAllocatePool(PagedPool, neededSize); RtlZeroMemory(Name, neededSize); //достраиваем путь к файлу wcsncpy(Name, uPath.Buffer, uPath.Length / sizeof(wchar_t)); wcsncat(Name, L"\\", 1); wcsncat(Name, FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength / sizeof(wchar_t)); Name[(uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) / sizeof(wchar_t)] = 0; RtlInitUnicodeString(&uniFileName, Name); if (IsHidden(uniFileName)) { if (!FileBothDirectoryInfo->NextEntryOffset) { if (LastFileBothDirectoryInfo) { LastFileBothDirectoryInfo->NextEntryOffset = 0; } else { ns=STATUS_NO_SUCH_FILE; } return ns; } else { if (LastFileBothDirectoryInfo) { LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset; continue; } } } ExFreePool(Name); Offset += FileBothDirectoryInfo->NextEntryOffset; } while (FileBothDirectoryInfo->NextEntryOffset); break; И ф-ции IsHidden: Код (Text): BOOLEAN IsHidden (IN UNICODE_STRING uniFileName) { ULONG uPos; PHIDDEN_FILE_ENTRY pEntry; UNICODE_STRING uniHideDirFile; pEntry = pFirstEntry; for (uPos = 0; uPos < uEntriesCount; uPos++) { RtlInitUnicodeString(&uniHideDirFile, pEntry->FileName); if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) { return TRUE; } if (pEntry->NextEntry != 0) pEntry=pEntry->NextEntry; else break; } return FALSE; } Список строится нормально, проблема видимо в алгоритме перехватчика. Если кто знает, подскажите, плиз...
Кажись нашел дырку. Вроде все работает в таком виде: Код (Text): LastFileBothDirectoryInfo = FileBothDirectoryInfo = NULL; do { //LastFileBothDirectoryInfo = FileBothDirectoryInfo; FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset); neededSize = (uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) * sizeof(wchar_t); Name = (wchar_t *)ExAllocatePool(PagedPool, neededSize); RtlZeroMemory(Name, neededSize); //достраиваем путь к файлу wcsncpy(Name, uPath.Buffer, uPath.Length / sizeof(wchar_t)); wcsncat(Name, L"\\", 1); wcsncat(Name, FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength / sizeof(wchar_t)); Name[(uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) / sizeof(wchar_t)] = 0; RtlInitUnicodeString(&uniFileName, Name); if (IsHidden(uniFileName)) { if (!FileBothDirectoryInfo->NextEntryOffset) { if (LastFileBothDirectoryInfo) { LastFileBothDirectoryInfo->NextEntryOffset = 0; } else { ns=STATUS_NO_SUCH_FILE; } return ns; } else { if (LastFileBothDirectoryInfo) { LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset; continue; } } } else { LastFileBothDirectoryInfo = FileBothDirectoryInfo; } ExFreePool(Name); Offset += FileBothDirectoryInfo->NextEntryOffset; } while (FileBothDirectoryInfo->NextEntryOffset); Если кто вдруг видит другие баги - буду рад их исправить И еще один вопрос: во всех примерах перехвата данной ф-ции указывается, что все четыре структуры должны обрабатываться одинаково, но так ли это? Нет ли тонкостей и нюансов, которые нужно учитывать? Особенно интересен момент с FileNamesInformation... Заранее, крайне, благодарен!
gilg Да уж, об этом я не думал. Ну ладно, будет как есть - четыре копии одного и того же. Всем спасибо. С этим вроде все.