#define NDEBUG
#include <internal/debug.h>
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, MmInitPagingFile)
+#endif
+
+
/* TYPES *********************************************************************/
typedef struct _PAGINGFILE
}
VOID
+NTAPI
MmShowOutOfSpaceMessagePagingFile(VOID)
{
if (!MmSwapSpaceMessage)
#endif
}
-NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PFN_TYPE Page)
+NTSTATUS
+NTAPI
+MmWriteToSwapPage(SWAPENTRY SwapEntry, PFN_TYPE Page)
{
ULONG i, offset;
LARGE_INTEGER file_offset;
return(Status);
}
-NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PFN_TYPE Page)
+NTSTATUS
+NTAPI
+MmReadFromSwapPage(SWAPENTRY SwapEntry, PFN_TYPE Page)
{
ULONG i, offset;
LARGE_INTEGER file_offset;
return(Status);
}
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+NTAPI
MmInitPagingFile(VOID)
{
ULONG i;
}
BOOLEAN
+NTAPI
MmReserveSwapPages(ULONG Nr)
{
KIRQL oldIrql;
}
VOID
+NTAPI
MmDereserveSwapPages(ULONG Nr)
{
KIRQL oldIrql;
}
VOID
+NTAPI
MmFreeSwapPage(SWAPENTRY Entry)
{
ULONG i;
}
BOOLEAN
+NTAPI
MmIsAvailableSwapPage(VOID)
{
return(MiFreeSwapPages > 0);
}
SWAPENTRY
+NTAPI
MmAllocSwapPage(VOID)
{
KIRQL oldIrql;
Headers->Type = MmCoreDumpType;
if (TrapFrame != NULL)
{
- if (!(TrapFrame->Eflags & (1 << 17)))
+ if (!(TrapFrame->EFlags & (1 << 17)))
{
memcpy(&Headers->TrapFrame, TrapFrame,
sizeof(KTRAP_FRAME) - (4 * sizeof(DWORD)));
PreviousMode = ExGetPreviousMode();
- Status = RtlCaptureUnicodeString(&CapturedFileName,
- PreviousMode,
- PagedPool,
- FALSE,
- FileName);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
if (PreviousMode != KernelMode)
{
_SEH_TRY
if (!NT_SUCCESS(Status))
{
- RtlReleaseCapturedUnicodeString(&CapturedFileName,
- PreviousMode,
- FALSE);
return Status;
}
}
SafeMaximumSize = *MaximumSize;
}
+ /* Pagefiles can't be larger than 4GB and ofcourse the minimum should be
+ smaller than the maximum */
+ if (0 != SafeInitialSize.u.HighPart)
+ {
+ return STATUS_INVALID_PARAMETER_2;
+ }
+ if (0 != SafeMaximumSize.u.HighPart)
+ {
+ return STATUS_INVALID_PARAMETER_3;
+ }
+ if (SafeMaximumSize.u.LowPart < SafeInitialSize.u.LowPart)
+ {
+ return STATUS_INVALID_PARAMETER_MIX;
+ }
+
+ Status = ProbeAndCaptureUnicodeString(&CapturedFileName,
+ PreviousMode,
+ FileName);
+ if (!NT_SUCCESS(Status))
+ {
+ return(Status);
+ }
+
InitializeObjectAttributes(&ObjectAttributes,
&CapturedFileName,
0,
NULL,
SL_OPEN_PAGING_FILE | IO_NO_PARAMETER_CHECKING);
- RtlReleaseCapturedUnicodeString(&CapturedFileName,
- PreviousMode,
- FALSE);
+ ReleaseCapturedUnicodeString(&CapturedFileName,
+ PreviousMode);
if (!NT_SUCCESS(Status))
{
return(Status);
return Status;
}
- BytesPerAllocationUnit = FsSizeInformation.SectorsPerAllocationUnit * FsSizeInformation.BytesPerSector;
- if (BytesPerAllocationUnit % PAGE_SIZE)
+ BytesPerAllocationUnit = FsSizeInformation.SectorsPerAllocationUnit *
+ FsSizeInformation.BytesPerSector;
+
+ /* We have to find a value which is a multiple of both PAGE_SIZE and
+ BytesPerAllocationUnit */
+ SafeInitialSize.u.LowPart = ((SafeInitialSize.u.LowPart + PAGE_SIZE - 1) /
+ PAGE_SIZE) * PAGE_SIZE;
+ while (0 != (SafeInitialSize.u.LowPart % BytesPerAllocationUnit) &&
+ SafeInitialSize.u.LowPart <= SafeMaximumSize.u.LowPart - PAGE_SIZE)
+ {
+ SafeInitialSize.u.LowPart += PAGE_SIZE;
+ }
+ if (0 != (SafeInitialSize.u.LowPart % BytesPerAllocationUnit))
{
ZwClose(FileHandle);
- return STATUS_UNSUCCESSFUL;
+ return STATUS_ALLOTTED_SPACE_EXCEEDED;
}
+ ASSERT(0 == (SafeInitialSize.u.LowPart % PAGE_SIZE));
Status = ZwSetInformationFile(FileHandle,
&IoStatus,