return VfatQueryVolumeInformation(IrpContext);
case IRP_MJ_SET_VOLUME_INFORMATION:
return VfatSetVolumeInformation(IrpContext);
+ case IRP_MJ_LOCK_CONTROL:
+ return VfatLockControl(IrpContext);
case IRP_MJ_CLEANUP:
return VfatCleanup(IrpContext);
+ case IRP_MJ_FLUSH_BUFFERS:
+ return VfatFlush(IrpContext);
default:
DPRINT1 ("Unexpected major function %x\n", IrpContext->MajorFunction);
IrpContext->Irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR;
}
}
+NTSTATUS VfatLockControl(
+ IN PVFAT_IRP_CONTEXT IrpContext
+ )
+{
+ PVFATFCB Fcb;
+ PVFATCCB Ccb;
+ NTSTATUS Status;
+
+ DPRINT("VfatLockControl(IrpContext %x)\n", IrpContext);
+
+ assert(IrpContext);
+
+ Ccb = (PVFATCCB)IrpContext->FileObject->FsContext2;
+ Fcb = Ccb->pFcb;
+
+ if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
+ {
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ goto Fail;
+ }
+
+ if (Fcb->entry.Attrib & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ Status = STATUS_INVALID_PARAMETER;
+ goto Fail;
+ }
+
+ Status = FsRtlProcessFileLock(&Fcb->FileLock,
+ IrpContext->Irp,
+ NULL
+ );
+
+ VfatFreeIrpContext(IrpContext);
+ return Status;
+
+Fail:;
+ IrpContext->Irp->IoStatus.Status = Status;
+ IofCompleteRequest(IrpContext->Irp, NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT);
+ VfatFreeIrpContext(IrpContext);
+ return Status;
+}
NTSTATUS STDCALL VfatBuildRequest (
IN PDEVICE_OBJECT DeviceObject,
VOID VfatFreeIrpContext (PVFAT_IRP_CONTEXT IrpContext)
{
assert (IrpContext);
- ExFreePool(IrpContext);
+ ExFreeToNPagedLookasideList(&VfatGlobalData->IrpContextLookasideList, IrpContext);
}
PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp)
assert (DeviceObject);
assert (Irp);
- IrpContext = ExAllocatePool (NonPagedPool, sizeof(VFAT_IRP_CONTEXT));
+ IrpContext = ExAllocateFromNPagedLookasideList(&VfatGlobalData->IrpContextLookasideList);
if (IrpContext)
{
RtlZeroMemory(IrpContext, sizeof(IrpContext));