U盘过滤驱动

walker34 2019-01-11 02:29:02
小弟正在做一个U盘过滤驱动。
参考的是《Windows内核安全与驱动开发》一书中的DP(D盘还原驱动)驱动。是一个卷设备过滤驱动。
读取数据是时解密,写入数据时加密。
现在遇到一个问题:
在win7系统上,格式化为fat系统,则会导致数据被破坏。提示信息是“位置不可用 无法访问E:\xxx\xx 文件或目录损坏切无法读取”文件夹打不开,exe无法运行。在xp系统上没问题。并且ntfs文件系统也没有这个问题。

代码:
static NTSTATUS ReadIrpComp(
PDEVICE_OBJECT dev,
PIRP Irp,
PVOID context
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
//irp stack指针
PIO_STACK_LOCATION Irpsp = NULL;
//irp中包括的数据地址
PBYTE sysBuf = NULL;
PBYTE orgBuf = NULL;
//irp中的数据长度
ULONG length = 0;
//irp要处理的偏移量
LARGE_INTEGER offset = { 0 };

//将传入的上下文参数转化为一个内核事件对象
//PKEVENT rEvent = (PKEVENT) context;

if (Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
}

Irpsp = IoGetCurrentIrpStackLocation(Irp);

ntStatus = Irp->IoStatus.Status;
if (!NT_SUCCESS(ntStatus))
{
ntStatus = Irp->IoStatus.Status;
}

if (NULL == Irp->MdlAddress)
sysBuf = (PBYTE)Irp->UserBuffer;
else
sysBuf = (PBYTE)MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

offset = Irpsp->Parameters.Read.ByteOffset;
length = Irpsp->Parameters.Read.Length;

//申请内存
orgBuf = ExAllocatePool(NonPagedPool, length);
RtlZeroBytes(orgBuf, length);

XORtest(sysBuf, length, orgBuf);
RtlCopyMemory(sysBuf, orgBuf, length);

ExFreePool(orgBuf);

//设置这个对象,唤醒等待它的进程
//KeSetEvent(rEvent, IO_NO_INCREMENT, FALSE);
return STATUS_CONTINUE_COMPLETION;
}

...全文
398 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
walker34 2019-01-17
  • 打赏
  • 举报
回复
引用 2 楼 Eleven 的回复:
上层应用找不到文件路径?

感谢版主的关注,问题解决了,就是我上面的说的那个原因。一个原则就是透明加密驱动必须时刻保持内存中的数据是未加密的。
walker34 2019-01-17
  • 打赏
  • 举报
回复
引用 2 楼 Eleven 的回复:
上层应用找不到文件路径?


不是,U盘接入后,系统要花很久才能识别到里面的文件系统。我用winhex查看了U盘上的数据。发现fat1表是加密的数据,fat2是没加密的数据。所以导致系统无法识别。但是fat1表和fat2表都应该是加密数据才对。由此推断,fat2不是没有加密,而是被异或加密了两次。导致这个地问题的原因是,我在IRP_MJ_WRITE处理函数里面,直接修改了mdl里面的数据,导致上层的数据被修改,更新fat2表时与fat1表使用的是一个缓存。

Eleven 2019-01-16
  • 打赏
  • 举报
回复
上层应用找不到文件路径?
walker34 2019-01-11
  • 打赏
  • 举报
回复
求支援,求支援!!!

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