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