NTSTATUS NTAPI FatLockControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PFAT_IRP_CONTEXT IrpContext; NTSTATUS Status; BOOLEAN TopLevel; DPRINT1("FatLockControl()\n"); /* Enter FsRtl critical region */ FsRtlEnterFileSystem(); /* Set Top Level IRP if not set */ TopLevel = FatIsTopLevelIrp(Irp); /* Build an irp context */ IrpContext = FatBuildIrpContext(Irp, IoIsOperationSynchronous(Irp)); /* Call internal function */ Status = FatiLockControl(IrpContext, Irp); /* Reset Top Level IRP */ if (TopLevel) IoSetTopLevelIrp(NULL); /* Leave FsRtl critical region */ FsRtlExitFileSystem(); return Status; }
NTSTATUS NTAPI FatFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { NTSTATUS Status = STATUS_SUCCESS; PFAT_IRP_CONTEXT IrpContext; BOOLEAN CanWait = TRUE; DPRINT("FatFileSystemControl(DeviceObject %p, Irp %p)\n", DeviceObject, Irp); /* Get CanWait flag */ if (IoGetCurrentIrpStackLocation(Irp)->FileObject) { CanWait = IoIsOperationSynchronous(Irp); } /* Enter FsRtl critical region */ FsRtlEnterFileSystem(); /* Build an irp context */ IrpContext = FatBuildIrpContext(Irp, CanWait); /* Call internal function */ Status = FatiFileSystemControl(IrpContext, Irp); /* Leave FsRtl critical region */ FsRtlExitFileSystem(); return Status; }
NTSTATUS DfsFsdCleanup ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { NTSTATUS Status; PIRP_CONTEXT IrpContext; PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp ); PFILE_OBJECT FileObject = IrpSp->FileObject; TYPE_OF_OPEN TypeOfOpen; PDFS_VCB Vcb; PDFS_FCB Fcb; DfsDbgTrace(+1, Dbg, "DfsFsdCleanup: Entered\n", 0); ASSERT(IoIsOperationSynchronous(Irp) == TRUE); // // Now, pass through to the device that opened the file for us if the // file was a redirected open of some kind. // if (DeviceObject->DeviceType == FILE_DEVICE_DFS) { TypeOfOpen = DfsDecodeFileObject( FileObject, &Vcb, &Fcb); if (TypeOfOpen == RedirectedFileOpen) { Status = DfsVolumePassThrough(DeviceObject, Irp); DfsDbgTrace(-1, Dbg, "DfsFsdCleanup: RedirectedOpen.Exit -> %08lx\n", Status ); return Status; } } // // TypeOfOpen != RedirectedFileOpen. We do nothing special for cleanup; // everything is done in the close routine. // FsRtlEnterFileSystem(); Status = STATUS_SUCCESS; DfsCompleteRequest( NULL, Irp, Status ); FsRtlExitFileSystem(); // // And return to our caller // DfsDbgTrace(-1, Dbg, "DfsFsdCleanup: Exit -> %08lx\n", Status); return Status; }
static NTSTATUS FspFsvolWrite( PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) { PAGED_CODE(); /* is this a valid FileObject? */ if (!FspFileNodeIsValid(IrpSp->FileObject->FsContext)) return STATUS_INVALID_DEVICE_REQUEST; NTSTATUS Result; PFILE_OBJECT FileObject = IrpSp->FileObject; FSP_FILE_NODE *FileNode = FileObject->FsContext; /* is this an MDL complete request? */ if (FlagOn(IrpSp->MinorFunction, IRP_MN_COMPLETE)) { Result = FspCcMdlWriteComplete(FileObject, &IrpSp->Parameters.Write.ByteOffset, Irp->MdlAddress); Irp->MdlAddress = 0; return Result; } /* only regular files can be written */ if (FileNode->IsDirectory) return STATUS_INVALID_PARAMETER; /* do we have anything to write? */ if (0 == IrpSp->Parameters.Write.Length) { Irp->IoStatus.Information = 0; return STATUS_SUCCESS; } /* are we doing cached or non-cached I/O? */ if (FlagOn(FileObject->Flags, FO_CACHE_SUPPORTED) && !FlagOn(Irp->Flags, IRP_PAGING_IO | IRP_NOCACHE)) Result = FspFsvolWriteCached(FsvolDeviceObject, Irp, IrpSp, IoIsOperationSynchronous(Irp)); else Result = FspFsvolWriteNonCached(FsvolDeviceObject, Irp, IrpSp, IoIsOperationSynchronous(Irp)); return Result; }
NTSTATUS DfsFsdClose ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp ); NTSTATUS Status; PIRP_CONTEXT IrpContext; DfsDbgTrace(+1, Dbg, "DfsFsdClose: Entered\n", 0); ASSERT(IoIsOperationSynchronous(Irp) == TRUE); if (DeviceObject->DeviceType == FILE_DEVICE_DFS_VOLUME) { if (DfsLookupFcb(IrpSp->FileObject) == NULL) { Status = DfsVolumePassThrough(DeviceObject, Irp); DfsDbgTrace(-1, Dbg, "DfsFsdClose: Exit -> %08lx\n", Status ); return Status; } } // // Call the common close routine, with blocking allowed if synchronous // FsRtlEnterFileSystem(); try { IrpContext = DfsCreateIrpContext( Irp, CanFsdWait( Irp ) ); Status = DfsCommonClose( IrpContext, Irp ); } except(DfsExceptionFilter( IrpContext, GetExceptionCode(), GetExceptionInformation() )) { // // We had some trouble trying to perform the requested // operation, so we'll abort the I/O request with // the error status that we get back from the // execption code // Status = DfsProcessException( IrpContext, Irp, GetExceptionCode() ); } FsRtlExitFileSystem(); // // And return to our caller // DfsDbgTrace(-1, Dbg, "DfsFsdClose: Exit -> %08lx\n", Status); return Status; }
static NTSTATUS FspFsvolLockControl( PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) { PAGED_CODE(); /* is this a valid FileObject? */ if (!FspFileNodeIsValid(IrpSp->FileObject->FsContext)) return STATUS_INVALID_DEVICE_REQUEST; NTSTATUS Result; PFILE_OBJECT FileObject = IrpSp->FileObject; FSP_FILE_NODE *FileNode = FileObject->FsContext; /* only regular files can be locked */ if (FileNode->IsDirectory) return STATUS_INVALID_PARAMETER; Result = FspFsvolLockControlRetry(FsvolDeviceObject, Irp, IrpSp, IoIsOperationSynchronous(Irp)); return Result; }
/* * FUNCTION: Allocate and fill an NTFS_IRP_CONTEXT struct in order to use it for IRP * ARGUMENTS: * DeviceObject = Used to fill in struct * Irp = The IRP that need IRP_CONTEXT struct * RETURNS: NULL or PNTFS_IRP_CONTEXT */ PNTFS_IRP_CONTEXT NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PNTFS_IRP_CONTEXT IrpContext; TRACE_(NTFS, "NtfsAllocateIrpContext()\n"); IrpContext = (PNTFS_IRP_CONTEXT)ExAllocateFromNPagedLookasideList(&NtfsGlobalData->IrpContextLookasideList); if (IrpContext == NULL) return NULL; RtlZeroMemory(IrpContext, sizeof(NTFS_IRP_CONTEXT)); IrpContext->Identifier.Type = NTFS_TYPE_IRP_CONTEXT; IrpContext->Identifier.Size = sizeof(NTFS_IRP_CONTEXT); IrpContext->Irp = Irp; IrpContext->DeviceObject = DeviceObject; 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; IrpContext->Flags = IRPCONTEXT_COMPLETE; 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))) { IrpContext->Flags |= IRPCONTEXT_CANWAIT; } return IrpContext; }
NTSTATUS NTAPI FatRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) { NTSTATUS Status; BOOLEAN TopLevel, CanWait; PFAT_IRP_CONTEXT IrpContext; CanWait = TRUE; TopLevel = FALSE; Status = STATUS_INVALID_DEVICE_REQUEST; /* Get CanWait flag */ if (IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL) CanWait = IoIsOperationSynchronous(Irp); /* Enter FsRtl critical region */ FsRtlEnterFileSystem(); if (DeviceObject != FatGlobalData.DiskDeviceObject) { /* Set Top Level IRP if not set */ TopLevel = FatIsTopLevelIrp(Irp); /* Build an irp context */ IrpContext = FatBuildIrpContext(Irp, CanWait); /* Perform the actual read */ Status = FatiRead(IrpContext); /* Restore top level Irp */ if (TopLevel) IoSetTopLevelIrp(NULL); } /* Leave FsRtl critical region */ FsRtlExitFileSystem(); return Status; }
PFFS_IRP_CONTEXT FFSAllocateIrpContext( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION IoStackLocation; PFFS_IRP_CONTEXT IrpContext; ASSERT(DeviceObject != NULL); ASSERT(Irp != NULL); IoStackLocation = IoGetCurrentIrpStackLocation(Irp); ExAcquireResourceExclusiveLite( &FFSGlobal->LAResource, TRUE); IrpContext = (PFFS_IRP_CONTEXT)(ExAllocateFromNPagedLookasideList(&(FFSGlobal->FFSIrpContextLookasideList))); ExReleaseResourceForThreadLite( &FFSGlobal->LAResource, ExGetCurrentResourceThread()); if (IrpContext == NULL) { IrpContext = ExAllocatePool(NonPagedPool, sizeof(FFS_IRP_CONTEXT)); // // Zero out the irp context and indicate that it is from pool and // not region allocated // RtlZeroMemory(IrpContext, sizeof(FFS_IRP_CONTEXT)); SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_FROM_POOL); } else { // // Zero out the irp context and indicate that it is from zone and // not pool allocated // RtlZeroMemory(IrpContext, sizeof(FFS_IRP_CONTEXT)); } if (!IrpContext) { return NULL; } IrpContext->Identifier.Type = FFSICX; IrpContext->Identifier.Size = sizeof(FFS_IRP_CONTEXT); IrpContext->Irp = Irp; IrpContext->MajorFunction = IoStackLocation->MajorFunction; IrpContext->MinorFunction = IoStackLocation->MinorFunction; IrpContext->DeviceObject = DeviceObject; IrpContext->FileObject = IoStackLocation->FileObject; if (IrpContext->FileObject != NULL) { IrpContext->RealDevice = IrpContext->FileObject->DeviceObject; } else if (IrpContext->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL) { if (IoStackLocation->Parameters.MountVolume.Vpb) { IrpContext->RealDevice = IoStackLocation->Parameters.MountVolume.Vpb->RealDevice; } } if (IrpContext->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL || IrpContext->MajorFunction == IRP_MJ_DEVICE_CONTROL || IrpContext->MajorFunction == IRP_MJ_SHUTDOWN) { IrpContext->IsSynchronous = TRUE; } else if (IrpContext->MajorFunction == IRP_MJ_CLEANUP || IrpContext->MajorFunction == IRP_MJ_CLOSE) { IrpContext->IsSynchronous = FALSE; } #if (_WIN32_WINNT >= 0x0500) else if (IrpContext->MajorFunction == IRP_MJ_PNP) { if (IoGetCurrentIrpStackLocation(Irp)->FileObject == NULL) { IrpContext->IsSynchronous = TRUE; } else { IrpContext->IsSynchronous = IoIsOperationSynchronous(Irp); } } #endif //(_WIN32_WINNT >= 0x0500) else { IrpContext->IsSynchronous = IoIsOperationSynchronous(Irp); } #if 0 // // Temporary workaround for a bug in close that makes it reference a // fileobject when it is no longer valid. // if (IrpContext->MajorFunction == IRP_MJ_CLOSE) { IrpContext->IsSynchronous = TRUE; } #endif IrpContext->IsTopLevel = (IoGetTopLevelIrp() == Irp); IrpContext->ExceptionInProgress = FALSE; return IrpContext; }
PXIFS_IRPCONTEXT XixFsdAllocateIrpContext( PIRP Irp, PDEVICE_OBJECT PtrTargetDeviceObject ) { BOOLEAN IsFromLookasideList = FALSE; PXIFS_IRPCONTEXT IrpContext = NULL; PIO_STACK_LOCATION PtrIoStackLocation = NULL; BOOLEAN IsFsDo = FALSE; PAGED_CODE(); DebugTrace((DEBUG_LEVEL_TRACE|DEBUG_LEVEL_INFO), (DEBUG_TARGET_CREATE|DEBUG_TARGET_IRPCONTEXT), ("Enter XixFsdAllocateIrpContext Irp(%p) TargetDevObj(%p)\n", Irp, PtrTargetDeviceObject)); ASSERT(Irp); PtrIoStackLocation = IoGetCurrentIrpStackLocation(Irp); if(PtrIoStackLocation->DeviceObject == XiGlobalData.XifsControlDeviceObject){ IsFsDo = TRUE; } if(IsFsDo){ if(PtrIoStackLocation->FileObject != NULL && PtrIoStackLocation->MajorFunction != IRP_MJ_CREATE && PtrIoStackLocation->MajorFunction != IRP_MJ_CLEANUP && PtrIoStackLocation->MajorFunction != IRP_MJ_CLOSE && PtrIoStackLocation->MajorFunction != IRP_MJ_FILE_SYSTEM_CONTROL ) { ExRaiseStatus(STATUS_INVALID_DEVICE_REQUEST); } ASSERT(PtrIoStackLocation->FileObject != NULL || (PtrIoStackLocation->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL && PtrIoStackLocation->MinorFunction == IRP_MN_USER_FS_REQUEST && PtrIoStackLocation->Parameters.FileSystemControl.FsControlCode == FSCTL_INVALIDATE_VOLUMES) || (PtrIoStackLocation->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL && PtrIoStackLocation->Parameters.FileSystemControl.FsControlCode == NDAS_XIXFS_UNLOAD) || (PtrIoStackLocation->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL && PtrIoStackLocation->MinorFunction == IRP_MN_MOUNT_VOLUME ) || PtrIoStackLocation->MajorFunction == IRP_MJ_SHUTDOWN ); } // allocate memory IrpContext = (PXIFS_IRPCONTEXT)ExAllocateFromNPagedLookasideList(&(XifsIrpContextLookasideList)); if(!IrpContext) { IrpContext = ExAllocatePoolWithTag(NonPagedPool, sizeof(XIFS_IRPCONTEXT),TAG_IPCONTEXT); if(!IrpContext) { DebugTrace(DEBUG_LEVEL_ERROR, (DEBUG_TARGET_CREATE|DEBUG_TARGET_IRPCONTEXT), ("ERROR XixFsdAllocateIrpContext Can't allocate\n")); return NULL; } IsFromLookasideList = FALSE; } else { IsFromLookasideList = TRUE; } RtlZeroMemory(IrpContext,sizeof(XIFS_IRPCONTEXT)); IrpContext->NodeTypeCode = XIFS_NODE_IRPCONTEXT; IrpContext->NodeByteSize = sizeof(XIFS_IRPCONTEXT); IrpContext->TargetDeviceObject = PtrTargetDeviceObject; IrpContext->Irp = Irp; if (IoGetTopLevelIrp() != Irp) { // We are not top-level. Note this fact in the context structure XifsdSetFlag(IrpContext->IrpContextFlags, XIFSD_IRP_CONTEXT_NOT_TOP_LEVEL); DebugTrace(DEBUG_LEVEL_CRITICAL, (DEBUG_TARGET_CREATE|DEBUG_TARGET_IRPCONTEXT|DEBUG_TARGET_ALL), ("XixFsdAllocateIrpContext IrpContextFlags(0x%x)\n", IrpContext->IrpContextFlags)); } IrpContext->MajorFunction = PtrIoStackLocation->MajorFunction; IrpContext->MinorFunction = PtrIoStackLocation->MinorFunction; if(XifsdCheckFlagBoolean(IrpContext->IrpContextFlags, XIFSD_IRP_CONTEXT_NOT_TOP_LEVEL)){ }else if (PtrIoStackLocation->FileObject == NULL){ XifsdSetFlag(IrpContext->IrpContextFlags, XIFSD_IRP_CONTEXT_WAIT); DebugTrace(DEBUG_LEVEL_CRITICAL, (DEBUG_TARGET_CREATE|DEBUG_TARGET_IRPCONTEXT), ("XixFsdAllocateIrpContext Set Watable form FileObject== NULL IrpContextFlags(0x%x)\n", IrpContext->IrpContextFlags)); } else { if (IoIsOperationSynchronous(Irp)) { XifsdSetFlag(IrpContext->IrpContextFlags, XIFSD_IRP_CONTEXT_WAIT); DebugTrace(DEBUG_LEVEL_CRITICAL, (DEBUG_TARGET_CREATE|DEBUG_TARGET_IRPCONTEXT), ("XixFsdAllocateIrpContext Set Watable form IoIsOperationSynchronous IrpContextFlags(0x%x)\n", IrpContext->IrpContextFlags)); } } if(!IsFsDo){ IrpContext->VCB = &((PXI_VOLUME_DEVICE_OBJECT)PtrIoStackLocation->DeviceObject)->VCB; } if (IsFromLookasideList == FALSE) { XifsdSetFlag(IrpContext->IrpContextFlags, XIFSD_IRP_CONTEXT_NOT_FROM_POOL); DebugTrace(DEBUG_LEVEL_CRITICAL, (DEBUG_TARGET_CREATE|DEBUG_TARGET_IRPCONTEXT), ("XixFsdAllocateIrpContext IrpContextFlags(0x%x)\n", IrpContext->IrpContextFlags)); } if ( IoGetTopLevelIrp() != Irp) { XifsdSetFlag(IrpContext->IrpContextFlags, XIFSD_IRP_CONTEXT_RECURSIVE_CALL); } DebugTrace(DEBUG_LEVEL_INFO, (DEBUG_TARGET_FCB|DEBUG_TARGET_CREATE|DEBUG_TARGET_IRPCONTEXT), ("[IrpCxt(%p) INFO] Irp(%x):MJ(%x):MN(%x):Flags(%x)\n", IrpContext, Irp, IrpContext->MajorFunction, IrpContext->MinorFunction, IrpContext->IrpContextFlags)); DebugTrace((DEBUG_LEVEL_TRACE|DEBUG_LEVEL_INFO), (DEBUG_TARGET_CREATE|DEBUG_TARGET_IRPCONTEXT), ("Exit XixFsdAllocateIrpContext IrpContext(%p) Irp(%p) TargetDevObj(%p)\n", IrpContext, Irp, PtrTargetDeviceObject)); return IrpContext; }