ProbeForWrite(IrpContext->Irp->UserBuffer, BufferLength, 1);
}
#endif
- Buffer = VfatGetUserBuffer(IrpContext->Irp);
+ Buffer = VfatGetUserBuffer(IrpContext->Irp, FALSE);
if (!ExAcquireResourceSharedLite(&pFcb->MainResource,
- (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
+ BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
{
Status = VfatLockUserBuffer(IrpContext->Irp, BufferLength, IoWriteAccess);
if (NT_SUCCESS(Status))
DirContext.ShortNameU.Buffer = ShortNameBuffer;
DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer);
+ if (!ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource,
+ BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
+ {
+ ExReleaseResourceLite(&pFcb->MainResource);
+ return STATUS_PENDING;
+ }
+
while ((Status == STATUS_SUCCESS) && (BufferLength > 0))
{
Status = FindFile(IrpContext->DeviceExt,
IrpContext->Irp->IoStatus.Information = Stack->Parameters.QueryDirectory.Length - BufferLength;
}
+ ExReleaseResourceLite(&IrpContext->DeviceExt->DirResource);
ExReleaseResourceLite(&pFcb->MainResource);
return Status;
}
+NTSTATUS VfatNotifyChangeDirectory(PVFAT_IRP_CONTEXT IrpContext)
+{
+ PVCB pVcb;
+ PVFATFCB pFcb;
+ PIO_STACK_LOCATION Stack;
+ Stack = IrpContext->Stack;
+ pVcb = IrpContext->DeviceExt;
+ pFcb = (PVFATFCB) IrpContext->FileObject->FsContext;
+
+ FsRtlNotifyFullChangeDirectory(pVcb->NotifySync,
+ &(pVcb->NotifyList),
+ IrpContext->FileObject->FsContext2,
+ (PSTRING)&(pFcb->PathNameU),
+ BooleanFlagOn(Stack->Flags, SL_WATCH_TREE),
+ FALSE,
+ Stack->Parameters.NotifyDirectory.CompletionFilter,
+ IrpContext->Irp,
+ NULL,
+ NULL);
+
+ /* We won't handle IRP completion */
+ IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
+
+ return STATUS_PENDING;
+}
/*
* FUNCTION: directory control : read/write directory informations
break;
case IRP_MN_NOTIFY_CHANGE_DIRECTORY:
- DPRINT("VFAT, dir : change\n");
- Status = STATUS_NOT_IMPLEMENTED;
+ Status = VfatNotifyChangeDirectory(IrpContext);
break;
default:
break;
}
- if (Status == STATUS_PENDING)
- {
- Status = VfatQueueRequest(IrpContext);
- }
- else
+ if (Status == STATUS_PENDING && IrpContext->Flags & IRPCONTEXT_COMPLETE)
{
- IrpContext->Irp->IoStatus.Status = Status;
- IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
- VfatFreeIrpContext(IrpContext);
+ return VfatMarkIrpContextForQueue(IrpContext);
}
return Status;