阅读:1375回复:5
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的上千个小文件拷贝时才死锁? 谁遇到过? |
|
沙发#
发布于:2008-05-05 10:57
死机了把DUMP拿出来看看啊。
|
|
|
板凳#
发布于:2008-05-05 11:58
是死机, 不是蓝屏.
估计没有dump文件吧. |
|
地板#
发布于:2008-05-12 09:34
顶一下
|
|
地下室#
发布于:2008-05-12 10:00
没有dump,就自己生成一个 .dump
|
|
5楼#
发布于:2008-05-12 11:01
怎么才能自己生成一个dump, 感兴趣请GoodOnline 指教。
|
|