21 #define STANDARD_PAGING_FILE_NAME L"\\??\\?:\\pagefile.sys" 22 #define STANDARD_DRIVE_LETTER_OFFSET 4 23 #define MEGABYTE 0x100000UL 24 #define MAXIMUM_PAGEFILE_SIZE (4095 * MEGABYTE) 26 #define MINIMUM_TO_KEEP_FREE (256 * MEGABYTE) 27 #define FUZZ_FACTOR (16 * MEGABYTE) 32 #define SMP_PAGEFILE_CREATED 0x01 33 #define SMP_PAGEFILE_DEFAULT 0x02 34 #define SMP_PAGEFILE_SYSTEM_MANAGED 0x04 35 #define SMP_PAGEFILE_WAS_TOO_BIG 0x08 36 #define SMP_PAGEFILE_ON_ANY_DRIVE 0x10 37 #define SMP_PAGEFILE_EMERGENCY 0x20 38 #define SMP_PAGEFILE_DUMP_PROCESSED 0x40 54 #define SMP_VOLUME_INSERTED 0x01 55 #define SMP_VOLUME_PAGEFILE_CREATED 0x04 56 #define SMP_VOLUME_IS_BOOT 0x08 87 ULONG MinSize = 0, MaxSize = 0;
98 DPRINT1(
"SMSS:PFILE: Too many paging files specified - %lu\n",
104 DPRINT(
"SMSS:PFILE: Paging file specifier `%wZ'\n", PageFileToken);
113 DPRINT1(
"SMSS:PFILE: SmpParseCommandLine( %wZ ) failed - Status == %lx\n",
129 if ((
c !=
L' ') && (
c !=
L'\t') && (
c !=
L'0'))
139 if (!(Arguments.
Buffer) || (ZeroSize))
142 SystemManaged =
TRUE;
219 DPRINT(
"SMSS:PFILE: Created descriptor for `%wZ' (`%wZ')\n",
226 NextEntry = NextEntry->
Flink;
231 DPRINT1(
"SMSS:PFILE: Skipping duplicate specifier `%wZ'\n", PageFileToken);
267 sizeof(StandardInfo),
271 DPRINT1(
"SMSS:PFILE: Failed query for size potential pagefile `%wZ' with status %X\n",
315 DPRINT1(
"SMSS:PFILE: Failed to delete page file `%wZ' (status %X)\n",
320 DPRINT(
"SMSS:PFILE: Deleted stale paging file - %wZ\n",
FileName);
328 DPRINT1(
"SMSS:PFILE: Failed to open for deletion page file `%wZ' (status %X)\n",
347 WCHAR PathString[32];
351 wcscpy(PathString,
L"\\??\\A:\\");
383 DPRINT1(
"SMSS:PFILE: Query volume `%wZ' (handle %p) for size failed" 402 Volume->FreeSpace.QuadPart = 0;
437 if (
Volume->DriveLetter == UpLetter)
break;
438 NextEntry = NextEntry->
Flink;
459 DPRINT(
"SMSS:PFILE: NtCreatePagingFile (%wZ, %I64X, %I64X) succeeded.\n",
466 DPRINT1(
"SMSS:PFILE: NtCreatePagingFile (%wZ, %I64X, %I64X) failed with %X\n",
490 ShouldDelete =
FALSE;
495 DPRINT1(
"SMSS:PFILE: No volume descriptor for `%wZ'\n",
507 DPRINT(
"SMSS:PFILE: Checking for crash dump in `%wZ' on boot volume\n",
515 DPRINT1(
"SMSS:PFILE: Failed to query free space for boot volume `%wC'\n",
520 DPRINT(
"Queried free space for boot volume `%wC: %I64x'\n",
531 DPRINT(
"SMSS:PFILE: Skipping crash dump checking for `%wZ' on non boot" 544 DPRINT(
"SMSS:PFILE: Detected size %I64X for future paging file `%wZ'\n",
547 DPRINT(
"SMSS:PFILE: Free space on volume `%wC' is %I64X\n",
549 Volume->FreeSpace.QuadPart);
561 DPRINT(
"SMSS:PFILE: min %I64X, max %I64X, real min %I64X\n",
564 MinimumSize->QuadPart);
567 while (
Descriptor->ActualMinSize.QuadPart >= MinimumSize->QuadPart)
584 Descriptor->ActualMinSize.QuadPart -= FuzzFactor->QuadPart;
588 if (
Descriptor->ActualMinSize.QuadPart < MinimumSize->QuadPart)
598 DPRINT1(
"SMSS:PFILE: Failing for min %I64X, max %I64X, real min %I64X\n",
601 MinimumSize->QuadPart);
640 NextEntry = NextEntry->
Flink;
673 DPRINT1(
"SMSS:PFILE: NtQuerySystemInformation failed with %x\n",
Status);
702 DPRINT(
"SMSS:PFILE: Validating sizes for `%wZ' %I64X %I64X\n",
706 if (MinSize > MaxSize) MaxSize = MinSize;
712 DPRINT1(
"ReactOS does not support PAE yet... assuming sizes OK\n");
737 DPRINT(
"SMSS:PFILE: Trimmed size of `%wZ' to maximum allowed\n",
840 &ProcessInformation.
Query,
841 sizeof(ProcessInformation.
Query),
845 DPRINT1(
"SMSS:PFILE: Query(ProcessDeviceMap) failed with status %X\n",
856 for (
Drive = StartChar, DriveDiff = StartChar -
L'A';
Drive <=
L'Z';
Drive++, DriveDiff++)
859 if (!((1 << DriveDiff) & ProcessInformation.
Query.DriveMap))
continue;
877 DPRINT1(
"SMSS:PFILE: Open volume `%wZ' failed with status %X\n",
891 DPRINT1(
"SMSS:PFILE: Query volume `%wZ' (handle %p) for device info" 892 " failed with status %X\n",
907 DPRINT1(
"SMSS:PFILE: Volume `%wZ' (%X) cannot store a paging file\n",
921 DPRINT1(
"SMSS:PFILE: Failed to allocate a volume descriptor (%u bytes)\n",
938 BootVolumeFound =
TRUE;
950 DPRINT1(
"SMSS:PFILE: Query volume `%wZ' (handle %p) for size failed" 972 Volume->FreeSpace.QuadPart = 0;
984 DPRINT(
"SMSS:PFILE: Created volume descriptor for`%wZ'\n", &VolumePath);
1011 DPRINT1(
"SMSS:PFILE: No paging file was requested\n");
1020 DPRINT1(
"SMSS:PFILE: Failed to create volume descriptors (status %X)\n",
1037 DPRINT(
"SMSS:PFILE: Creating a system managed paging file (`%wZ')\n",
1043 DPRINT(
"SMSS:PFILE: Trying lower sizes for (`%wZ')\n",
1054 DPRINT(
"SMSS:PFILE: Creating a normal paging file (`%wZ')\n",
1066 DPRINT(
"SMSS:PFILE: Trying lower sizes for (`%wZ')\n",
1086 NextEntry = NextEntry->
Flink;
1093 DPRINT1(
"SMSS:PFILE: Creating emergency paging file.\n");
NTSTATUS NTAPI SmpDeletePagingFile(IN PUNICODE_STRING FileName)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
#define MAXIMUM_PAGEFILE_SIZE
#define OBJ_CASE_INSENSITIVE
NTSTATUS NTAPI SmpCreateEmergencyPagingFile(VOID)
#define STANDARD_PAGING_FILE_NAME
ULONG SmpNumberOfPagingFiles
#define STATUS_INVALID_PARAMETER
LIST_ENTRY SmpVolumeDescriptorList
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
#define FILE_DIRECTORY_FILE
NTSTATUS NTAPI SmpParseCommandLine(IN PUNICODE_STRING CommandLine, OUT PULONG Flags, OUT PUNICODE_STRING FileName, OUT PUNICODE_STRING Directory, OUT PUNICODE_STRING Arguments)
#define SMP_VOLUME_INSERTED
NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, OUT PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
NTSTATUS NTAPI SmpGetVolumeFreeSpace(IN PSMP_VOLUME_DESCRIPTOR Volume)
IN PVOID IN PVOID IN USHORT IN USHORT Size
NTSTATUS NTAPI SmpCreatePagingFileOnFixedDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, IN PLARGE_INTEGER FuzzFactor, IN PLARGE_INTEGER MinimumSize)
#define InsertTailList(ListHead, Entry)
#define SMP_VOLUME_IS_BOOT
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
#define FILE_WRITE_ATTRIBUTES
#define STATUS_TOO_MANY_PAGING_FILES
VOID NTAPI SmpPagingFileInitialize(VOID)
VOID NTAPI SmpMakeSystemManagedPagingFileDescriptor(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor)
NTSTATUS NTAPI SmpCreateSystemManagedPagingFile(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, IN BOOLEAN DecreaseSize)
#define SMP_PAGEFILE_WAS_TOO_BIG
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
struct _SMP_PAGEFILE_DESCRIPTOR * PSMP_PAGEFILE_DESCRIPTOR
#define FILE_REMOVABLE_MEDIA
NTSTATUS NTAPI SmpCreatePagingFileOnAnyDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, IN PLARGE_INTEGER FuzzFactor, IN PLARGE_INTEGER MinimumSize)
struct _SMP_PAGEFILE_DESCRIPTOR SMP_PAGEFILE_DESCRIPTOR
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define SMP_VOLUME_PAGEFILE_CREATED
#define NtCurrentProcess()
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
WCHAR NTAPI RtlUpcaseUnicodeChar(_In_ WCHAR Source)
struct _LIST_ENTRY * Flink
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI SmpCheckForCrashDump(IN PUNICODE_STRING FileName)
struct _DeviceInfo DeviceInfo
struct _SMP_VOLUME_DESCRIPTOR * PSMP_VOLUME_DESCRIPTOR
_Must_inspect_result_ _Out_ PHANDLE VolumeHandle
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define FILE_READ_ATTRIBUTES
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define FILE_SHARE_DELETE
#define FILE_REMOTE_DEVICE
#define SMP_PAGEFILE_SYSTEM_MANAGED
NTSTATUS NTAPI SmpCreatePagingFiles(VOID)
#define FILE_NON_DIRECTORY_FILE
#define SMP_PAGEFILE_ON_ANY_DRIVE
#define STANDARD_DRIVE_LETTER_OFFSET
FILE_FS_DEVICE_INFORMATION DeviceInfo
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
PSMP_VOLUME_DESCRIPTOR NTAPI SmpSearchVolumeDescriptor(IN WCHAR DriveLetter)
NTSTATUS NTAPI NtQueryVolumeInformationFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FsInformation, ULONG Length, FS_INFORMATION_CLASS FsInformationClass)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
struct _SMP_VOLUME_DESCRIPTOR SMP_VOLUME_DESCRIPTOR
#define InitializeListHead(ListHead)
static OUT PIO_STATUS_BLOCK IoStatusBlock
NTSTATUS NTAPI SmpGetPagingFileSize(IN PUNICODE_STRING FileName, OUT PLARGE_INTEGER Size)
VOID NTAPI SmpMakeDefaultPagingFileDescriptor(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor)
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_opt_ PLARGE_INTEGER MaximumSize
#define STATUS_UNEXPECTED_IO_ERROR
#define FileStandardInformation
LARGE_INTEGER ActualMinSize
#define FILE_SYNCHRONOUS_IO_NONALERT
NTSTATUS NTAPI NtCreatePagingFile(IN PUNICODE_STRING FileName, IN PLARGE_INTEGER MinimumSize, IN PLARGE_INTEGER MaximumSize, IN ULONG Reserved)
_Must_inspect_result_ _Inout_opt_ PUNICODE_STRING VolumeName
NTSTATUS NTAPI SmpCreatePagingFile(IN PUNICODE_STRING Name, IN PLARGE_INTEGER MinSize, IN PLARGE_INTEGER MaxSize, IN ULONG Priority)
LIST_ENTRY SmpPagingFileDescriptorList
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define SMP_PAGEFILE_CREATED
#define InitializeObjectAttributes(p, n, a, r, s)
#define SMP_PAGEFILE_EMERGENCY
#define FILE_FLOPPY_DISKETTE
NTSTATUS NTAPI SmpValidatePagingFileSizes(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor)
NTSTATUS NTAPI SmpCreatePagingFileDescriptor(IN PUNICODE_STRING PageFileToken)
#define SMP_PAGEFILE_DEFAULT
LARGE_INTEGER ActualMaxSize
base of all file and directory entries
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
#define SMP_PAGEFILE_DUMP_PROCESSED
#define FILE_READ_ONLY_DEVICE
NTSTATUS NTAPI NtQueryInformationProcess(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_ PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength)
#define MINIMUM_TO_KEEP_FREE
NTSTATUS NTAPI SmpCreateVolumeDescriptors(VOID)
BOOLEAN SmpRegistrySpecifierPresent