yyy_3
驱动牛犊
驱动牛犊
  • 注册日期2004-03-16
  • 最后登录2012-02-20
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望305点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:1375回复:5

ntfs格式的上千个小文件拷贝时死锁问题

楼主#
更多 发布于:2008-05-04 16:44
我仿照filemon做了一个文件过滤驱动,其实什么都没有做, 就是对u盘上的文件操作进行审计, 有irp 和fastio处理. 没有加解密, 没有阻止irp, 非常简单.
但就是在拷贝上千个小文件在u盘上时会死机, 而且u盘必须是ntfs时才会死机.

我怀疑是死锁.
我怀疑是2个函数出问题, 这2个函数是用来取得当前文件名的.
BOOLEAN
PcmonQueryFile(
    PDEVICE_OBJECT DeviceObject,
    PFILE_OBJECT FileObject,
    FILE_INFORMATION_CLASS FileInformationClass,
    PVOID FileQueryBuffer,
    ULONG FileQueryBufferLength
    )
{
    PIRP irp;
    KEVENT event;
    IO_STATUS_BLOCK IoStatusBlock;
    PIO_STACK_LOCATION ioStackLocation;


//    DbgPrint("PcmonQueryFile!\n");
    KeInitializeEvent(&event, SynchronizationEvent, FALSE);

    irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
    if(!irp) {

        return FALSE;
    }
  
    irp->AssociatedIrp.SystemBuffer = FileQueryBuffer;
    irp->UserEvent = &event;
    irp->UserIosb = &IoStatusBlock;
    irp->Tail.Overlay.Thread = PsGetCurrentThread();
    irp->Tail.Overlay.OriginalFileObject = FileObject;
    irp->RequestorMode = KernelMode;
    irp->Flags = 0;

    ioStackLocation = IoGetNextIrpStackLocation(irp);
    ioStackLocation->MajorFunction = IRP_MJ_QUERY_INFORMATION;
    ioStackLocation->DeviceObject = DeviceObject;
    ioStackLocation->FileObject = FileObject;
    ioStackLocation->Parameters.QueryFile.Length = FileQueryBufferLength;
    ioStackLocation->Parameters.QueryFile.FileInformationClass = FileInformationClass;

    IoSetCompletionRoutine(irp, PcmonQueryFileComplete, 0, TRUE, TRUE, TRUE);

    (void) IoCallDriver(DeviceObject, irp);

    KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);

    return NT_SUCCESS( IoStatusBlock.Status );
}

NTSTATUS PcmonQueryFileComplete( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context )
{
    *Irp->UserIosb = Irp->IoStatus;
    if( !NT_SUCCESS(Irp->IoStatus.Status) ) {

        //DbgPrint(("   ERROR ON IRP: %x\n", Irp->IoStatus.Status ));
    }
    
    KeSetEvent(Irp->UserEvent, 0, FALSE);
    
    IoFreeIrp(Irp);
    
    return STATUS_MORE_PROCESSING_REQUIRED;
}

还有一个函数PcmonGetFullPath()调用PcmonQueryFile(), 太长, 就不贴出来了.

以上有什么错误? 为什么只在ntfs的上千个小文件拷贝时才死锁? 谁遇到过?


llj2655506
驱动牛犊
驱动牛犊
  • 注册日期2007-03-27
  • 最后登录2009-06-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望27点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-05-05 10:57
死机了把DUMP拿出来看看啊。
驱网无线,快乐无限
yyy_3
驱动牛犊
驱动牛犊
  • 注册日期2004-03-16
  • 最后登录2012-02-20
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望305点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-05-05 11:58
是死机, 不是蓝屏.
估计没有dump文件吧.
chenzhenwang
驱动牛犊
驱动牛犊
  • 注册日期2004-04-02
  • 最后登录2008-05-15
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-05-12 09:34
顶一下
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-05-12 10:00
没有dump,就自己生成一个 .dump
chenzhenwang
驱动牛犊
驱动牛犊
  • 注册日期2004-04-02
  • 最后登录2008-05-15
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-05-12 11:01
怎么才能自己生成一个dump,        感兴趣请GoodOnline 指教。
游客

返回顶部