VOID NTAPI CcShutdownSystem(VOID) { ULONG i, Result; NTSTATUS Status; DPRINT1("CC: Shutdown\n"); for (i = 0; i < CACHE_NUM_SECTIONS; i++) { PNOCC_BCB Bcb = &CcCacheSections[i]; if (Bcb->SectionObject) { DPRINT1("Evicting #%02x %08x%08x %wZ\n", i, Bcb->FileOffset.u.HighPart, Bcb->FileOffset.u.LowPart, &MmGetFileObjectForSection((PROS_SECTION_OBJECT)Bcb->SectionObject)->FileName); CcpFlushCache(Bcb->Map, NULL, 0, NULL, TRUE); Bcb->Dirty = FALSE; } } /* Evict all section pages */ Status = MiRosTrimCache(~0, 0, &Result); DPRINT1("Done (Evicted %d, Status %x)\n", Result, Status); }
PFILE_OBJECT NTAPI CcGetFileObjectFromBcb(PVOID Bcb) { PNOCC_BCB RealBcb = (PNOCC_BCB)Bcb; DPRINT("BCB #%x\n", RealBcb - CcCacheSections); return MmGetFileObjectForSection((PROS_SECTION_OBJECT)RealBcb->SectionObject); }
NTSTATUS PsReferenceProcessFilePointer ( IN PEPROCESS Process, OUT PVOID *OutFileObject ) /*++ Routine Description: This routine returns a referenced pointer to the FilePointer of Process. This is a rundown protected wrapper around MmGetFileObjectForSection. Arguments: Process - Supplies the process to query. OutFileObject - Returns the file object backing the requested section if success is returned. Return Value: NTSTATUS. Environment: Kernel mode, PASSIVE_LEVEL. --*/ { PFILE_OBJECT FileObject; PAGED_CODE(); if (!ExAcquireRundownProtection (&Process->RundownProtect)) { return STATUS_UNSUCCESSFUL; } if (Process->SectionObject == NULL) { ExReleaseRundownProtection (&Process->RundownProtect); return STATUS_UNSUCCESSFUL; } FileObject = MmGetFileObjectForSection ((PVOID)Process->SectionObject); *OutFileObject = FileObject; ObReferenceObject (FileObject); ExReleaseRundownProtection (&Process->RundownProtect); return STATUS_SUCCESS; }
PFILE_OBJECT NTAPI CcGetFileObjectFromSectionPtrs(IN PSECTION_OBJECT_POINTERS SectionObjectPointer) { PFILE_OBJECT Result = NULL; PNOCC_CACHE_MAP Map = SectionObjectPointer->SharedCacheMap; CcpLock(); if (!IsListEmpty(&Map->AssociatedBcb)) { PNOCC_BCB Bcb = CONTAINING_RECORD(Map->AssociatedBcb.Flink, NOCC_BCB, ThisFileList); Result = MmGetFileObjectForSection((PROS_SECTION_OBJECT)Bcb->SectionObject); } CcpUnlock(); return Result; }