- Update to r53061
[reactos.git] / drivers / filesystems / cdfs / create.c
index 244c4bb..d7a6440 100644 (file)
@@ -1,30 +1,30 @@
 /*
- *  ReactOS kernel
- *  Copyright (C) 2002, 2003, 2004 ReactOS Team
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
+*  ReactOS kernel
+*  Copyright (C) 2002, 2003, 2004 ReactOS Team
+*
+*  This program is free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  This program is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  You should have received a copy of the GNU General Public License along
+*  with this program; if not, write to the Free Software Foundation, Inc.,
+*  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
 /* $Id$
- *
- * COPYRIGHT:        See COPYING in the top level directory
- * PROJECT:          ReactOS kernel
- * FILE:             services/fs/cdfs/cdfs.c
- * PURPOSE:          CDROM (ISO 9660) filesystem driver
- * PROGRAMMER:       Art Yerkes
- *                   Eric Kohl
- */
+*
+* COPYRIGHT:        See COPYING in the top level directory
+* PROJECT:          ReactOS kernel
+* FILE:             services/fs/cdfs/cdfs.c
+* PURPOSE:          CDROM (ISO 9660) filesystem driver
+* PROGRAMMER:       Art Yerkes
+*                   Eric Kohl
+*/
 
 /* INCLUDES *****************************************************************/
 
 
 static NTSTATUS
 CdfsMakeAbsoluteFilename(PFILE_OBJECT FileObject,
-                        PUNICODE_STRING RelativeFileName,
-                        PUNICODE_STRING AbsoluteFileName)
+                         PUNICODE_STRING RelativeFileName,
+                         PUNICODE_STRING AbsoluteFileName)
 {
-  ULONG Length;
-  PFCB Fcb;
-  NTSTATUS Status;
-
-  DPRINT("try related for %wZ\n", RelativeFileName);
-  Fcb = FileObject->FsContext;
-  ASSERT(Fcb);
-
-  /* verify related object is a directory and target name
-     don't start with \. */
-  if ((Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY) == 0 ||
-      RelativeFileName->Buffer[0] == L'\\')
+    USHORT Length;
+    PFCB Fcb;
+    NTSTATUS Status;
+
+    DPRINT("try related for %wZ\n", RelativeFileName);
+    Fcb = FileObject->FsContext;
+    ASSERT(Fcb);
+
+    /* verify related object is a directory and target name
+    don't start with \. */
+    if ((Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY) == 0 ||
+        RelativeFileName->Buffer[0] == L'\\')
     {
-      return STATUS_INVALID_PARAMETER;
+        return STATUS_INVALID_PARAMETER;
     }
 
-  /* construct absolute path name */
-  Length = (wcslen(Fcb->PathName) * sizeof(WCHAR)) +
-           sizeof(WCHAR) +
-           RelativeFileName->Length +
-           sizeof(WCHAR);
-  AbsoluteFileName->Length = 0;
-  AbsoluteFileName->MaximumLength = Length;
-  AbsoluteFileName->Buffer = ExAllocatePool(NonPagedPool,
-                                           Length);
-  if (AbsoluteFileName->Buffer == NULL)
+    /* construct absolute path name */
+    Length = (wcslen(Fcb->PathName) * sizeof(WCHAR)) +
+        sizeof(WCHAR) +
+        RelativeFileName->Length +
+        sizeof(WCHAR);
+    AbsoluteFileName->Length = 0;
+    AbsoluteFileName->MaximumLength = Length;
+    AbsoluteFileName->Buffer = ExAllocatePool(NonPagedPool,
+        Length);
+    if (AbsoluteFileName->Buffer == NULL)
     {
-      return STATUS_INSUFFICIENT_RESOURCES;
+        return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-  Status = RtlAppendUnicodeToString(AbsoluteFileName,
-                                   Fcb->PathName);
-  if (!NT_SUCCESS(Status))
+    Status = RtlAppendUnicodeToString(AbsoluteFileName,
+        Fcb->PathName);
+    if (!NT_SUCCESS(Status))
     {
-      RtlFreeUnicodeString(AbsoluteFileName);
-      return Status;
+        RtlFreeUnicodeString(AbsoluteFileName);
+        return Status;
     }
 
-  if (!CdfsFCBIsRoot(Fcb))
+    if (!CdfsFCBIsRoot(Fcb))
     {
-      Status = RtlAppendUnicodeToString(AbsoluteFileName,
-                                       L"\\");
-      if (!NT_SUCCESS(Status))
-       {
-         RtlFreeUnicodeString(AbsoluteFileName);
-         return Status;
-       }
+        Status = RtlAppendUnicodeToString(AbsoluteFileName,
+            L"\\");
+        if (!NT_SUCCESS(Status))
+        {
+            RtlFreeUnicodeString(AbsoluteFileName);
+            return Status;
+        }
     }
 
-  Status = RtlAppendUnicodeStringToString(AbsoluteFileName,
-                                         RelativeFileName);
-  if (!NT_SUCCESS(Status))
+    Status = RtlAppendUnicodeStringToString(AbsoluteFileName,
+        RelativeFileName);
+    if (!NT_SUCCESS(Status))
     {
-      RtlFreeUnicodeString(AbsoluteFileName);
-      return Status;
+        RtlFreeUnicodeString(AbsoluteFileName);
+        return Status;
     }
 
-  return STATUS_SUCCESS;
+    return STATUS_SUCCESS;
 }
 
 
 /*
- * FUNCTION: Opens a file
- */
+* FUNCTION: Opens a file
+*/
 static NTSTATUS
 CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
-            PFILE_OBJECT FileObject,
-            PUNICODE_STRING FileName)
+             PFILE_OBJECT FileObject,
+             PUNICODE_STRING FileName)
 {
-  PFCB ParentFcb;
-  PFCB Fcb;
-  NTSTATUS Status;
-  UNICODE_STRING AbsFileName;
+    PFCB ParentFcb;
+    PFCB Fcb;
+    NTSTATUS Status;
+    UNICODE_STRING AbsFileName;
 
-  DPRINT("CdfsOpenFile(%08lx, %08lx, %wZ)\n", DeviceExt, FileObject, FileName);
+    DPRINT("CdfsOpenFile(%08lx, %08lx, %wZ)\n", DeviceExt, FileObject, FileName);
 
-  if (FileObject->RelatedFileObject)
+    if (FileObject->RelatedFileObject)
     {
-      DPRINT("Converting relative filename to absolute filename\n");
+        DPRINT("Converting relative filename to absolute filename\n");
 
-      Status = CdfsMakeAbsoluteFilename(FileObject->RelatedFileObject,
-                                       FileName,
-                                       &AbsFileName);
-      if (!NT_SUCCESS(Status))
-       {
-         return Status;
-       }
+        Status = CdfsMakeAbsoluteFilename(FileObject->RelatedFileObject,
+            FileName,
+            &AbsFileName);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
 
-      FileName = &AbsFileName;
+        FileName = &AbsFileName;
     }
 
-  Status = CdfsDeviceIoControl (DeviceExt->StorageDevice,
-                               IOCTL_CDROM_CHECK_VERIFY,
-                               NULL,
-                               0,
-                               NULL,
-                               0,
-                               FALSE);
-  DPRINT ("Status %lx\n", Status);
-  if (!NT_SUCCESS(Status))
+    Status = CdfsDeviceIoControl (DeviceExt->StorageDevice,
+        IOCTL_CDROM_CHECK_VERIFY,
+        NULL,
+        0,
+        NULL,
+        0,
+        FALSE);
+    DPRINT ("Status %lx\n", Status);
+    if (!NT_SUCCESS(Status))
     {
-      if (Status == STATUS_NO_MEDIA_IN_DEVICE || Status == STATUS_VERIFY_REQUIRED)
-      {
-          DeviceExt->VolumeDevice->Flags |= DO_VERIFY_VOLUME;
-      }
-      DPRINT1 ("Status %lx\n", Status);
-      return Status;
+        if (Status == STATUS_NO_MEDIA_IN_DEVICE || Status == STATUS_VERIFY_REQUIRED)
+        {
+            DeviceExt->VolumeDevice->Flags |= DO_VERIFY_VOLUME;
+        }
+        DPRINT1 ("Status %lx\n", Status);
+        return Status;
     }
 
-  DPRINT("PathName to open: %wZ\n", FileName);
+    DPRINT("PathName to open: %wZ\n", FileName);
 
-  /*  try first to find an existing FCB in memory  */
-  DPRINT("Checking for existing FCB in memory\n");
-  Fcb = CdfsGrabFCBFromTable(DeviceExt,
-                            FileName);
-  if (Fcb == NULL)
+    /*  try first to find an existing FCB in memory  */
+    DPRINT("Checking for existing FCB in memory\n");
+    Fcb = CdfsGrabFCBFromTable(DeviceExt,
+        FileName);
+    if (Fcb == NULL)
     {
-      DPRINT("No existing FCB found, making a new one if file exists.\n");
-      Status = CdfsGetFCBForFile(DeviceExt,
-                                &ParentFcb,
-                                &Fcb,
-                                FileName);
-      if (ParentFcb != NULL)
-       {
-         CdfsReleaseFCB(DeviceExt,
-                        ParentFcb);
-       }
-
-      if (!NT_SUCCESS (Status))
-       {
-         DPRINT("Could not make a new FCB, status: %x\n", Status);
-
-         if (FileName == &AbsFileName)
-           RtlFreeUnicodeString(&AbsFileName);
-
-         return Status;
-       }
+        DPRINT("No existing FCB found, making a new one if file exists.\n");
+        Status = CdfsGetFCBForFile(DeviceExt,
+            &ParentFcb,
+            &Fcb,
+            FileName);
+        if (ParentFcb != NULL)
+        {
+            CdfsReleaseFCB(DeviceExt,
+                ParentFcb);
+        }
+
+        if (!NT_SUCCESS (Status))
+        {
+            DPRINT("Could not make a new FCB, status: %x\n", Status);
+
+            if (FileName == &AbsFileName)
+                RtlFreeUnicodeString(&AbsFileName);
+
+            return Status;
+        }
     }
 
-  DPRINT("Attaching FCB to fileObject\n");
-  Status = CdfsAttachFCBToFileObject(DeviceExt,
-                                    Fcb,
-                                    FileObject);
+    DPRINT("Attaching FCB to fileObject\n");
+    Status = CdfsAttachFCBToFileObject(DeviceExt,
+        Fcb,
+        FileObject);
 
-  if ((FileName == &AbsFileName) && AbsFileName.Buffer)
-    ExFreePool(AbsFileName.Buffer);
+    if ((FileName == &AbsFileName) && AbsFileName.Buffer)
+        ExFreePool(AbsFileName.Buffer);
 
-  return Status;
+    return Status;
 }
 
 
 /*
- * FUNCTION: Opens a file
- */
+* FUNCTION: Opens a file
+*/
 static NTSTATUS
 CdfsCreateFile(PDEVICE_OBJECT DeviceObject,
-              PIRP Irp)
+               PIRP Irp)
 {
-  PDEVICE_EXTENSION DeviceExt;
-  PIO_STACK_LOCATION Stack;
-  PFILE_OBJECT FileObject;
-  ULONG RequestedDisposition;
-  ULONG RequestedOptions;
-  PFCB Fcb;
-  NTSTATUS Status;
-
-  DPRINT("CdfsCreateFile() called\n");
-
-  DeviceExt = DeviceObject->DeviceExtension;
-  ASSERT(DeviceExt);
-  Stack = IoGetCurrentIrpStackLocation (Irp);
-  ASSERT(Stack);
-
-  RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) & 0xff);
-  RequestedOptions = Stack->Parameters.Create.Options & FILE_VALID_OPTION_FLAGS;
-  DPRINT("RequestedDisposition %x, RequestedOptions %x\n",
-         RequestedDisposition, RequestedOptions);
-
-  FileObject = Stack->FileObject;
-
-  if (RequestedDisposition == FILE_CREATE ||
-      RequestedDisposition == FILE_OVERWRITE_IF ||
-      RequestedDisposition == FILE_SUPERSEDE)
+    PDEVICE_EXTENSION DeviceExt;
+    PIO_STACK_LOCATION Stack;
+    PFILE_OBJECT FileObject;
+    ULONG RequestedDisposition;
+    ULONG RequestedOptions;
+    PFCB Fcb;
+    NTSTATUS Status;
+
+    DPRINT("CdfsCreateFile() called\n");
+
+    DeviceExt = DeviceObject->DeviceExtension;
+    ASSERT(DeviceExt);
+    Stack = IoGetCurrentIrpStackLocation (Irp);
+    ASSERT(Stack);
+
+    RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) & 0xff);
+    RequestedOptions = Stack->Parameters.Create.Options & FILE_VALID_OPTION_FLAGS;
+    DPRINT("RequestedDisposition %x, RequestedOptions %x\n",
+        RequestedDisposition, RequestedOptions);
+
+    FileObject = Stack->FileObject;
+
+    if (RequestedDisposition == FILE_CREATE ||
+        RequestedDisposition == FILE_OVERWRITE_IF ||
+        RequestedDisposition == FILE_SUPERSEDE)
     {
-      return STATUS_ACCESS_DENIED;
+        return STATUS_ACCESS_DENIED;
     }
 
