[SHELL32] SHCreateDefaultContextMenu: Pass HWND to callback (#6764)
[reactos.git] / ntoskrnl / cc / fs.c
index e31a17b..14e3a41 100644 (file)
 /* INCLUDES ******************************************************************/
 
 #include <ntoskrnl.h>
+
 #define NDEBUG
 #include <debug.h>
 
-/* GLOBALS   *****************************************************************/
-
-NTSTATUS CcRosInternalFreeVacb(PROS_VACB Vacb);
-
 /* FUNCTIONS *****************************************************************/
 
 /*
@@ -48,7 +45,7 @@ NTAPI
 CcGetFileObjectFromBcb (
     IN PVOID Bcb)
 {
-    PINTERNAL_BCB iBcb = (PINTERNAL_BCB)Bcb;
+    PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
 
     CCTRACE(CC_API_DEBUG, "Bcb=%p\n", Bcb);
 
@@ -164,6 +161,7 @@ CcPurgeCacheSection (
     IN BOOLEAN UninitializeCacheMaps)
 {
     PROS_SHARED_CACHE_MAP SharedCacheMap;
+    PPRIVATE_CACHE_MAP PrivateCacheMap;
     LONGLONG StartOffset;
     LONGLONG EndOffset;
     LIST_ENTRY FreeList;
@@ -176,14 +174,35 @@ CcPurgeCacheSection (
     CCTRACE(CC_API_DEBUG, "SectionObjectPointer=%p\n FileOffset=%p Length=%lu UninitializeCacheMaps=%d",
         SectionObjectPointer, FileOffset, Length, UninitializeCacheMaps);
 
-    if (UninitializeCacheMaps)
+    /* Obtain the shared cache from the section */
+    SharedCacheMap = SectionObjectPointer->SharedCacheMap;
+    if (!SharedCacheMap)
     {
-        DPRINT1("FIXME: CcPurgeCacheSection not uninitializing private cache maps\n");
+        Success = TRUE;
+        goto purgeMm;
     }
 
-    SharedCacheMap = SectionObjectPointer->SharedCacheMap;
-    if (!SharedCacheMap)
-        return FALSE;
+    if (UninitializeCacheMaps)
+    {
+        /*
+         * We have gotten the acknowledgement that
+         * the caller wants to unintialize the private
+         * cache maps so let's do this. Since we already
+         * have the shared cache map from above, iterate
+         * over that cache's private lists.
+         */
+        while (!IsListEmpty(&SharedCacheMap->PrivateList))
+        {
+            /*
+             * This list is not empty, grab the
+             * private cache map.
+             */
+            PrivateCacheMap = CONTAINING_RECORD(SharedCacheMap->PrivateList.Flink, PRIVATE_CACHE_MAP, PrivateLinks);
+
+            /* Unintialize the private cache now */
+            CcUninitializeCacheMap(PrivateCacheMap->FileObject, NULL, NULL);
+        }
+    }
 
     StartOffset = FileOffset != NULL ? FileOffset->QuadPart : 0;
     if (Length == 0 || FileOffset == NULL)
@@ -260,6 +279,11 @@ CcPurgeCacheSection (
         ASSERT(Refs == 0);
     }
 
+    /* Now make sure that Mm doesn't hold some pages here. */
+purgeMm:
+    if (Success)
+        Success = MmPurgeSegment(SectionObjectPointer, FileOffset, Length);
+
     return Success;
 }
 
@@ -272,8 +296,9 @@ CcSetFileSizes (
     IN PFILE_OBJECT FileObject,
     IN PCC_FILE_SIZES FileSizes)
 {
-    KIRQL oldirql;
+    KIRQL OldIrql;
     PROS_SHARED_CACHE_MAP SharedCacheMap;
+    LARGE_INTEGER OldSectionSize;
 
     CCTRACE(CC_API_DEBUG, "FileObject=%p FileSizes=%p\n",
         FileObject, FileSizes);
@@ -294,18 +319,26 @@ CcSetFileSizes (
     if (SharedCacheMap == NULL)
         return;
 
-    if (FileSizes->AllocationSize.QuadPart < SharedCacheMap->SectionSize.QuadPart)
+    /* Update the relevant fields */
+    KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
+    OldSectionSize = SharedCacheMap->SectionSize;
+    SharedCacheMap->SectionSize = FileSizes->AllocationSize;
+    SharedCacheMap->FileSize = FileSizes->FileSize;
+    SharedCacheMap->ValidDataLength = FileSizes->ValidDataLength;
+    KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
+
+    if (FileSizes->AllocationSize.QuadPart < OldSectionSize.QuadPart)
     {
         CcPurgeCacheSection(FileObject->SectionObjectPointer,
                             &FileSizes->AllocationSize,
                             0,
                             FALSE);
     }
-
-    KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldirql);
-    SharedCacheMap->SectionSize = FileSizes->AllocationSize;
-    SharedCacheMap->FileSize = FileSizes->FileSize;
-    KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql);
+    else
+    {
+        /* Extend our section object */
+        MmExtendSection(SharedCacheMap->Section, &SharedCacheMap->SectionSize);
+    }
 }
 
 /*