Я узнаю о драйверах минифильтров. Я хочу добавить текст к каждому открытому .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](https://i.stack.imgur.com/gAOUw.png)