我做了一个win7 64位下一个U盘过滤驱动,该驱动能实现特定厂商U盘的读写控制,但是做不到对所有的移动介质进行过滤,我尝试在注册表HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318}下加入我的过滤驱动,这样做可以过滤一切的磁盘类驱动,但是这样同样会带来一个问题,就是把主机本身的硬盘也过滤掉了,导致的结果就是系统在重启的时候起不来了,我用的是张帆《Windows驱动开发技术详解》一书中的过滤驱动代码,另外我还想实现一个功能,就是我在控制读写的同时,可以允许特定的应用程序拥有读写权限,其他应用则不可以,希望各位大佬指点指点小弟,如果有好的方案可以私聊有偿
1条回答 默认 最新
关注 让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
解答:- 如何实现特定厂商U盘的读写控制? 可以在驱动中使用硬件过滤功能,即根据设备的厂商ID进行过滤。具体步骤如下: 1)使用WPD(Windows Portable Device)API获取插入设备的信息,包括厂商ID。 2)在驱动中实现过滤函数,判断插入设备的厂商ID是否符合需求,如果符合则允许读写,否则拒绝访问。
- 如何在不影响主机硬盘的情况下,过滤所有的移动介质? 可以使用WDM(Windows Driver Model)框架中的分层驱动模型,即在驱动中添加一个叫做“过滤器驱动”的组件。过滤器驱动可以通过获取上层驱动对象的指针,来拦截所有的设备访问请求。具体步骤如下: 1)创建一个过滤器驱动,并在驱动加载过程中通过IoAttachDeviceToDeviceStackSafe函数连接到需要过滤的设备对象上。 2)在过滤器驱动中实现IRP_MJ_READ和IRP_MJ_WRITE等驱动例程,并在其中拦截设备的读写请求。 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的速度时间图像)我想问线路信息是什么