U盘过滤驱动

walker34 walker34 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
小弟正在做一个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;
}

...全文

相关推荐

评论 4
收藏 已收藏
分享
返回顶部
walker34
硬件/系统 2,644 成员 17,229 内容