Нужно написать драйвер блокировать создание файла, пробую через 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;
}
Короче говоря, каждый вид открытия или создания файла заканчивается в IRP_MJ_CREATE обратный вызов. Вы можете получить имя файла, который будет открыт (или создан) и имя папки и тому подобное (FltGetFileNameInformation) и решить, разрешить ли запрос (возврат FLT_PREOP_SUCCESS_NO_CALLBACK, который позволяет продолжить запрос) или установите IoStatus в что-то вроде STATUS_ACCESS_DENIED и вернитесь FLT_PREOP_COMPLETE, чтобы заблокировать запрос. Это, в двух словах, что ваши фильтр должен сделать, чтобы заблокировать создание файлов в определенной папке.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем добрый деньПосмотрел много вариантов решения проблемы но что то ничего не помогает
Подскажите, как задать точность вывода float/double числа через printf?
Требуется скопировать файл из одной папки в другуюСделать это было решено через функцию "fileCopy()"