U盘过滤驱动
小弟正在做一个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;
}