Как заблокировать создание файлов и папок в устаревшем драйвере фильтра для Windows

Я пытаюсь создать устаревший драйвер фильтра для Windows, чтобы заблокировать «создание файла и папки» на внешних устройствах хранения.

Я пробовал со следующим кодом

if( lDeviceType==cwUSBDRIVE || lDeviceType==cwEXTERNALHDD)
{
  if(irpSp->MajorFunction==IRP_MJ_CREATE)
  {
   if((irpSp->Parameters.Create.Options)&FILE_DIRECTORY_FILE)
    {
            Irp->IoStatus.Status = STATUS_ACCESS_DENIED;//Deny Access
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_ACCESS_DENIED;
    }
   else if((irpSp->Parameters.Create.Options)&FILE_NON_DIRECTORY_FILE)
   {

        Irp->IoStatus.Status = STATUS_ACCESS_DENIED;//Deny Access
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
         return STATUS_ACCESS_DENIED;

   }
  }
}

при работе с кодом блокирует создание файла/папки. Но он также блокирует копирование файлов с устройства и операции открытия файлов.

Мне нужно заблокировать создание файла\папки и разрешить копирование с устройства и открытие файлов.


person NIKHIL V S    schedule 25.07.2018    source источник
comment
Я удалил тег c, но это было просто предположение. Пожалуйста, отметьте язык, который вы на самом деле используете, если это C, замените тег C++ на C.   -  person    schedule 25.07.2018
comment
Копирование файлов подразумевает создание файлов, поэтому, если создание файлов заблокировано, логично, что копирование также заблокировано.   -  person Jesper Juhl    schedule 25.07.2018
comment
@Felix Palment: спасибо за обновление, код создан на C. Удален тег C++   -  person NIKHIL V S    schedule 25.07.2018
comment
@Jesper Juhl: Спасибо за обновление, но есть ли альтернативное решение? Как требование в моем проекте   -  person NIKHIL V S    schedule 25.07.2018
comment
но копировать файл включает создание нового файла. потому это его и заблокировали. и невозможно определить, по какой причине создан новый файл - для копирования какого-либо содержимого из другого файла или каким-либо другим   -  person RbMm    schedule 25.07.2018
comment
@RbMm перед проверкой IRP мы проверяем тип устройства. Приведенный выше код выполняется только для внешнего устройства.   -  person NIKHIL V S    schedule 25.07.2018
comment
и что ? как это связано с копированием файлов/созданием блоков?   -  person RbMm    schedule 25.07.2018
comment
@RbMm Почему для копирования файла с устройства требуется создать файл на этом устройстве? Этот файл должен быть создан в папке назначения.   -  person Gerhardh    schedule 25.07.2018
comment
но нужно открыть файл для копирования. вы блокируете открытие любого файла   -  person RbMm    schedule 25.07.2018
comment
@RbMm, комментируя приведенный выше код. операции копирования и открытия файлов работают   -  person NIKHIL V S    schedule 25.07.2018
comment
я совершенно не понимаю, что работает для вас. как я вижу, вы блокируете открытие любого файла   -  person RbMm    schedule 25.07.2018
comment
@RbMm при удалении вышеуказанного кода копирование и открытие файла работает, но при использовании кода он не работает   -  person NIKHIL V S    schedule 25.07.2018
comment
вы блокируете открытие файла. и чего же ты хочешь ?   -  person RbMm    schedule 25.07.2018
comment
@RbMm Мне нужно заблокировать только создание файла/папки   -  person NIKHIL V S    schedule 26.07.2018
comment
@RbMm Итак, Можно ли разрешить открывать и отключать параметры создания файлов/папок?   -  person NIKHIL V S    schedule 26.07.2018
comment
конечно да. вам нужно найти параметр CreateDisposition: CreateDisposition = IrpSp->Parameters.Create.Options >> 24; - если FILE_OPEN - разрешить, иначе отключить   -  person RbMm    schedule 26.07.2018
comment
ХОРОШО. не могли бы вы упомянуть тип данных Createdispostion   -  person NIKHIL V S    schedule 26.07.2018
comment
что такое тип данных? просто внутр. я покажу вам пример из fastfat. CreateDisposition это точно параметр из IoCreateFile   -  person RbMm    schedule 26.07.2018


Ответы (1)


Большое спасибо, @RbMm. Эта проблема была решена с помощью CREATE DISPOSITION. Ниже я размещаю код, который я использовал для решения этой проблемы. Как ссылка на других,

              if((irpSp->Parameters.Create.Options)&FILE_DIRECTORY_FILE)
                   {
                       if((irpSp->Parameters.Create.Options >> 24) == FILE_CREATE)
                       {
                           Irp->IoStatus.Status = STATUS_ACCESS_DENIED;//Deny Access
                           Irp->IoStatus.Information = 0;
                           IoCompleteRequest(Irp, IO_NO_INCREMENT);
                           return STATUS_ACCESS_DENIED;
                       }
                   }
                   else if((irpSp->Parameters.Create.Options)&FILE_NON_DIRECTORY_FILE)
                   {
                       if((irpSp->Parameters.Create.Options >> 24) == FILE_CREATE)
                       {
                           Irp->IoStatus.Status = STATUS_ACCESS_DENIED;//Deny Access
                           Irp->IoStatus.Information = 0;
                           IoCompleteRequest(Irp, IO_NO_INCREMENT);
                           return STATUS_ACCESS_DENIED;
                       }
            }
person NIKHIL V S    schedule 26.07.2018
comment
обычно вам нужно сравнить с FILE_OPEN и разрешить только эту опцию, иначе запретить другую. скажем, вместо диспозиции FILE_CREATE мы можем использовать FILE_OPEN_IF - если файл не существует - обе диспозиции будут иметь одинаковый эффект. можно использовать FILE_OVERWRITE_IF и так далее - person RbMm; 26.07.2018