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.MaximumLength = sizeof(ShortNameBuffer);
if (!ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource,
- (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
+ BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
{
ExReleaseResourceLite(&pFcb->MainResource);
- return VfatQueueRequest(IrpContext);
+ return STATUS_PENDING;
}
while ((Status == STATUS_SUCCESS) && (BufferLength > 0))
return Status;
}
-NTSTATUS VfatNotifyChangeDirectory(PVFAT_IRP_CONTEXT * IrpContext)
+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;
+ Stack = IrpContext->Stack;
+ pVcb = IrpContext->DeviceExt;
+ pFcb = (PVFATFCB) IrpContext->FileObject->FsContext;
FsRtlNotifyFullChangeDirectory(pVcb->NotifySync,
&(pVcb->NotifyList),
- (*IrpContext)->FileObject->FsContext2,
+ IrpContext->FileObject->FsContext2,
(PSTRING)&(pFcb->PathNameU),
BooleanFlagOn(Stack->Flags, SL_WATCH_TREE),
FALSE,
Stack->Parameters.NotifyDirectory.CompletionFilter,
- (*IrpContext)->Irp,
+ IrpContext->Irp,
NULL,
NULL);
- /* We don't need the IRP context as we won't handle IRP completion */
- VfatFreeIrpContext(*IrpContext);
- *IrpContext = NULL;
+ /* We won't handle IRP completion */
+ IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
return STATUS_PENDING;
}
break;
case IRP_MN_NOTIFY_CHANGE_DIRECTORY:
- Status = VfatNotifyChangeDirectory(&IrpContext);
+ Status = VfatNotifyChangeDirectory(IrpContext);
break;
default:
break;
}
- if (Status == STATUS_PENDING)
+ if (Status == STATUS_PENDING && IrpContext->Flags & IRPCONTEXT_COMPLETE)
{
- /* Only queue if there's IRP context */
- if (IrpContext)
- {
- Status = VfatQueueRequest(IrpContext);
- }
- }
- else
- {
- IrpContext->Irp->IoStatus.Status = Status;
- IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
- VfatFreeIrpContext(IrpContext);
+ return VfatMarkIrpContextForQueue(IrpContext);
}
return Status;