|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
教一个问题:
在写一个文件a时,创建一个文件b,把文件a的数据copy到文件b,copy数据到文件b时,先不管新写
入的数据。
我在 文件a的 IRP_MJ_WRITE 中用如下函数实现,出现了如下问题:
当文件a较小(我试了4kB)的时候,copy文件a的内容到文件b正常,新数据也能写到文件a中;
但是当文件a较大时(我试了2mB以上),copy文件a的内容到文件b正常, BUT,新数据不能写道文件a
中,
提示错误信息: “process cannot access the file because another process has locked a
portion of the file”
哪位大侠知道,请赐教,谢谢阿!
NTSTATUS
FilemonHookRoutine(
PDEVICE_OBJECT HookDevice,
IN PIRP Irp
)
{
...
switch( currentIrpStack->MajorFunction )
{
...
case IRP_MJ_WRITE:
CopyFileWhenWrite(....);
break;
case ... : .....
....
....
}
CopyFileWhenWrite(。。。)
{
//创建新文件b
InitializeObjectAttributes(
&ObjectAttributes,
&DestFileUnicode,
... );
Status = ZwCreateFile(
&fileHandle,
GENERIC_WRITE|FILE_WRITE_DATA | SYNCHRONIZE |FILE_APPEND_DATA,
&ObjectAttributes,
&IoStatusBlock, ...
);
}
//循环从文件a 读出数据,write到文件b中
do{
MyAllocReadIrp(FileSystem,TemBuffer,READWRITELEN,startoffset ...);
ZwWriteFile(
fileHandle,
NULL,
NULL,
NULL,
&IoStatusBlock,
TemBuffer,
IoStatusBlockR.Information,
&startoffset,
NULL );
}
while(文件a未结束);
//关闭文件b句柄; 注意:我没有打开文件a,只是构造同步irp读取文件a内容,所以不需要关闭文
件
//a句柄。
ZwClose( fileHandle );
}
以下是MyAllocReadIrp()函数的描述:
MyAllocReadIrp(...)
{
//构造同步irp读取文件a的内容
Irp= IoBuildSynchronousFsdRequest(IRP_MJ_READ,
TargetDeviceObject ,
ReadBuffer,
Readlen,
&startingOffset,
&event,
ioStatus );
Irp->Flags |= IRP_NOCACHE;
ioStackLocation = IoGetNextIrpStackLocation(Irp);
ioStackLocation->FileObject = fileobj;
//调用下一层驱动处理该irp;
status = IoCallDriver(TargetDeviceObject,Irp);
if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL/*&timeout*/);
status = ioStatus->Status;
}
return status;
} |
|