| 1951 | |
| 1952 | |
| 1953 | NTSTATUS |
| 1954 | Ext2Create (IN PEXT2_IRP_CONTEXT IrpContext) |
| 1955 | { |
| 1956 | PDEVICE_OBJECT DeviceObject; |
| 1957 | PIRP Irp; |
| 1958 | PIO_STACK_LOCATION IrpSp; |
| 1959 | PEXT2_VCB Vcb = 0; |
| 1960 | NTSTATUS Status = STATUS_OBJECT_NAME_NOT_FOUND; |
| 1961 | PEXT2_FCBVCB Xcb = NULL; |
| 1962 | BOOLEAN PostIrp = FALSE; |
| 1963 | BOOLEAN VcbResourceAcquired = FALSE; |
| 1964 | |
| 1965 | DeviceObject = IrpContext->DeviceObject; |
| 1966 | Irp = IrpContext->Irp; |
| 1967 | IrpSp = IoGetCurrentIrpStackLocation(Irp); |
| 1968 | |
| 1969 | Xcb = (PEXT2_FCBVCB) (IrpSp->FileObject->FsContext); |
| 1970 | |
| 1971 | if (IsExt2FsDevice(DeviceObject)) { |
| 1972 | |
| 1973 | DEBUG(DL_INF, ( "Ext2Create: Create on main device object.\n")); |
| 1974 | |
| 1975 | Status = STATUS_SUCCESS; |
| 1976 | Irp->IoStatus.Information = FILE_OPENED; |
| 1977 | |
| 1978 | Ext2CompleteIrpContext(IrpContext, Status); |
| 1979 | |
| 1980 | return Status; |
| 1981 | } |
| 1982 | |
| 1983 | __try { |
| 1984 | |
| 1985 | Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension; |
| 1986 | ASSERT(Vcb->Identifier.Type == EXT2VCB); |
| 1987 | IrpSp->FileObject->Vpb = Vcb->Vpb; |
| 1988 | |
| 1989 | if (!IsMounted(Vcb)) { |
| 1990 | DbgBreak(); |
| 1991 | if (IsFlagOn(Vcb->Flags, VCB_DEVICE_REMOVED)) { |
| 1992 | Status = STATUS_NO_SUCH_DEVICE; |
| 1993 | } else { |
| 1994 | Status = STATUS_VOLUME_DISMOUNTED; |
| 1995 | } |
| 1996 | __leave; |
| 1997 | } |
| 1998 | |
| 1999 | if (!ExAcquireResourceExclusiveLite( |
| 2000 | &Vcb->MainResource, TRUE)) { |
| 2001 | Status = STATUS_PENDING; |
| 2002 | __leave; |
| 2003 | } |
| 2004 | VcbResourceAcquired = TRUE; |
| 2005 | |
| 2006 | Ext2VerifyVcb(IrpContext, Vcb); |
| 2007 | |
| 2008 | if (FlagOn(Vcb->Flags, VCB_VOLUME_LOCKED)) { |
| 2009 | Status = STATUS_ACCESS_DENIED; |
| 2010 | if (IsFlagOn(Vcb->Flags, VCB_DISMOUNT_PENDING)) { |
no test coverage detected