Как выгрузить MMF с помощью минифильтра?
От: Suares  
Дата: 11.11.14 13:18
Оценка:
Познаю минифильтр, который шифрует/расшифровует файлы.

Сталкнулся с проблемой, когда, например, файл был открыт ранее без использования минифильтра.

В общем проблема выглядит так:
1. Минифильтр офф:

2. Минифильтр он:

Решил пойти по пути, когда в IRP_MJ_CREATE пакете в post-callback процедуре очищаю кэш.
Основные моменты в PostCreate:

В IRP_MJ_CLEANUP пакете в pre-callback процедуре делаю, почти тоже:

Вот пример как очищаю кэш:

if(CcIsFileCached(FltObjects->FileObject))
{
    fcb = (PFSRTL_COMMON_FCB_HEADER)FltObjects->FileObject->FsContext;

    if (fcb == NULL)
    {
        DbgPrint();
    }

    if (fcb->Resource != NULL)
    {
        ExEnterCriticalRegionAndAcquireResourceExclusive(fcb->Resource);
    }

    if (fcb->PagingIoResource != NULL)
    {
        ExEnterCriticalRegionAndAcquireResourceExclusive(fcb->PagingIoResource);
    }

    if (FltObjects->FileObject->SectionObjectPointer != NULL)
    {
        if (FltObjects->FileObject->SectionObjectPointer->ImageSectionObject != NULL)
        {
            if (!MmFlushImageSection(FltObjects->FileObject->SectionObjectPointer, MmFlushForDelete))
            {
                DbgPrint();
            }
        }

        if (FltObjects->FileObject->SectionObjectPointer->DataSectionObject != NULL)
        {
            if (!CcPurgeCacheSection(FltObjects->FileObject->SectionObjectPointer, NULL, 0, FALSE))
            {
                DbgPrint();
            }
        }
    }

    ExReleaseResourceAndLeaveCriticalRegion(fcb->Resource);
    ExReleaseResourceAndLeaveCriticalRegion(fcb->PagingIoResource);
}


Например, рассмотрим чтение текстового файла с помощью Notepad++:


Все ок. Но с Notepad такое не получается. 1-й и 2-й шаги проходят как и у Notepad++, а вот в 3-м шаге открывается РАСШИФРОВАННЫЙ файл, а должен быть зашифрованный.
Кстати 2 шаг получается сделать корректно, так как я не установил флаг FLTFL_IO_OPERATION_NON_CACHED в функцию FltReadFile. А с этих флагом на 2 шаге будет неудача для маппед файлов.

Подскажите, пожалуйста, как корректно выгрузить маппед файлы с памяти в IRP_MJ_CLEANUP? Или в IRP_MJ_CLOSE нужно это делать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.