return FALSE;
}
+NTSTATUS
+NTAPI
+MiCopyFromUserPage(PFN_TYPE DestPage, PVOID SourceAddress)
+{
+ PEPROCESS Process;
+ KIRQL Irql;
+ PVOID TempAddress;
+
+ Process = PsGetCurrentProcess();
+ TempAddress = MiMapPageInHyperSpace(Process, DestPage, &Irql);
+ if (TempAddress == NULL)
+ {
+ return(STATUS_NO_MEMORY);
+ }
+ memcpy(TempAddress, SourceAddress, PAGE_SIZE);
+ MiUnmapPageInHyperSpace(Process, TempAddress, Irql);
+ return(STATUS_SUCCESS);
+}
+
NTSTATUS
NTAPI
MiReadPage(PMEMORY_AREA MemoryArea,
PMM_REGION Region;
BOOLEAN HasSwapEntry;
PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
+ KIRQL OldIrql;
/*
* There is a window between taking the page fault and locking the
{
if (Locked)
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmLockPage(MmGetPfnForProcess(Process, Address));
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
return(STATUS_SUCCESS);
}
}
if (Locked)
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmLockPage(Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
MmUnlockSectionSegment(Segment);
PageOp->Status = STATUS_SUCCESS;
*/
if (Locked)
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmLockPage(Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
PageOp->Status = STATUS_SUCCESS;
MmspCompleteAndReleasePageOp(PageOp);
*/
if (Locked)
{
- MmLockPageUnsafe(Page);
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+ MmLockPage(Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
/*
MmInsertRmap(Page, Process, (PVOID)PAddress);
if (Locked)
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmLockPage(Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
/*
if (Locked)
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmLockPage(Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
PageOp->Status = STATUS_SUCCESS;
MmspCompleteAndReleasePageOp(PageOp);
MmInsertRmap(Page, Process, (PVOID)PAddress);
if (Locked)
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmLockPage(Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
PageOp->Status = STATUS_SUCCESS;
MmspCompleteAndReleasePageOp(PageOp);
MmInsertRmap(Page, Process, (PVOID)PAddress);
if (Locked)
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmLockPage(Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
PageOp->Status = STATUS_SUCCESS;
MmspCompleteAndReleasePageOp(PageOp);
PMM_REGION Region;
ULONG Entry;
PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
+ KIRQL OldIrql;
DPRINT("MmAccessFaultSectionView(%x, %x, %x, %x)\n", AddressSpace, MemoryArea, Address, Locked);
}
if (Locked)
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmLockPage(NewPage);
MmUnlockPage(OldPage);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
/*
BOOLEAN DirectMapped;
BOOLEAN IsImageSection;
PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
+ KIRQL OldIrql;
Address = (PVOID)PAGE_ROUND_DOWN(Address);
}
else
{
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
MmReferencePage(Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
MmDeleteAllRmaps(Page, (PVOID)&Context, MmPageOutDeleteMapping);
MmQuerySectionView(PMEMORY_AREA MemoryArea,
PVOID Address,
PMEMORY_BASIC_INFORMATION Info,
- PULONG ResultLength)
+ PSIZE_T ResultLength)
{
PMM_REGION Region;
PVOID RegionBaseAddress;
LARGE_INTEGER Offset;
CHAR Buffer;
FILE_STANDARD_INFORMATION FileInfo;
+ ULONG Length;
/*
* Create the section
FileStandardInformation,
sizeof(FILE_STANDARD_INFORMATION),
&FileInfo,
- &Iosb.Information);
+ &Length);
+ Iosb.Information = Length;
if (!NT_SUCCESS(Status))
{
ObDereferenceObject(Section);
Buffer = ExAllocatePoolWithTag(PagedPool,
BufferSize,
'rXmM');
+ if (!Buffer)
+ {
+ KeBugCheck(MEMORY_MANAGEMENT);
+ }
UsedSize = 0;
NtQuerySection(IN HANDLE SectionHandle,
IN SECTION_INFORMATION_CLASS SectionInformationClass,
OUT PVOID SectionInformation,
- IN ULONG SectionInformationLength,
- OUT PULONG ResultLength OPTIONAL)
+ IN SIZE_T SectionInformationLength,
+ OUT PSIZE_T ResultLength OPTIONAL)
{
PROS_SECTION_OBJECT Section;
KPROCESSOR_MODE PreviousMode;
sizeof(ExSectionInfoClass) / sizeof(ExSectionInfoClass[0]),
SectionInformation,
SectionInformationLength,
+ NULL,
ResultLength,
PreviousMode);
/* Something must gone wrong
* how can we have a Section but no
* reference? */
- DPRINT1("ERROR: DataSectionObject without reference!\n");
+ DPRINT("ERROR: DataSectionObject without reference!\n");
}
}
NTSTATUS NTAPI
MmMapViewInSystemSpace (IN PVOID SectionObject,
OUT PVOID * MappedBase,
- IN OUT PULONG ViewSize)
+ IN OUT PSIZE_T ViewSize)
{
PROS_SECTION_OBJECT Section;
PMMSUPPORT AddressSpace;
return STATUS_NOT_IMPLEMENTED;
}
-/*
- * @unimplemented
- */
-NTSTATUS NTAPI
-MmSetBankedSection (ULONG Unknown0,
- ULONG Unknown1,
- ULONG Unknown2,
- ULONG Unknown3,
- ULONG Unknown4,
- ULONG Unknown5)
-{
- UNIMPLEMENTED;
- return (STATUS_NOT_IMPLEMENTED);
-}
-
-
/**********************************************************************
* NAME EXPORTED
* MmCreateSection@
AllocationAttributes));
}
-NTSTATUS
-NTAPI
-NtAllocateUserPhysicalPages(IN HANDLE ProcessHandle,
- IN OUT PULONG_PTR NumberOfPages,
- IN OUT PULONG_PTR UserPfnArray)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtMapUserPhysicalPages(IN PVOID VirtualAddresses,
- IN ULONG_PTR NumberOfPages,
- IN OUT PULONG_PTR UserPfnArray)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtMapUserPhysicalPagesScatter(IN PVOID *VirtualAddresses,
- IN ULONG_PTR NumberOfPages,
- IN OUT PULONG_PTR UserPfnArray)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtFreeUserPhysicalPages(IN HANDLE ProcessHandle,
- IN OUT PULONG_PTR NumberOfPages,
- IN OUT PULONG_PTR UserPfnArray)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
NTSTATUS
NTAPI
NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage,