if (SHARE_COUNT_FROM_SSE(Entry) == 0)
{
PFILE_OBJECT FileObject;
- PREACTOS_COMMON_FCB_HEADER Fcb;
+ PBCB Bcb;
SWAPENTRY SavedSwapEntry;
PHYSICAL_ADDRESS Page;
FileObject = Section->FileObject;
if (FileObject != NULL)
{
- Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext;
+ Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
if (FileObject->Flags & FO_DIRECT_CACHE_PAGING_READ &&
(Offset % PAGE_SIZE) == 0)
{
NTSTATUS Status;
- Status = CcRosUnmapCacheSegment(Fcb->Bcb, Offset, Dirty);
+ Status = CcRosUnmapCacheSegment(Bcb, Offset, Dirty);
if (!NT_SUCCESS(Status))
{
KeBugCheck(0);
PCACHE_SEGMENT CacheSeg;
PFILE_OBJECT FileObject;
NTSTATUS Status;
- PREACTOS_COMMON_FCB_HEADER Fcb;
+ PBCB Bcb;
FileObject = MemoryArea->Data.SectionData.Section->FileObject;
- Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext;
+ Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
- assert(Fcb->Bcb);
+ assert(Bcb);
/*
* If the file system is letting us go directly to the cache and the
* filesystems do because it is safe for us to use an offset with a
* alignment less than the file system block size.
*/
- Status = CcRosGetCacheSegment(Fcb->Bcb,
- Offset->u.LowPart,
- &BaseOffset,
- &BaseAddress,
- &UptoDate,
- &CacheSeg);
+ Status = CcRosGetCacheSegment(Bcb,
+ Offset->u.LowPart,
+ &BaseOffset,
+ &BaseAddress,
+ &UptoDate,
+ &CacheSeg);
if (!NT_SUCCESS(Status))
{
return(Status);
Status = ReadCacheSegment(CacheSeg);
if (!NT_SUCCESS(Status))
{
- CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, FALSE, FALSE, FALSE);
+ CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
return Status;
}
}
(*Page) = Addr;
MmReferencePage((*Page));
- CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, TRUE, FALSE, TRUE);
+ CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, TRUE);
}
else
{
return(Status);
}
- Status = CcRosGetCacheSegment(Fcb->Bcb,
- Offset->u.LowPart,
- &BaseOffset,
- &BaseAddress,
- &UptoDate,
- &CacheSeg);
+ Status = CcRosGetCacheSegment(Bcb,
+ Offset->u.LowPart,
+ &BaseOffset,
+ &BaseAddress,
+ &UptoDate,
+ &CacheSeg);
if (!NT_SUCCESS(Status))
{
return(Status);
Status = ReadCacheSegment(CacheSeg);
if (!NT_SUCCESS(Status))
{
- CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, FALSE, FALSE, FALSE);
+ CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
return Status;
}
}
else
{
memcpy(PageAddr, BaseAddress + Offset->u.LowPart - BaseOffset, OffsetInPage);
- CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, TRUE, FALSE, FALSE);
- Status = CcRosGetCacheSegment(Fcb->Bcb,
- Offset->u.LowPart + OffsetInPage,
- &BaseOffset,
- &BaseAddress,
- &UptoDate,
- &CacheSeg);
+ CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
+ Status = CcRosGetCacheSegment(Bcb,
+ Offset->u.LowPart + OffsetInPage,
+ &BaseOffset,
+ &BaseAddress,
+ &UptoDate,
+ &CacheSeg);
if (!NT_SUCCESS(Status))
{
ExUnmapPage(PageAddr);
Status = ReadCacheSegment(CacheSeg);
if (!NT_SUCCESS(Status))
{
- CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, FALSE, FALSE, FALSE);
+ CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
ExUnmapPage(PageAddr);
return Status;
}
}
memcpy(PageAddr + OffsetInPage, BaseAddress, PAGE_SIZE - OffsetInPage);
}
- CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, TRUE, FALSE, FALSE);
+ CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
ExUnmapPage(PageAddr);
}
return(STATUS_SUCCESS);
BOOLEAN Private;
NTSTATUS Status;
PFILE_OBJECT FileObject;
- PREACTOS_COMMON_FCB_HEADER Fcb = NULL;
+ PBCB Bcb = NULL;
BOOLEAN DirectMapped;
Address = (PVOID)PAGE_ROUND_DOWN(Address);
DirectMapped = FALSE;
if (FileObject != NULL)
{
- Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext;
+ Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
/*
* If the file system is letting us go directly to the cache and the
if (DirectMapped && !Private)
{
assert(SwapEntry == 0);
- CcRosMarkDirtyCacheSegment(Fcb->Bcb, Offset.u.LowPart);
+ CcRosMarkDirtyCacheSegment(Bcb, Offset.u.LowPart);
PageOp->Status = STATUS_SUCCESS;
KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);
MmReleasePageOp(PageOp);
for (i = 0; i < Section->NrSegments; i++)
{
- InterlockedDecrement(&Section->Segments[i].ReferenceCount);
+ InterlockedDecrement((LONG *)&Section->Segments[i].ReferenceCount);
}
}
else
{
- InterlockedDecrement(&Section->Segments->ReferenceCount);
+ InterlockedDecrement((LONG *)&Section->Segments->ReferenceCount);
}
if (Section->FileObject != NULL)
{
*/
for (i = 0; i < NrSegments; i++)
{
- InterlockedIncrement(&SectionSegments[i].ReferenceCount);
+ InterlockedIncrement((LONG *)&SectionSegments[i].ReferenceCount);
}
}
PMEMORY_AREA MArea;
ULONG Entry;
PFILE_OBJECT FileObject;
- PREACTOS_COMMON_FCB_HEADER Fcb;
+ PBCB Bcb;
ULONG Offset;
SWAPENTRY SavedSwapEntry;
PMM_PAGEOP PageOp;
if (PhysAddr.QuadPart == PAGE_FROM_SSE(Entry) && Dirty)
{
FileObject = MemoryArea->Data.SectionData.Section->FileObject;
- Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext;
- CcRosMarkDirtyCacheSegment(Fcb->Bcb, Offset);
+ Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
+ CcRosMarkDirtyCacheSegment(Bcb, Offset);
assert(SwapEntry == 0);
}
}
IN ULONG NewMaximumSize)
{
UNIMPLEMENTED;
+ return(STATUS_NOT_IMPLEMENTED);
}
Section = (PSECTION_OBJECT)SectionObject;
AddressSpace = &Process->AddressSpace;
- MmLockAddressSpace(AddressSpace);
MmLockSection(SectionObject);
if (Section->AllocationAttributes & SEC_IMAGE)
PVOID ImageBase;
ULONG ImageSize;
+ MmLockAddressSpace(AddressSpace);
+
ImageBase = *BaseAddress;
if (ImageBase == NULL)
{
}
}
}
+
*BaseAddress = ImageBase;
+
+ MmUnlockAddressSpace(AddressSpace);
+
+ /*
+ * Zero-fill the end of initialized data segments which are not completely
+ * present in the file
+ */
+ for (i = 0; i < Section->NrSegments; i++)
+ {
+ if (IMAGE_SECTION_INITIALIZED_DATA ==
+ (Section->Segments[i].Characteristics &
+ (IMAGE_SECTION_NOLOAD | IMAGE_SECTION_INITIALIZED_DATA)) &&
+ Section->Segments[i].RawLength < Section->Segments[i].Length)
+ {
+ /* PsGetCurrentProcess() might not return our process at this moment,
+ * let's make sure our address space is being used anyway */
+ KeAttachProcess(Process);
+
+ RtlZeroMemory((PVOID) (ImageBase + (ULONG_PTR) Section->Segments[i].VirtualAddress) +
+ Section->Segments[i].RawLength,
+ Section->Segments[i].Length - Section->Segments[i].RawLength);
+
+ KeDetachProcess();
+ }
+ }
}
else
{
+ MmLockAddressSpace(AddressSpace);
+
if (SectionOffset == NULL)
{
ViewOffset = 0;
Protect,
ViewOffset);
MmUnlockSectionSegment(Section->Segments);
+ MmUnlockAddressSpace(AddressSpace);
if (!NT_SUCCESS(Status))
{
MmUnlockSection(Section);
- MmUnlockAddressSpace(AddressSpace);
return(Status);
}
+
}
MmUnlockSection(Section);
- MmUnlockAddressSpace(AddressSpace);
return(STATUS_SUCCESS);
}