/************************************************************************* * * Function: Ext2FileSystemControl * * Description: * The I/O Manager will invoke this routine to handle a * File System Control IRP * * Expected Interrupt Level (for execution) : * * ??? * * Arguments: * * DeviceObject - Supplies the volume device object where the * file exists * * Irp - Supplies the Irp being processed * * * Return Value: * * NTSTATUS - The FSD status for the IRP * *************************************************************************/ NTSTATUS NTAPI Ext2FileSystemControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { NTSTATUS Status = STATUS_SUCCESS; PIO_STACK_LOCATION IrpSp; DebugTrace(DEBUG_TRACE_IRP_ENTRY, "File System Control IRP Received...", 0); // Ext2BreakPoint(); FsRtlEnterFileSystem(); ASSERT(DeviceObject); ASSERT(Irp); // // Get a pointer to the current Irp stack location // IrpSp = IoGetCurrentIrpStackLocation( Irp ); if( IrpSp->MinorFunction == IRP_MN_MOUNT_VOLUME ) { DebugTrace(DEBUG_TRACE_MOUNT, "Mount Request Received...", 0); Status = Ext2MountVolume ( Irp, IrpSp ); Ext2CompleteRequest( Irp, Status ); } else if( IrpSp->MinorFunction == IRP_MN_USER_FS_REQUEST ) { DebugTrace(DEBUG_TRACE_FSCTRL, "IRP_MN_USER_FS_REQUEST received...", 0); Status = Ext2UserFileSystemRequest( Irp, IrpSp ); Ext2CompleteRequest( Irp, Status ); } else { if( IrpSp->MinorFunction == IRP_MN_VERIFY_VOLUME ) { DebugTrace(DEBUG_TRACE_FSCTRL, "IRP_MN_VERIFY_VOLUME received...", 0); } else if( IrpSp->MinorFunction == IRP_MN_LOAD_FILE_SYSTEM ) { DebugTrace(DEBUG_TRACE_FSCTRL, "IRP_MN_LOAD_FILE_SYSTEM received...", 0); } else { DebugTrace(DEBUG_TRACE_FSCTRL, "Unknown Minor IRP code received...", 0); } Status = STATUS_INVALID_DEVICE_REQUEST; Ext2CompleteRequest( Irp, Status ); } FsRtlExitFileSystem(); return Status; }
NTSTATUS Ext2CompleteIrpContext ( IN PEXT2_IRP_CONTEXT IrpContext, IN NTSTATUS Status ) { PIRP Irp = NULL; BOOLEAN bPrint; Irp = IrpContext->Irp; if (Irp != NULL) { if (NT_ERROR(Status)) { Irp->IoStatus.Information = 0; } Irp->IoStatus.Status = Status; bPrint = !IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_REQUEUED); Ext2CompleteRequest( Irp, bPrint, (CCHAR)(NT_SUCCESS(Status)? IO_DISK_INCREMENT : IO_NO_INCREMENT) ); IrpContext->Irp = NULL; } Ext2FreeIrpContext(IrpContext); return Status; }
NTSTATUS Ext2BuildRequest (PDEVICE_OBJECT DeviceObject, PIRP Irp) { BOOLEAN AtIrqlPassiveLevel = FALSE; BOOLEAN IsTopLevelIrp = FALSE; PEXT2_IRP_CONTEXT IrpContext = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; __try { __try { #if EXT2_DEBUG Ext2DbgPrintCall(DeviceObject, Irp); #endif AtIrqlPassiveLevel = (KeGetCurrentIrql() == PASSIVE_LEVEL); if (AtIrqlPassiveLevel) { FsRtlEnterFileSystem(); } if (!IoGetTopLevelIrp()) { IsTopLevelIrp = TRUE; IoSetTopLevelIrp(Irp); } IrpContext = Ext2AllocateIrpContext(DeviceObject, Irp); if (!IrpContext) { Status = STATUS_INSUFFICIENT_RESOURCES; Irp->IoStatus.Status = Status; Ext2CompleteRequest(Irp, TRUE, IO_NO_INCREMENT); } else { if ((IrpContext->MajorFunction == IRP_MJ_CREATE) && !AtIrqlPassiveLevel) { DbgBreak(); } Status = Ext2DispatchRequest(IrpContext); } } __except (Ext2ExceptionFilter(IrpContext, GetExceptionInformation())) { Status = Ext2ExceptionHandler(IrpContext); } } __finally { if (IsTopLevelIrp) { IoSetTopLevelIrp(NULL); } if (AtIrqlPassiveLevel) { FsRtlExitFileSystem(); } } return Status; }