Минифильтр вызывает задержку управления дисками и восстановления системы - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь определить, почему мой фильтр вызывает задержку управления диском, diskmgmt.msc.Он застревает на длительный период, пока не показывает или не показывает вовсе.

Мое расследование и заключение довольно сильно сузили проблему.Я напишу некоторый код, который сильно сокращен для удобного чтения.Я вполне уверен, что достаточно ответить на вопрос.

Видите ли, приведенный ниже код работает.Результатом является значение, которое возвращается.

    if(Data->Iopb->MajorFunction == IRP_MJ_VOLUME_MOUNT)
        {
dev = diskDevice->DeviceType;
        if((FILE_DEVICE_MASS_STORAGE == dev) || (FILE_DEVICE_DISK == dev) || 
                    (FILE_DEVICE_DISK_FILE_SYSTEM == dev) || (FILE_DEVICE_VIRTUAL_DISK == dev)
                    || (FILE_DEVICE_FILE_SYSTEM == dev) || (dev >= 32768))
                    {
                        if(FLT_FSTYPE_NTFS == fs_type)
                        {
                            Result = FLT_PREOP_SUCCESS_WITH_CALLBACK; 

                        }
                        else
                        {
                            Result = FLT_PREOP_SUCCESS_NO_CALLBACK;
                        }
                    }

        }

Если бы "else" было бы FLT_PREOP_SUCCESS_WITH_CALLBACK ;, оно бы запаздывало.

Итак, я предполагаю, что существует специфическое поведение для некоторого конкретного FLT_FSTYPE, отличного от NTFS.Поэтому у меня вопрос: к какому из них предъявляются особые требования?

Моя функция PostOperation не делает ничего, кроме регистрации.Эта функция всегда возвращает FLT_POSTOP_FINISHED_PROCESSING.

1 Ответ

0 голосов
/ 15 мая 2018

Хорошо, моя проблема не была вызвана значениями enum или какой-либо "магией". Перечисления определяют, следует ли запускать postOperation или нет. Здравый смысл говорит, что в этом и заключается проблема. Как я уже сказал, все, что я делал, это записывал материал. И да, это была проблема. Я использую функцию FltSendMessage. Поскольку у меня нет таймера и он установлен в NULL, он будет ждать бесконечно. Вот где это застревает. Моя проблема заключается в том, что существует ошибка в связи между ядром и пользовательским пространством. В моем случае приложение пользователя не работает на своей стороне. После сбоя он не отправляет подтверждение драйверу, поэтому он ждет.

...