Как заблокировать создание файла?

130
03 октября 2019, 00:10

Нужно написать драйвер блокировать создание файла, пробую через Minifilter, но ничего. Получается видеть только мониторинг процессов (создание, удаление, изменение) Может кто нибудь сталкивался. Спасибо. https://github.com/Microsoft/Windows-driver-samples/tree/master/filesys/miniFilter/minispy

Почитал в различных статьях, что требуется изменить входящий/исходящий вызов в этом участке кода.

CONST FLT_OPERATION_REGISTRATION Callbacks[] = {
{ IRP_MJ_CREATE,
  0,
  SpyPreOperationCallback,
  SpyPostOperationCallback },
 { IRP_MJ_OPERATION_END } };

вот код SpyPreOperationCallback, на одном из форумов прочитал что нужно сделать "Чтобы заблокировать доступ к файлу в pre-callback на IRP_MJ_CREATE, нужно прописать в pData->IoStatus.Status подходящий код, например STATUS_ACCESS_DENIED, а затем вернуть из функции FLT_PREOP_SUCCESS_NO_CALLBACK (или FLT_PREOP_COMPLETE, если у тебя нет post-callback-а)." пробовал подставить, но ничего не происходит.

FLT_PREOP_CALLBACK_STATUS
#pragma warning(suppress: 6262) // higher than usual stack usage is considered safe in this case
SpyPreOperationCallback(
_Inout_ PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
{ FLT_PREOP_CALLBACK_STATUS returnStatus = FLT_PREOP_SUCCESS_NO_CALLBACK; //assume we are NOT going to call our completion routine
PRECORD_LIST recordList;
NTSTATUS nameStatus = STATUS_UNSUCCESSFUL;
NTSTATUS targetNameStatus = STATUS_UNSUCCESSFUL;
PFLT_FILE_NAME_INFORMATION nameInfo = NULL;
PFLT_FILE_NAME_INFORMATION targetNameInfo = NULL;
if (MiniFSWatcherData.ClientPort == NULL || MiniFSWatcherData.WatchPath.Buffer == NULL)
{
    return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
if (!FlagOn(Data->Flags, FLTFL_CALLBACK_DATA_IRP_OPERATION))
{
    return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
if (FltObjects->FileObject == NULL || FltObjects->FileObject->FileName.Buffer == NULL || FltObjects->FileObject->DeviceObject == NULL)
{
    return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
CONTINUE_IF_MATCHES(MiniFSWatcherData.WatchProcess, PsGetCurrentProcessId());
CONTINUE_IF_MATCHES(MiniFSWatcherData.WatchThread, PsGetCurrentThreadId());
if (Data->Iopb->MajorFunction == IRP_MJ_SET_INFORMATION && Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileRenameInformation)
{
    PFILE_RENAME_INFORMATION info = (PFILE_RENAME_INFORMATION)Data->Iopb->Parameters.SetFileInformation.InfoBuffer;
    if (info != NULL)
    {
        targetNameStatus = FltGetDestinationFileNameInformation(FltObjects->Instance, FltObjects->FileObject, info->RootDirectory, info->FileName, info->FileNameLength, FLT_FILE_NAME_NORMALIZED | MiniFSWatcherData.NameQueryMethod, &targetNameInfo);
    }
}
nameStatus = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | MiniFSWatcherData.NameQueryMethod, &nameInfo);
if ((NT_SUCCESS(nameStatus) && SpyIsWatchedPath(&nameInfo->Name))
    || (NT_SUCCESS(targetNameStatus) && SpyIsWatchedPath(&targetNameInfo->Name)))
{
    recordList = SpyNewRecord();
    if (recordList) 
    {
        USHORT offset = SpyAddRecordName(&recordList->LogRecord, &nameInfo->Name, 0);
        if (NT_SUCCESS(targetNameStatus) && targetNameInfo != NULL)
        {
            SpyAddRecordName(&recordList->LogRecord, &targetNameInfo->Name, offset);
        }
        SpyLogPreOperationData(recordList);
        *CompletionContext = recordList;
        returnStatus = FLT_PREOP_SUCCESS_WITH_CALLBACK;
    }
}
if (nameInfo != NULL)
{
    FltReleaseFileNameInformation(nameInfo);
}
if (targetNameInfo != NULL)
{
    FltReleaseFileNameInformation(targetNameInfo);
}
    return returnStatus;
 }
Answer 1

Короче говоря, каждый вид открытия или создания файла заканчивается в IRP_MJ_CREATE обратный вызов. Вы можете получить имя файла, который будет открыт (или создан) и имя папки и тому подобное (FltGetFileNameInformation) и решить, разрешить ли запрос (возврат FLT_PREOP_SUCCESS_NO_CALLBACK, который позволяет продолжить запрос) или установите IoStatus в что-то вроде STATUS_ACCESS_DENIED и вернитесь FLT_PREOP_COMPLETE, чтобы заблокировать запрос. Это, в двух словах, что ваши фильтр должен сделать, чтобы заблокировать создание файлов в определенной папке.

READ ALSO
Ошибка E0513 значение типа “const wchar_t *” нельзя присвоить сущности типа “wchar_t *”

Ошибка E0513 значение типа “const wchar_t *” нельзя присвоить сущности типа “wchar_t *”

Всем добрый деньПосмотрел много вариантов решения проблемы но что то ничего не помогает

569
c++: задать точность числа при выводе через printf

c++: задать точность числа при выводе через printf

Подскажите, как задать точность вывода float/double числа через printf?

148
Скопировать файл из одной папки в другую

Скопировать файл из одной папки в другую

Требуется скопировать файл из одной папки в другуюСделать это было решено через функцию "fileCopy()"

108