c - 如何阻止在 Windows 旧版过滤器驱动程序中创建文件和文件夹

标签 c windows filter-driver

我正在尝试为 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;

   }
  }
}

在使用代码时,它会阻止文件/文件夹的创建。但它也会阻止从设备复制文件和打开文件操作。

我需要阻止创建文件\文件夹并允许从设备复制并打开文件。

最佳答案

非常感谢,@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;
                       }
            }

关于c - 如何阻止在 Windows 旧版过滤器驱动程序中创建文件和文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51517213/

相关文章:

c - 在 C 外部函数中释放结构

c - 如何区分 "long"、 "double"和 "const char *"

c++ - 在opengl中删除纹理

c# - C# 或 C 的高性能 RSA 实现

java - 在 Eclipse 中调试 Java 应用程序(Tanuki 服务包装器)

c++ - 作为服务运行时,获取 C++ 中的当前登录用户名不显示任何内容

c - 如何在过滤器驱动程序中获取磁盘驱动器序列号?

windows - libusb-win32 : Automated installation of a driver filter

java - 支持使用 FUSE-J 在 FUSE 文件系统中进行写操作

c - 指针和局部变量