драйвер минифильтра добавляется в пользовательский буфер в пост-операции - PullRequest
0 голосов
/ 21 января 2020

Я узнаю о драйверах минифильтров. Я хочу добавить текст к каждому открытому .txt файлу в notepad ++, но по какой-то причине это не работает. Что мне здесь не хватает?

CONST FLT_OPERATION_REGISTRATION Callbacks[] = {

    { IRP_MJ_READ,
      0,
      PreRead,
      PostRead},
    { IRP_MJ_OPERATION_END }
};

FLT_POSTOP_CALLBACK_STATUS
PostRead (
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _In_opt_ PVOID CompletionContext,
    _In_ FLT_POST_OPERATION_FLAGS Flags
    )
{
    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( CompletionContext );
    UNREFERENCED_PARAMETER( Flags );

    FLT_POSTOP_CALLBACK_STATUS Status = FLT_POSTOP_FINISHED_PROCESSING;

    // Make sure caller is user-mode process and it's IRP operation just to be safe
    if (Data->RequestorMode != UserMode || KeGetCurrentIrql() != PASSIVE_LEVEL || !FLT_IS_IRP_OPERATION(Data))
        return Status;

    // We only care about 1 process
    if (strcmp(PsGetProcessImageFileName(PsGetCurrentProcess()), "notepad++.exe") != 0)
        return Status;

    PVOID* Buffer;
    PULONG Length; // NOTE: this is buffer length, not string length, string "test" has length of 4 but it can be read into buffer with length 1024
    FltDecodeParameters(Data, NULL, &Buffer, &Length, NULL);

    UNICODE_STRING TargetExtension = RTL_CONSTANT_STRING(L"txt");
    UNICODE_STRING FileExtension = { 0 };
    UNICODE_STRING FileName = { 0 };
    FltParseFileName(&Data->Iopb->TargetFileObject->FileName, &FileExtension, NULL, &FileName);
    if (RtlCompareUnicodeString(&FileExtension, &TargetExtension, TRUE) == 0) // check if it's txt extension
    {
       // B[0] = 'b'; // this works
        FltLockUserBuffer(Data);
        strcat((LPSTR)Data->Iopb->Parameters.Read.ReadBuffer, "hello");
        FltSetCallbackDataDirty(Data);
        DbgPrint("Filename: %wZ , Length in bytes to read: %lu buffer: %s \n", FileName, *Length, (LPSTR)Data->Iopb->Parameters.Read.ReadBuffer);
    }

    return Status;
}

Data-> Iopb-> Parameters.Read.MdlAddress всегда равен NULL в этом случае

Нужно ли создавать новый буфер в этом случае? Или я могу добавить к существующему? Кажется, он имеет достаточную длину (131072 байта)

Обратите внимание, что это работает, когда я заменяю один символ, но strcat не работает. Я даже пытался использовать RtlStringCchCatA

Я уверен, что что-то упустил, но я не знаю, что.

enter image description here

1 Ответ

0 голосов
/ 21 января 2020

Мне нужно было добавить длину добавленной строки к Data->IoStatus.Information, и это сработало. Обратите внимание, что FltSetCallbackDataDirty является избыточным, когда вы делаете это.

https://community.osr.com/discussion/271422/when-should-call-fltsetcallbackdatadirty

Кажется, вам не нужен вызов FltLockUserBuffer в этом случае, так как хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...