Относительный каталог ZwCreateFile

Мне нужно реализовать перекрестную проверку целостности файлов для моего университетского проекта. Для этого как мне перечислить файлы каталога в режиме ядра??


person Ansh David    schedule 18.06.2013    source источник


Ответы (1)


Отправной точкой будет ZwCreateFile< /a> - который имеет такие параметры, как "FILE_LIST_DIRECTORY".

Затем вы будете использовать ZwQueryDirectoryFile, чтобы получить информацию о файлах в этом каталоге.

Убедитесь УБЕДИТЕСЬ, что вы не забыли ZwClose после того, как вы что-то открыли - это не так критично в пользовательском приложении, которое снова закрывается после того, как оно было использовано. Но ядро ​​не знает, когда драйвер перестает использовать файл (или, если на то пошло, если какой-то другой драйвер получил этот дескриптор файла и будет использовать его в какой-то момент), поэтому, даже если ваш драйвер выгружен, файлы что он открыт, будет оставаться открытым до тех пор, пока система не перезапустится - я очень люблю «не перезапускать» свои системы, и с хорошим набором драйверов машина может работать более года. Если ваш драйвер пропускает хотя бы одну ручку в день, это 365 ручек.

Итак, код будет выглядеть примерно так:

HANDLE h;
NTSTATUS status;
OBJECT_ATTRIBUTES oa = { sizeof(OBJECT_ATTRIBUTES), NULL, L"mydir",
                         OPEN_CASE_INSENSITIVE, NULL, NULL };
IO_STATUS_BLOCK iosb = {};

status = ZwCreateFile(&h, FILE_LIST_DIRECTORY, &oa, &iosb, NULL, 
                      FILE_ATTRIBUTE_NORMAL, FILE_OPEN, FILE_DIRECTORY_FILE,
                      NULL, 0);
if (status != STATUS_SUCCESS)
{
   ... do something... 
   return errorcode;
}
else
{
    FILE_DIRECTORY_INFORMATION info;
    for(;;)
    {
        status = ZwQueryDirectoryFile(h, NULL, NULL, &iosb, &info, sizeof(info), 
                                      FileDirectoryInformation, TRUE, L"*.*",
                                      FALSE);
        if (status != STATUS_SUCCESS) 
        {
            ... check error code and perhaps print if unexpected error ... 
            break;
        }
        ... do soemthing with `info` ... 
    }
}
ZwClose(h);

Это просто "набросок". У меня нет установки, чтобы скомпилировать это прямо сейчас, и я мог пропустить что-то важное. Но это должно дать вам некоторое представление. Здесь МНОГО необязательных параметров и необязательных вариантов, и некоторые из них я «угадал», что вам нужно, но я думаю, что сделал разумный выбор. Могут отсутствовать детали, из-за которых это не работает, но в качестве грубой отправной точки это должно дать вам хотя бы представление.

person Mats Petersson    schedule 18.06.2013
comment
Нет, я использовал некоторые из этих функций в коммерческом продукте много лет назад... Но я отредактирую свой пост для получения дополнительной информации. - person Mats Petersson; 18.06.2013
comment
Извините, по крайней мере, без более описательной ошибки, чем c2220, не уверен, что смогу помочь - после того, что я вижу, c2220 воспринимается как ошибка, поэтому, предположительно, в строке есть предупреждение, которое вам нужно исправить. - person Mats Petersson; 18.06.2013
comment
Можно немного точнее? Я боюсь, что мой пластиковый шар, который я использую как более дешевую версию хрустального шара, не видит ваш код или ваши сообщения об ошибках. - person Mats Petersson; 19.06.2013
comment
Что-то серьезно не так с вашим включением в основной файл драйвера. Я не уверен, что именно, и, как я уже сказал, моя система Linux, которую я использую сейчас, не настроена для создания драйверов Windows. Если вы сделаете шаг назад и попытаетесь собрать только пустой драйвер, получится ли это? - person Mats Petersson; 20.06.2013
comment
Итак, что вы изменили, чтобы он перестал компилироваться? Делайте это шаг за шагом. Компилируйте часто, пишите только несколько строк за раз. - person Mats Petersson; 20.06.2013
comment
началось, когда я добавил ntifs.h... для добавления FILE_BOTH_DIR_INFORMATION и ZwQueryDirectoryFile - person Ansh David; 20.06.2013
comment
Вы уверены, что получаете правильный файл ntifs.h? Я на 99% уверен, что вам не следует включать winbase.h из ntifs.h... - person Mats Petersson; 20.06.2013
comment
ага, только что перепроверил... тот момент, когда он пукает на моем экране сборки =_= - person Ansh David; 20.06.2013