PIRP Irp)
{
PNTFS_IRP_CONTEXT IrpContext;
- PIO_STACK_LOCATION IoStackLocation;
TRACE_(NTFS, "NtfsAllocateIrpContext()\n");
IrpContext->Identifier.Size = sizeof(NTFS_IRP_CONTEXT);
IrpContext->Irp = Irp;
IrpContext->DeviceObject = DeviceObject;
-
- if (Irp)
+ IrpContext->Stack = IoGetCurrentIrpStackLocation(Irp);
+ IrpContext->MajorFunction = IrpContext->Stack->MajorFunction;
+ IrpContext->MinorFunction = IrpContext->Stack->MinorFunction;
+ IrpContext->FileObject = IrpContext->Stack->FileObject;
+ IrpContext->IsTopLevel = (IoGetTopLevelIrp() == Irp);
+ IrpContext->PriorityBoost = IO_NO_INCREMENT;
+
+ if (IrpContext->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL ||
+ IrpContext->MajorFunction == IRP_MJ_DEVICE_CONTROL ||
+ IrpContext->MajorFunction == IRP_MJ_SHUTDOWN ||
+ (IrpContext->MajorFunction != IRP_MJ_CLEANUP &&
+ IrpContext->MajorFunction != IRP_MJ_CLOSE &&
+ IoIsOperationSynchronous(Irp)))
{
- IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
- ASSERT(IoStackLocation);
-
- IrpContext->MajorFunction = IoStackLocation->MajorFunction;
- IrpContext->MinorFunction = IoStackLocation->MinorFunction;
- IrpContext->IsTopLevel = (IoGetTopLevelIrp() == Irp);
+ IrpContext->Flags |= IRPCONTEXT_CANWAIT;
}
return IrpContext;