@@ -218,6 +218,9 @@ CcInitializeCacheMap(IN PFILE_OBJECT FileObject,
218
218
/* We still don't have a shared cache map. We need to create one. */
219
219
if (!Map )
220
220
{
221
+ NTSTATUS Status ;
222
+ LARGE_INTEGER MaxSize = FileSizes -> AllocationSize ;
223
+
221
224
DPRINT ("Initializing file object for (%p) %wZ\n" ,
222
225
FileObject ,
223
226
& FileObject -> FileName );
@@ -237,6 +240,20 @@ CcInitializeCacheMap(IN PFILE_OBJECT FileObject,
237
240
InitializeListHead (& Map -> PrivateCacheMaps );
238
241
InsertTailList (& CcpAllSharedCacheMaps , & Map -> Entry );
239
242
DPRINT ("New Map %p\n" , Map );
243
+
244
+ Status = MmCreateSection (& Map -> SectionObject ,
245
+ STANDARD_RIGHTS_REQUIRED | SECTION_EXTEND_SIZE ,
246
+ NULL ,
247
+ & MaxSize ,
248
+ PAGE_READWRITE ,
249
+ SEC_RESERVE , // Use ARM3 implementation
250
+ NULL ,
251
+ FileObject );
252
+ if (!NT_SUCCESS (Status ))
253
+ {
254
+ ExFreePool (Map );
255
+ RtlRaiseStatus (Status );
256
+ }
240
257
}
241
258
/* We don't have a private cache map. Link it with the shared cache map
242
259
to serve as a held reference. When the list in the shared cache map
@@ -325,6 +342,7 @@ CcUninitializeCacheMap(IN PFILE_OBJECT FileObject,
325
342
CcpDereferenceCache (Bcb - CcCacheSections , TRUE);
326
343
}
327
344
RemoveEntryList (& PrivateCacheMap -> Map -> Entry );
345
+ ObDereferenceObject (PrivateCacheMap -> Map -> SectionObject );
328
346
ExFreePool (PrivateCacheMap -> Map );
329
347
FileObject -> SectionObjectPointer -> SharedCacheMap = NULL ;
330
348
LastMap = TRUE;
@@ -354,18 +372,36 @@ NTAPI
354
372
CcSetFileSizes (IN PFILE_OBJECT FileObject ,
355
373
IN PCC_FILE_SIZES FileSizes )
356
374
{
357
- PNOCC_CACHE_MAP Map = (PNOCC_CACHE_MAP )FileObject -> SectionObjectPointer -> SharedCacheMap ;
358
- PNOCC_BCB Bcb ;
375
+ PNOCC_CACHE_MAP Map ;
376
+
377
+ CcpLock ();
378
+
379
+ Map = FileObject -> SectionObjectPointer -> SharedCacheMap ;
380
+
381
+ if (!Map )
382
+ {
383
+ CcpUnlock ();
384
+ return ;
385
+ }
386
+
387
+ /* FS should have unmapped the whole thing. */
388
+ //ASSERT(IsListEmpty(&Map->AssociatedBcb));
389
+
390
+ if (Map -> FileSizes .AllocationSize .QuadPart != FileSizes -> AllocationSize .QuadPart )
391
+ {
392
+ LARGE_INTEGER SectionSize = FileSizes -> AllocationSize ;
393
+ NTSTATUS Status = MmExtendSection (Map -> SectionObject , & SectionSize );
394
+
395
+ if (!NT_SUCCESS (Status ))
396
+ {
397
+ CcpUnlock ();
398
+ ExRaiseStatus (Status );
399
+ }
400
+ }
359
401
360
- if (!Map ) return ;
361
402
Map -> FileSizes = * FileSizes ;
362
- Bcb = Map -> AssociatedBcb .Flink == & Map -> AssociatedBcb ?
363
- NULL : CONTAINING_RECORD (Map -> AssociatedBcb .Flink , NOCC_BCB , ThisFileList );
364
- if (!Bcb ) return ;
365
- MmExtendCacheSection (Bcb -> SectionObject , & FileSizes -> FileSize , FALSE);
366
- DPRINT ("FileSizes->FileSize %x\n" , FileSizes -> FileSize .LowPart );
367
- DPRINT ("FileSizes->AllocationSize %x\n" , FileSizes -> AllocationSize .LowPart );
368
- DPRINT ("FileSizes->ValidDataLength %x\n" , FileSizes -> ValidDataLength .LowPart );
403
+
404
+ CcpUnlock ();
369
405
}
370
406
371
407
BOOLEAN
@@ -612,7 +648,7 @@ CcGetFileObjectFromSectionPtrs(IN PSECTION_OBJECT_POINTERS SectionObjectPointer)
612
648
NOCC_BCB ,
613
649
ThisFileList );
614
650
615
- Result = MmGetFileObjectForSection (( PROS_SECTION_OBJECT ) Bcb -> SectionObject );
651
+ Result = MmGetFileObjectForSection (Bcb -> Map -> SectionObject );
616
652
}
617
653
CcpUnlock ();
618
654
return Result ;
@@ -624,7 +660,7 @@ CcGetFileObjectFromBcb(PVOID Bcb)
624
660
{
625
661
PNOCC_BCB RealBcb = (PNOCC_BCB )Bcb ;
626
662
DPRINT ("BCB #%x\n" , RealBcb - CcCacheSections );
627
- return MmGetFileObjectForSection (( PROS_SECTION_OBJECT ) RealBcb -> SectionObject );
663
+ return MmGetFileObjectForSection (RealBcb -> Map -> SectionObject );
628
664
}
629
665
630
666
/* EOF */
0 commit comments