-  Status = CdfsOpenFile(DeviceExt,
-                       FileObject,
-                       &FileObject->FileName);
-  if (NT_SUCCESS(Status))
+    Status = CdfsOpenFile(DeviceExt,
+        FileObject,
+        &FileObject->FileName);
+    if (NT_SUCCESS(Status))
     {
-      Fcb = FileObject->FsContext;
-
-      /* Check whether the file has the requested attributes */
-      if (RequestedOptions & FILE_NON_DIRECTORY_FILE && CdfsFCBIsDirectory(Fcb))
-       {
-         CdfsCloseFile (DeviceExt, FileObject);
-         return STATUS_FILE_IS_A_DIRECTORY;
-       }
-
-      if (RequestedOptions & FILE_DIRECTORY_FILE && !CdfsFCBIsDirectory(Fcb))
-       {
-         CdfsCloseFile (DeviceExt, FileObject);
-         return STATUS_NOT_A_DIRECTORY;
-       }
-  }
-
-  /*
-   * If the directory containing the file to open doesn't exist then
-   * fail immediately
-   */
-  Irp->IoStatus.Information = (NT_SUCCESS(Status)) ? FILE_OPENED : 0;
-  Irp->IoStatus.Status = Status;
-
-  return Status;
+        Fcb = FileObject->FsContext;
+
+        /* Check whether the file has the requested attributes */
+        if (RequestedOptions & FILE_NON_DIRECTORY_FILE && CdfsFCBIsDirectory(Fcb))
+        {
+            CdfsCloseFile (DeviceExt, FileObject);
+            return STATUS_FILE_IS_A_DIRECTORY;
+        }
+
+        if (RequestedOptions & FILE_DIRECTORY_FILE && !CdfsFCBIsDirectory(Fcb))
+        {
+            CdfsCloseFile (DeviceExt, FileObject);
+            return STATUS_NOT_A_DIRECTORY;
+        }
+    }
+
+    /*
+    * If the directory containing the file to open doesn't exist then
+    * fail immediately
+    */
+    Irp->IoStatus.Information = (NT_SUCCESS(Status)) ? FILE_OPENED : 0;
+    Irp->IoStatus.Status = Status;
+
+    return Status;
 }
 
 
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 CdfsCreate(PDEVICE_OBJECT DeviceObject,
-          PIRP Irp)
+           PIRP Irp)
 {
-  PDEVICE_EXTENSION DeviceExt;
-  NTSTATUS Status;
+    PDEVICE_EXTENSION DeviceExt;
+    NTSTATUS Status;
 
-  if (DeviceObject == CdfsGlobalData->DeviceObject)
+    if (DeviceObject == CdfsGlobalData->DeviceObject)
     {
-      /* DeviceObject represents FileSystem instead of logical volume */
-      DPRINT("Opening file system\n");
-      Irp->IoStatus.Information = FILE_OPENED;
-      Status = STATUS_SUCCESS;
-      goto ByeBye;
+        /* DeviceObject represents FileSystem instead of logical volume */
+        DPRINT("Opening file system\n");
+        Irp->IoStatus.Information = FILE_OPENED;
+        Status = STATUS_SUCCESS;
+        goto ByeBye;
     }
 
-  DeviceExt = DeviceObject->DeviceExtension;
+    DeviceExt = DeviceObject->DeviceExtension;
 
     KeEnterCriticalRegion();
-  ExAcquireResourceExclusiveLite(&DeviceExt->DirResource,
-                                TRUE);
-  Status = CdfsCreateFile(DeviceObject,
-                         Irp);
-  ExReleaseResourceLite(&DeviceExt->DirResource);
+    ExAcquireResourceExclusiveLite(&DeviceExt->DirResource,
+        TRUE);
+    Status = CdfsCreateFile(DeviceObject,
+        Irp);
+    ExReleaseResourceLite(&DeviceExt->DirResource);
     KeLeaveCriticalRegion();
 
 ByeBye:
-  Irp->IoStatus.Status = Status;
-  IoCompleteRequest(Irp,
-                   NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT);
+    Irp->IoStatus.Status = Status;
+    IoCompleteRequest(Irp,
+        NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT);
 
-  return Status;
+    return Status;
 }
 
 /* EOF */