驱动程序开发网技术社区 » 文件系统(过滤)驱动程序开发 » ntfs格式的上千个小文件拷贝时死锁问题 转到动态网页
本页主题: ntfs格式的上千个小文件拷贝时死锁问题 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

yyy_3
级别: 驱动牛犊

查看作者资料 发送短消息加为好友 对该用户使用道具
精华: 0
发帖: 27
威望: 22 点
积分: 220 分
贡献值: 0 点
好评度: 22 点
原创分: 0 分
注册时间:2004-03-16
最后登录:2008-05-05
引用回复这个帖子 推荐此帖


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


我仿照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的上千个小文件拷贝时才死锁? 谁遇到过?



顶端 Posted:2008-05-04 16:44 | [楼 主]
llj2655506
级别: 驱动牛犊

查看作者资料 发送短消息加为好友 对该用户使用道具
精华: 0
发帖: 25
威望: 26 点
积分: 250 分
贡献值: 0 点
好评度: 25 点
原创分: 0 分
注册时间:2007-03-27
最后登录:2008-05-07
引用回复这个帖子 推荐此帖



死机了把DUMP拿出来看看啊。

驱网无线,快乐无限
顶端 Posted:2008-05-05 10:57 | 1 楼
yyy_3
级别: 驱动牛犊

查看作者资料 发送短消息加为好友 对该用户使用道具
精华: 0
发帖: 27
威望: 22 点
积分: 220 分
贡献值: 0 点
好评度: 22 点
原创分: 0 分
注册时间:2004-03-16
最后登录:2008-05-05
引用回复这个帖子 推荐此帖



是死机, 不是蓝屏.
估计没有dump文件吧.

顶端 Posted:2008-05-05 11:58 | 2 楼
chenzhenwang
级别: 驱动牛犊

查看作者资料 发送短消息加为好友 对该用户使用道具
精华: 0
发帖: 6
威望: 3 点
积分: 30 分
贡献值: 0 点
好评度: 3 点
原创分: 0 分
注册时间:2004-04-02
最后登录:2008-05-12
引用回复这个帖子 推荐此帖



顶一下

顶端 Posted:2008-05-12 09:34 | 3 楼
GoodOnline
级别: 驱动小牛

查看作者资料 发送短消息加为好友 对该用户使用道具
精华: 0
发帖: 151
威望: 152 点
积分: 1360 分
贡献值: 0 点
好评度: 151 点
原创分: 0 分
注册时间:2007-04-11
最后登录:2008-05-12
引用回复这个帖子 推荐此帖



没有dump,就自己生成一个 .dump

顶端 Posted:2008-05-12 10:00 | 4 楼
chenzhenwang
级别: 驱动牛犊

查看作者资料 发送短消息加为好友 对该用户使用道具
精华: 0
发帖: 6
威望: 3 点
积分: 30 分
贡献值: 0 点
好评度: 3 点
原创分: 0 分
注册时间:2004-04-02
最后登录:2008-05-12
引用回复这个帖子 推荐此帖



怎么才能自己生成一个dump,        感兴趣请GoodOnline 指教。

顶端 Posted:2008-05-12 11:01 | 5 楼

 驱动程序开发网技术社区 » 文件系统(过滤)驱动程序开发
快速发帖 顶端
内容
HTML 代码不可用

使用签名
Wind Code自动转换

字数检查 恢复数据
按 Ctrl+Enter 直接提交
表情 [更多]

Powered by PHPWind v6.0 Code © 2003-05 PHPWind
This is html template view this page faster