godss1 2021-06-17 19:30 采纳率: 0%
浏览 28

关于windows下WDM式U盘过滤驱动如何过滤除系统硬盘之外的一切移动介质的问题

我做了一个win7 64位下一个U盘过滤驱动,该驱动能实现特定厂商U盘的读写控制,但是做不到对所有的移动介质进行过滤,我尝试在注册表HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318}下加入我的过滤驱动,这样做可以过滤一切的磁盘类驱动,但是这样同样会带来一个问题,就是把主机本身的硬盘也过滤掉了,导致的结果就是系统在重启的时候起不来了,我用的是张帆《Windows驱动开发技术详解》一书中的过滤驱动代码,另外我还想实现一个功能,就是我在控制读写的同时,可以允许特定的应用程序拥有读写权限,其他应用则不可以,希望各位大佬指点指点小弟,如果有好的方案可以私聊有偿

  • 写回答

1条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-16 15:28
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    解答:
    1. 如何实现特定厂商U盘的读写控制? 可以在驱动中使用硬件过滤功能,即根据设备的厂商ID进行过滤。具体步骤如下: 1)使用WPD(Windows Portable Device)API获取插入设备的信息,包括厂商ID。 2)在驱动中实现过滤函数,判断插入设备的厂商ID是否符合需求,如果符合则允许读写,否则拒绝访问。
    2. 如何在不影响主机硬盘的情况下,过滤所有的移动介质? 可以使用WDM(Windows Driver Model)框架中的分层驱动模型,即在驱动中添加一个叫做“过滤器驱动”的组件。过滤器驱动可以通过获取上层驱动对象的指针,来拦截所有的设备访问请求。具体步骤如下: 1)创建一个过滤器驱动,并在驱动加载过程中通过IoAttachDeviceToDeviceStackSafe函数连接到需要过滤的设备对象上。 2)在过滤器驱动中实现IRP_MJ_READ和IRP_MJ_WRITE等驱动例程,并在其中拦截设备的读写请求。 3)在过滤器驱动中判断请求所属的设备类型,如果是要过滤的设备类型,则允许访问,否则拒绝访问。
    3. 如何实现对特定应用程序的读写控制? 可以在驱动中使用进程过滤功能,即根据进程ID进行过滤。具体步骤如下: 1)在过滤器驱动中实现IRP_MJ_CREATE和IRP_MJ_CLOSE等驱动例程,并在其中获取访问请求所属的进程ID。 2)判断进程ID是否在允许的应用程序列表中,如果在,则允许访问,否则拒绝访问。 3)在驱动中提供一个接口,用于动态添加或移除允许访问的应用程序ID。 代码示例(简化版):
    // 驱动中添加一个结构体,用于保存允许访问的进程ID列表
    typedef struct _PROCESS_ACCESS_LIST {
        ULONG Count;
        ULONG ProcessId[MAX_PROCESS_COUNT];
    } PROCESS_ACCESS_LIST, *PPROCESS_ACCESS_LIST;
    // 驱动中添加一个接口函数,用于修改进程ID列表
    NTSTATUS AddAllowedProcessId(ULONG ProcessIdToAdd);
    NTSTATUS RemoveAllowedProcessId(ULONG ProcessIdToRemove);
    // 驱动中实现过滤器驱动的例程
    NTSTATUS FilterDispatchCreate(PDEVICE_OBJECT DeviceObject, PIRP irp) {
        // 获取进程ID
        ULONG ProcessId = PsGetCurrentProcessId();
        // 判断进程ID是否在允许的列表中
        if (!IsProcessAllowed(ProcessId)) {
            // 不在列表中则拒绝访问
            irp->IoStatus.Status = STATUS_ACCESS_DENIED;
            IoCompleteRequest(irp, IO_NO_INCREMENT);
            return STATUS_ACCESS_DENIED;
        }
        // 在列表中则允许访问
        return FilterDispatchPassThrough(DeviceObject, irp);
    }
    // 驱动中实现修改进程ID列表的接口函数
    NTSTATUS AddAllowedProcessId(ULONG ProcessIdToAdd) {
        // 判断进程ID是否已经在列表中
        for (ULONG i = 0; i < g_ProcessAccessList.Count; i++) {
            if (g_ProcessAccessList.ProcessId[i] == ProcessIdToAdd) {
                // 已经在列表中则返回成功
                return STATUS_SUCCESS;
            }
        }
        // 如果列表已满则返回错误
        if (g_ProcessAccessList.Count >= MAX_PROCESS_COUNT) {
            return STATUS_INSUFFICIENT_RESOURCES;
        }
        // 添加进程ID到列表中
        g_ProcessAccessList.ProcessId[g_ProcessAccessList.Count++] = ProcessIdToAdd;
        return STATUS_SUCCESS;
    }
    NTSTATUS RemoveAllowedProcessId(ULONG ProcessIdToRemove) {
        // 查找进程ID在列表中的位置
        ULONG IndexToRemove = -1;
        for (ULONG i = 0; i < g_ProcessAccessList.Count; i++) {
            if (g_ProcessAccessList.ProcessId[i] == ProcessIdToRemove) {
                IndexToRemove = i;
                break;
            }
        }
        // 如果进程ID不在列表中则返回错误
        if (IndexToRemove == -1) {
            return STATUS_NOT_FOUND;
        }
        // 从列表中移除进程ID
        g_ProcessAccessList.Count--;
        for (ULONG i = IndexToRemove; i < g_ProcessAccessList.Count; i++) {
            g_ProcessAccessList.ProcessId[i] = g_ProcessAccessList.ProcessId[i + 1];
        }
        return STATUS_SUCCESS;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么