VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference) { PAGED_CODE(); ASSERT(STATUS_PENDING != Result); ASSERT(0 == (FSP_STATUS_PRIVATE_BIT & Result)); if (0 != FspIrpRequest(Irp)) { FspIopDeleteRequest(FspIrpRequest(Irp)); FspIrpSetRequest(Irp, 0); } /* get the device object out of the IRP before completion */ PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); PDEVICE_OBJECT DeviceObject = IrpSp->DeviceObject; /* * HACK: * * We update the Create statistics here to avoid doing it in multiple places. */ if (IRP_MJ_CREATE == IrpSp->MajorFunction) { /* only update statistics if we actually have a reference to the DeviceObject */ if (DeviceDereference) { FSP_DEVICE_EXTENSION *DeviceExtension = FspDeviceExtension(DeviceObject); if (FspFsvolDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind) { FSP_STATISTICS *Statistics = FspStatistics( ((FSP_FSVOL_DEVICE_EXTENSION *)DeviceExtension)->Statistics); FspStatisticsInc(Statistics, Specific.CreateHits); if (STATUS_SUCCESS == Result) FspStatisticsInc(Statistics, Specific.SuccessfulCreates); else FspStatisticsInc(Statistics, Specific.FailedCreates); } } } if (STATUS_SUCCESS != Result && STATUS_REPARSE != Result && STATUS_OPLOCK_BREAK_IN_PROGRESS != Result && STATUS_BUFFER_OVERFLOW != Result && STATUS_SHARING_VIOLATION != Result) Irp->IoStatus.Information = 0; Irp->IoStatus.Status = Result; IoCompleteRequest(Irp, FSP_IO_INCREMENT); if (DeviceDereference) FspDeviceDereference(DeviceObject); }
NTSTATUS FspSetVolumeInformation( PDEVICE_OBJECT DeviceObject, PIRP Irp) { FSP_ENTER_MJ(PAGED_CODE()); switch (FspDeviceExtension(DeviceObject)->Kind) { case FspFsvolDeviceExtensionKind: FSP_RETURN(Result = FspFsvolSetVolumeInformation(DeviceObject, Irp, IrpSp)); default: FSP_RETURN(Result = STATUS_INVALID_DEVICE_REQUEST); } FSP_LEAVE_MJ("%s", FsInformationClassSym(IrpSp->Parameters.SetVolume.FsInformationClass)); }
NTSTATUS FspSetSecurity( PDEVICE_OBJECT DeviceObject, PIRP Irp) { FSP_ENTER_MJ(PAGED_CODE()); switch (FspDeviceExtension(DeviceObject)->Kind) { case FspFsvolDeviceExtensionKind: FSP_RETURN(Result = FspFsvolSetSecurity(DeviceObject, Irp, IrpSp)); default: FSP_RETURN(Result = STATUS_INVALID_DEVICE_REQUEST); } FSP_LEAVE_MJ("FileObject=%p, SecurityInformation=%x", IrpSp->FileObject, IrpSp->Parameters.SetSecurity.SecurityInformation); }
NTSTATUS FspLockControl( PDEVICE_OBJECT DeviceObject, PIRP Irp) { FSP_ENTER_MJ(PAGED_CODE()); switch (FspDeviceExtension(DeviceObject)->Kind) { case FspFsvolDeviceExtensionKind: FSP_RETURN(Result = FspFsvolLockControl(DeviceObject, Irp, IrpSp)); default: FSP_RETURN(Result = STATUS_INVALID_DEVICE_REQUEST); } FSP_LEAVE_MJ("FileObject=%p, " "Key=%#lx, ByteOffset=%#lx:%#lx, Length=%lld", IrpSp->FileObject, IrpSp->Parameters.LockControl.Key, IrpSp->Parameters.LockControl.ByteOffset.HighPart, IrpSp->Parameters.LockControl.ByteOffset.LowPart, IrpSp->Parameters.LockControl.Length->QuadPart); }