Драйвер не выводит сообщение о открытии .txt файла
Добрый день, помогите решить проблему. Драйвер написан на WDM, он загружается, сообщение видно, но не выводит сообщении об открытии .txt файла, что не так? Запустила тестовый режим Windows чтобы избежать проблем с подписью, в результате вижу в DbgView только сообщение "Драйвер загружен", функция должна работать, но не работает, я не знаю что нужно изменить.
#include "FileOpenLogger.h"
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
UNREFERENCED_PARAMETER(DriverObject);
DbgPrint("Driver Unloading\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath); // Указываем, что параметр не используется
DbgPrint("Driver Loaded\n"); // Сообщение о подключении драйвера
DriverObject->DriverUnload = DriverUnload;
// Установите обработчик для IRP_MJ_CREATE
DriverObject->MajorFunction[IRP_MJ_CREATE] = [](PDEVICE_OBJECT DeviceObject, PIRP Irp) -> NTSTATUS {
UNREFERENCED_PARAMETER(DeviceObject); // Указываем, что параметр не используется
// Получаем указатель на FILE_OBJECT из IRP
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
PFILE_OBJECT fileObject = irpSp->FileObject;
// Проверяем имя файла
if (fileObject->FileName.Length > 0) {
UNICODE_STRING fileName = fileObject->FileName;
if (fileName.Buffer[fileName.Length / sizeof(WCHAR) - 1] == L't' &&
fileName.Buffer[fileName.Length / sizeof(WCHAR) - 2] == L'x' &&
fileName.Buffer[fileName.Length / sizeof(WCHAR) - 3] == L't' &&
fileName.Buffer[fileName.Length / sizeof(WCHAR) - 4] == L'.') {
// Логируем только текстовые файлы
DbgPrint("Text file opened: %wZ\n", &fileName);
}
}
// Завершение IRP
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
};
return STATUS_SUCCESS;
}
Код FileOpenLogger.h
#pragma once
#include <ntddk.h>
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
extern "C" VOID DriverUnload(PDRIVER_OBJECT DriverObject);
Вот этот код, начиная отсюда
// Получаем указатель на FILE_OBJECT из IRP
и до
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
- обработчик IPR. И работать он будет при получении IRP-запроса, а не при загрузке драйвера. Соответственно, если никто драйвер не открывает и не отправляет ему специально подготовленного IRP-запроса - то он ничего и не будет делать.
Далее, судя по коду, подразумевается, что это будет некий драйвер-фильтр. А если фильтр - то он должен быть подцеплен в нужные стеки конкретных устройств чем-то типа. IoAttachDeviceToDeviceStack (который тоже не просто так с нуля вызывается), чего в данном примере я близко не наблюдаю ..., а не просто так создан и загружен, как legacy-драйвер.
Ну и мне не нравятся плюсовые лямбды и прочее - для базовой функциональности с++ нужно как минимум подцепить кастомный менеджер памяти, хотя бы переопределив new/delete; ну и без подобного опыта разработки я бы не рекомендовал вообще пытаться использовать плюсы в драйвере из-за малопредсказуемых побочных эффектов.