在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2975|回复: 1

求助: 较大文件读写时 被锁定(lock) 的问题

[复制链接]
发表于 2005-8-30 10:14:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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;
}
 楼主| 发表于 2005-8-30 15:09:16 | 显示全部楼层

求助: 较大文件读写时 被锁定(lock) 的问题

在线等,盼回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 14:44 , Processed in 0.021104 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表