[CDFS]
[reactos.git] / reactos / drivers / filesystems / cdfs / fcb.c
index 47d01b8..3f75b6e 100644 (file)
@@ -19,7 +19,7 @@
 /*
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
- * FILE:             services/fs/cdfs/fcb.c
+ * FILE:             drivers/filesystems/cdfs/fcb.c
  * PURPOSE:          CDROM (ISO 9660) filesystem driver
  * PROGRAMMER:       Art Yerkes
  * UPDATE HISTORY:
@@ -97,6 +97,7 @@ CdfsCreateFCB(PCWSTR FileName)
     Fcb->RFCB.Resource = &Fcb->MainResource;
     Fcb->RFCB.IsFastIoPossible = FastIoIsNotPossible;
     InitializeListHead(&Fcb->ShortNameList);
+    FsRtlInitializeFileLock(&Fcb->FileLock, NULL, NULL);
 
     return(Fcb);
 }
@@ -107,6 +108,7 @@ CdfsDestroyFCB(PFCB Fcb)
 {
     PLIST_ENTRY Entry;
 
+    FsRtlUninitializeFileLock(&Fcb->FileLock);
     ExDeleteResourceLite(&Fcb->PagingIoResource);
     ExDeleteResourceLite(&Fcb->MainResource);
 
@@ -326,44 +328,6 @@ CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb)
 }
 
 
-static VOID
-CdfsGetDirEntryName(PDEVICE_EXTENSION DeviceExt,
-                    PDIR_RECORD Record,
-                    PWSTR Name)
-                    /*
-                    * FUNCTION: Retrieves the file name from a directory record.
-                    */
-{
-    if (Record->FileIdLength == 1 && Record->FileId[0] == 0)
-    {
-        wcscpy(Name, L".");
-    }
-    else if (Record->FileIdLength == 1 && Record->FileId[0] == 1)
-    {
-        wcscpy(Name, L"..");
-    }
-    else
-    {
-        if (DeviceExt->CdInfo.JolietLevel == 0)
-        {
-            ULONG i;
-
-            for (i = 0; i < Record->FileIdLength && Record->FileId[i] != ';'; i++)
-                Name[i] = (WCHAR)Record->FileId[i];
-            Name[i] = 0;
-        }
-        else
-        {
-            CdfsSwapString(Name,
-                Record->FileId,
-                Record->FileIdLength);
-        }
-    }
-
-    DPRINT("Name '%S'\n", Name);
-}
-
-
 NTSTATUS
 CdfsMakeFCBFromDirEntry(PVCB Vcb,
                         PFCB DirectoryFCB,
@@ -525,16 +489,16 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
     DirSize = DirectoryFcb->Entry.DataLengthL;
     StreamOffset.QuadPart = (LONGLONG)DirectoryFcb->Entry.ExtentLocationL * (LONGLONG)BLOCKSIZE;
 
-    if (!CcMapData(DeviceExt->StreamFileObject,
-        &StreamOffset,
-        BLOCKSIZE,
-        TRUE,
-        &Context,
-        &Block))
+    _SEH2_TRY
+    {
+        CcMapData(DeviceExt->StreamFileObject, &StreamOffset, BLOCKSIZE, MAP_WAIT, &Context, &Block);
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
         DPRINT("CcMapData() failed\n");
-        return STATUS_UNSUCCESSFUL;
+        _SEH2_YIELD(return _SEH2_GetExceptionCode());
     }
+    _SEH2_END;
 
     Offset = 0;
     BlockOffset = 0;
@@ -558,22 +522,29 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
         DPRINT("RecordLength %u  ExtAttrRecordLength %u  NameLength %u\n",
             Record->RecordLength, Record->ExtAttrRecordLength, Record->FileIdLength);
 
+        if (!CdfsIsRecordValid(DeviceExt, Record))
+        {
+            RtlFreeUnicodeString(&FileToFindUpcase);
+            CcUnpinData(Context);
+            return STATUS_DISK_CORRUPT_ERROR;
+        }
+
         CdfsGetDirEntryName(DeviceExt, Record, Name);
         DPRINT ("Name '%S'\n", Name);
         DPRINT ("Sector %lu\n", DirectoryFcb->Entry.ExtentLocationL);
         DPRINT ("Offset %lu\n", Offset);
 
         RtlInitUnicodeString(&LongName, Name);
-        ShortName.Length = 0;
-        ShortName.MaximumLength = 26;
-        ShortName.Buffer = ShortNameBuffer;
-        memset(ShortNameBuffer, 0, 26);
+        RtlInitEmptyUnicodeString(&ShortName, ShortNameBuffer, sizeof(ShortNameBuffer));
+        RtlZeroMemory(ShortNameBuffer, sizeof(ShortNameBuffer));
 
         OffsetOfEntry.QuadPart = StreamOffset.QuadPart + Offset;
         CdfsShortNameCacheGet(DirectoryFcb, &OffsetOfEntry, &LongName, &ShortName);
 
         DPRINT("ShortName '%wZ'\n", &ShortName);
 
+        ASSERT(LongName.Length >= sizeof(WCHAR));
+        ASSERT(ShortName.Length >= sizeof(WCHAR));
         if (FsRtlIsNameInExpression(&FileToFindUpcase, &LongName, TRUE, NULL) ||
             FsRtlIsNameInExpression(&FileToFindUpcase, &ShortName, TRUE, NULL))
         {
@@ -604,15 +575,17 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
             Offset = ROUND_UP(Offset, BLOCKSIZE);
             BlockOffset = 0;
 
-            if (!CcMapData(DeviceExt->StreamFileObject,
-                &StreamOffset,
-                BLOCKSIZE, TRUE,
-                &Context, &Block))
+            _SEH2_TRY
+            {
+                CcMapData(DeviceExt->StreamFileObject, &StreamOffset, BLOCKSIZE, MAP_WAIT, &Context, &Block);
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
             {
                 DPRINT("CcMapData() failed\n");
                 RtlFreeUnicodeString(&FileToFindUpcase);
-                return(STATUS_UNSUCCESSFUL);
+                _SEH2_YIELD(return _SEH2_GetExceptionCode());
             }
+            _SEH2_END;
             Record = (PDIR_RECORD)((ULONG_PTR)Block + BlockOffset);
         }