示例#1
0
文件: fsctrl.c 项目: RPG-7/reactos
/*************************************************************************
*
* 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;
}
示例#2
0
文件: read.c 项目: jrfl/ext2fsd
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;
}
示例#3
0
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;
}