Как можно использовать драйвер для обнаружения новых файлов, которые появляются в операционной системе?

Как написать драйвер, который оповестит пользователя о появлении нового файла на компьютере (например, при скачивании из интернета или копировании с флэшки)? Я нашел функцию CreateFileCallback, но она не принимает нужные типы данных в примере кода. Не могли бы вы поделиться статьей или примером кода для решения этой задачи? Благодарю за помощь.
  • 25 октября 2023 г. 15:08
Ответы на вопрос 3
Для обнаружения новых файлов в операционной системе и оповещения пользователя о их появлении можно использовать фильтр драйвера файловой системы (Filter Driver). 

Ниже приведен пример кода на языке C, который демонстрирует, как написать простой драйвер файловой системы с использованием Windows Driver Kit (WDK). Этот драйвер будет перехватывать все операции создания файлов в операционной системе и оповещать пользователя о каждом новом файле:

```cpp
#include <ntddk.h>

// Обработчик операций создания файлов
FLT_PREOP_CALLBACK_STATUS PreCreateCallback(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Out_ PVOID *CompletionContext)
{
    UNREFERENCED_PARAMETER(FltObjects);
    UNREFERENCED_PARAMETER(CompletionContext);

    // Получение имени создаваемого файла
    UNICODE_STRING fileName;
    if (Data->Iopb->Parameters.Create.Options & FILE_DIRECTORY_FILE)
    {
        fileName = Data->Iopb->TargetFileObject->FileName;
    }
    else
    {
        fileName = Data->Iopb->Parameters.Create.FileName;
    }

    // Оповещение пользователя о появлении нового файла
    DbgPrint("New file created: %wZ\n", &fileName);

    return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}

// Обработчик отключения драйвера
NTSTATUS DriverUnload(
    _In_ FLT_FILTER_UNLOAD_FLAGS Flags)
{
    UNREFERENCED_PARAMETER(Flags);

    DbgPrint("Driver unloaded\n");

    return STATUS_SUCCESS;
}

// Основная инициализация драйвера при загрузке
NTSTATUS DriverEntry(
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath)
{
    UNREFERENCED_PARAMETER(RegistryPath);

    // Определение объекта драйвера и установка обработчиков
    FLT_OPERATION_REGISTRATION callbackRegistration[] =
    {
        { IRP_MJ_CREATE, 0, PreCreateCallback }
    };

    FLT_REGISTRATION filterRegistration =
    {
        sizeof(FLT_REGISTRATION),
        FLT_REGISTRATION_VERSION,
        0,
        NULL,
        callbackRegistration,
        DriverUnload,
        NULL,
        NULL,
        NULL
    };

    // Регистрация фильтра драйвера файловой системы
    NTSTATUS status = FltRegisterFilter(DriverObject, &filterRegistration, &gFilterHandle);
    if (NT_SUCCESS(status))
    {
        status = FltStartFiltering(gFilterHandle);
        if (!NT_SUCCESS(status))
        {
            FltUnregisterFilter(gFilterHandle);
        }
    }

    return status;
}
```

Этот код создает простой драйвер файловой системы, который регистрирует обработчик операции создания файлов (`PreCreateCallback`). Внутри этого обработчика можно получить имя создаваемого файла и оповестить пользователя о его появлении.

Обратите внимание, что для правильной сборки и развертывания этого драйвера в системе вам потребуется Windows Driver Kit и выполнение дополнительных шагов, таких как регистрация драйвера и его загрузка в систему.

Источники:
- [MSDN: FileSystem Filters](https://docs.microsoft.com/en-us/windows/win32/fileio/file-system-filter-drivers)
- [MSDN: FltRegisterFilter](https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/fltkernel/nf-fltkernel-fltregisterfilter)
Воспользуйтесь специальными функциями WinApi для обработки уведомлений, которые не требуют установки дополнительных драйверов. 
 
Ссылка: https://docs.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues
Похожие вопросы