https://git.reactos.org/?p=reactos.git;a=commitdiff;h=04b2d35f5b7372578891d1d455ca5e0e669d7644

commit 04b2d35f5b7372578891d1d455ca5e0e669d7644
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Thu Nov 3 02:34:20 2022 +0100
Commit:     Hermès Bélusca-Maïto <[email protected]>
CommitDate: Wed Nov 16 21:55:23 2022 +0100

    [SYSDM] Improvements for the Paging File settings dialog. (#4844)
    
    - Implement the architecture-specific pagefile size limits.
      In particular, verify that the selected volume on which to create
      the page file can accomodate the theoretical maximum limit (e.g.
      FAT32 cannot accomodate a 16 TB pagefile on x64, and the limit must
      be lowered down to 4 GB).
    
    - Change the IDS_WARNINITIALRANGE and IDS_WARNMAXIMUMRANGE strings
      so that the maximum limit mentioned is the dynamic one.
    
    - Review, improve and fix other aspects of the code.
    
    Parts of this PR: addendum to commits 4d2d2dbb2 (#2597), 3bee3b92a (#2706).
---
 dll/cpl/sysdm/lang/bg-BG.rc |   6 +-
 dll/cpl/sysdm/lang/cs-CZ.rc |   6 +-
 dll/cpl/sysdm/lang/da-DK.rc |  10 +-
 dll/cpl/sysdm/lang/de-DE.rc |   6 +-
 dll/cpl/sysdm/lang/el-GR.rc |  10 +-
 dll/cpl/sysdm/lang/en-US.rc |  35 +++-
 dll/cpl/sysdm/lang/es-ES.rc |   6 +-
 dll/cpl/sysdm/lang/fr-FR.rc |   8 +-
 dll/cpl/sysdm/lang/he-IL.rc |  10 +-
 dll/cpl/sysdm/lang/hu-HU.rc |   6 +-
 dll/cpl/sysdm/lang/id-ID.rc |   6 +-
 dll/cpl/sysdm/lang/it-IT.rc |   6 +-
 dll/cpl/sysdm/lang/ja-JP.rc |   6 +-
 dll/cpl/sysdm/lang/nl-NL.rc |  10 +-
 dll/cpl/sysdm/lang/no-NO.rc |  10 +-
 dll/cpl/sysdm/lang/pl-PL.rc |   6 +-
 dll/cpl/sysdm/lang/pt-PT.rc |   6 +-
 dll/cpl/sysdm/lang/ro-RO.rc |   6 +-
 dll/cpl/sysdm/lang/ru-RU.rc |   6 +-
 dll/cpl/sysdm/lang/sk-SK.rc |  10 +-
 dll/cpl/sysdm/lang/sq-AL.rc |   6 +-
 dll/cpl/sysdm/lang/sv-SE.rc |  10 +-
 dll/cpl/sysdm/lang/tr-TR.rc |   6 +-
 dll/cpl/sysdm/lang/uk-UA.rc |   6 +-
 dll/cpl/sysdm/lang/zh-CN.rc |   6 +-
 dll/cpl/sysdm/lang/zh-HK.rc |   6 +-
 dll/cpl/sysdm/lang/zh-TW.rc |   6 +-
 dll/cpl/sysdm/virtmem.c     | 418 +++++++++++++++++++++++++++-----------------
 28 files changed, 384 insertions(+), 255 deletions(-)

diff --git a/dll/cpl/sysdm/lang/bg-BG.rc b/dll/cpl/sysdm/lang/bg-BG.rc
index fe3b465d528..72469e59eb3 100644
--- a/dll/cpl/sysdm/lang/bg-BG.rc
+++ b/dll/cpl/sysdm/lang/bg-BG.rc
@@ -356,9 +356,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Приложение за таблото за управление на уредбата"
     IDS_WARNINITIALSIZE "Въведете числена стойност за началния размер на 
страниращия файл."
     IDS_WARNMAXIMUMSIZE "Въведете числена стойност за върховия размер на 
страниращия файл."
-    IDS_WARNINITIALRANGE "Началният размер на страниращия файл не трябва да е 
по-малък от 2 МБ и не трябва да надхвърля свободното пространство на избраното 
устройство."
-    IDS_WARNMAXIMUMRANGE "Върховият размер на страниращия файл не трябва да е 
по-малък от началния и не трябва да надвишава свободното пространство на 
избраното устройство"
-    IDS_PAGEFILE_MB "%u МБ"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu МБ"
     IDS_PAGEFILE_NONE "Няма"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/cs-CZ.rc b/dll/cpl/sysdm/lang/cs-CZ.rc
index 2d576382719..a2cfa5ab364 100644
--- a/dll/cpl/sysdm/lang/cs-CZ.rc
+++ b/dll/cpl/sysdm/lang/cs-CZ.rc
@@ -361,9 +361,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Systémový aplet kontrolních panelů"
     IDS_WARNINITIALSIZE "Zadejte číselnou hodnotu pro počáteční velikost 
stránkovacího souboru."
     IDS_WARNMAXIMUMSIZE "Zadejte číselnou hodnotu pro maximální velikost 
stránkovacího souboru."
-    IDS_WARNINITIALRANGE "Počáteční velikost stránkovacího souboru nesmí být 
menší než 2 MB a nesmí překročit množství volného místa na zvolené diskové 
jednotce."
-    IDS_WARNMAXIMUMRANGE "Maximální velikost stránkovacího souboru nesmí být 
menší než velikost počáteční, nesmí být větší než 4095 MB a nesmí překročit 
množství volného místa na zvolené diskové jednotce."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Není"
     IDS_PAGEFILE_SYSTEM "Spravováno systémem"
     IDS_INFOREBOOT "Změny se projeví po restartování počítače."
diff --git a/dll/cpl/sysdm/lang/da-DK.rc b/dll/cpl/sysdm/lang/da-DK.rc
index 88218228efd..4cb16a08931 100644
--- a/dll/cpl/sysdm/lang/da-DK.rc
+++ b/dll/cpl/sysdm/lang/da-DK.rc
@@ -354,11 +354,11 @@ BEGIN
     IDS_USERPROFILE_ACCOUNT_DELETED "Account Deleted"
     IDS_USERPROFILE_TYPE_TEXT "When %s logs onto this computer, should the 
operating system use the roaming profile or just the locally cached copy of the 
roaming profile."
     IDS_MESSAGEBOXTITLE "System control panel applet"
-    IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the 
paging file."
-    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the 
paging file."
-    IDS_WARNINITIALRANGE "The initial size of the paging file must not be 
smaller than 2 MB,  must not be larger than 4095 MB and must not exceed the 
available space on the selected drive."
-    IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be 
smaller than its initial size, must not be larger than 4095 MB and must not 
exceed the available space on the selected drive."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALSIZE "Enter a numeric value for the paging file initial 
size."
+    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the paging file maximum 
size."
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "None"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/de-DE.rc b/dll/cpl/sysdm/lang/de-DE.rc
index dc683b139fb..a76aef59525 100644
--- a/dll/cpl/sysdm/lang/de-DE.rc
+++ b/dll/cpl/sysdm/lang/de-DE.rc
@@ -365,9 +365,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Systemsteuerungsoption ""System"""
     IDS_WARNINITIALSIZE "Geben Sie einen numerischen Wert für die Anfangsgröße 
der Auslagerungsdatei an."
     IDS_WARNMAXIMUMSIZE "Geben Sie einen numerischen Wert für die Maximalgröße 
der Auslagerungsdatei an."
-    IDS_WARNINITIALRANGE "Die Anfangsgröße der Auslagerungsdatei darf nicht 
kleiner als 2 MB sein und darf den verfügbaren Speicherplatz auf dem gewählten 
Laufwerk nicht überschreiten."
-    IDS_WARNMAXIMUMRANGE "Die Maximalgröße der Auslagerungsdatei darf nicht 
kleiner als die Anfangsgröße sein und darf den verfügbaren Speicherplatz auf 
dem gewählten Laufwerk nicht überschreiten."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "Die Anfangsgröße der Auslagerungsdatei muss zwischen 
2 MB und %lu MB auf dem gewählten Laufwerk sein."
+    IDS_WARNMAXIMUMRANGE "Die Maximalgröße der Auslagerungsdatei darf nicht 
kleiner als die Anfangsgröße sein, und muss kleiner als %lu MB auf dem 
gewählten Laufwerk sein."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Keine"
     IDS_PAGEFILE_SYSTEM "Systemverwaltet"
     IDS_INFOREBOOT "Sie müssen den Computer neu starten, damit die Änderung 
wirksam wird."
diff --git a/dll/cpl/sysdm/lang/el-GR.rc b/dll/cpl/sysdm/lang/el-GR.rc
index 6a2b373b257..04b12dab3cf 100644
--- a/dll/cpl/sysdm/lang/el-GR.rc
+++ b/dll/cpl/sysdm/lang/el-GR.rc
@@ -354,11 +354,11 @@ BEGIN
     IDS_USERPROFILE_ACCOUNT_DELETED "Account Deleted"
     IDS_USERPROFILE_TYPE_TEXT "When %s logs onto this computer, should the 
operating system use the roaming profile or just the locally cached copy of the 
roaming profile."
     IDS_MESSAGEBOXTITLE "System control panel applet"
-    IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the 
paging file."
-    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the 
paging file."
-    IDS_WARNINITIALRANGE "The initial size of the paging file must not be 
smaller than 2 MB,  must not be larger than 4095 MB and must not exceed the 
available space on the selected drive."
-    IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be 
smaller than its initial size, must not be larger than 4095 MB and must not 
exceed the available space on the selected drive."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALSIZE "Enter a numeric value for the paging file initial 
size."
+    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the paging file maximum 
size."
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Κανένα"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/en-US.rc b/dll/cpl/sysdm/lang/en-US.rc
index 185b7f773be..68fe830aa2e 100644
--- a/dll/cpl/sysdm/lang/en-US.rc
+++ b/dll/cpl/sysdm/lang/en-US.rc
@@ -354,11 +354,11 @@ BEGIN
     IDS_USERPROFILE_ACCOUNT_DELETED "Account Deleted"
     IDS_USERPROFILE_TYPE_TEXT "When %s logs onto this computer, should the 
operating system use the roaming profile or just the locally cached copy of the 
roaming profile."
     IDS_MESSAGEBOXTITLE "System control panel applet"
-    IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the 
paging file."
-    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the 
paging file."
-    IDS_WARNINITIALRANGE "The initial size of the paging file must not be 
smaller than 2 MB,  must not be larger than 4095 MB and must not exceed the 
available space on the selected drive."
-    IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be 
smaller than its initial size, must not be larger than 4095 MB and must not 
exceed the available space on the selected drive."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALSIZE "Enter a numeric value for the paging file initial 
size."
+    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the paging file maximum 
size."
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "None"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
@@ -371,3 +371,28 @@ BEGIN
     IDS_ENVIRONMENT_WARNING_TITLE "System Properties"
     IDS_FILE_BROWSE_FILTER "All Files (*.*)\0*.*\0"
 END
+
+/*
+ * Couple of other strings for PageFile support that may be useful later:
+
+"ReactOS created a temporary paging file on your computer because of a problem 
that occurred with your paging file configuration when you started your 
computer. The total paging file size for all disk drives may be somewhat larger 
than the size you specified."
+
+"You are not logged onto ReactOS as a member of the user group that has the 
right to view the workstation's Virtual Memory settings."
+
+"There is not enough space on this drive for the paging file size specified. 
Please enter a smaller number or free some disk space."
+
+"Drive %c: is too small for the maximum paging file size specified. Please 
enter a smaller number."
+
+"Could not read the current virtual memory settings."
+
+"Drive %c: does not have enough free space for the maximum paging file size 
specified. If you continue with this setting, the paging file will only grow to 
the size of the available free space."
+
+"Another file exists with the filename \"%s\". Do you wish to overwrite the 
existing file with a page file?"
+
+"There is not enough space on this drive to create the page file size 
specified. At least %d MB of free disk space must be left after the page file 
is created. Specify a smaller page file size or free some disk space."
+
+"If the pagefile on volume %c: has an initial size of less than %d MB, then 
the system may not be able to create a debugging information file if a STOP 
error occurs. Continue anyway?"
+
+"Unable to determine the current paging file size. The value reported as the 
current paging file size may be incorrect."
+
+ */
diff --git a/dll/cpl/sysdm/lang/es-ES.rc b/dll/cpl/sysdm/lang/es-ES.rc
index 509ec172624..d3551fe5009 100644
--- a/dll/cpl/sysdm/lang/es-ES.rc
+++ b/dll/cpl/sysdm/lang/es-ES.rc
@@ -358,9 +358,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Applet de sistema del Panel de control"
     IDS_WARNINITIALSIZE "Introduzca el tamaño inicial del archivo de 
paginación."
     IDS_WARNMAXIMUMSIZE "Introduzca el tamaño máximo del archivo de 
paginación."
-    IDS_WARNINITIALRANGE "El tamaño inicial del archivo de paginación no puede 
ser inferior a 2 MB y no puede exceder el espacio disponible en la unidad 
seleccionada."
-    IDS_WARNMAXIMUMRANGE "El tamaño máximo del archivo de paginación no puede 
ser inferior al tamaño inicial y no puede exceder el espacio disponible en la 
unidad seleccionada."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Ninguno"
     IDS_PAGEFILE_SYSTEM "Administrado por el sistema"
     IDS_INFOREBOOT "Es necesario reiniciar el equipo para que se apliquen los 
cambios."
diff --git a/dll/cpl/sysdm/lang/fr-FR.rc b/dll/cpl/sysdm/lang/fr-FR.rc
index cd959c56c09..0f6123c05ba 100644
--- a/dll/cpl/sysdm/lang/fr-FR.rc
+++ b/dll/cpl/sysdm/lang/fr-FR.rc
@@ -356,14 +356,14 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Application Système du Panneau de configuration"
     IDS_WARNINITIALSIZE "Entrez une valeur numérique pour la taille initiale 
du fichier d'échange."
     IDS_WARNMAXIMUMSIZE "Entrez une valeur numérique pour la taille maximale 
du fichier d'échange."
-    IDS_WARNINITIALRANGE "La taille initiale du fichier d'échange doit être 
comprise entre 2 Mo et 4096 Mo, et ne peut pas excéder la quantité d'espace 
libre sur le lecteur que vous avez sélectionné."
-    IDS_WARNMAXIMUMRANGE "Entrez une valeur pour la taille maximale du fichier 
d'échange qui soit supérieure ou égale à la taille initiale du fichier 
d'échange, et inférieure à 4096 Mo."
-    IDS_PAGEFILE_MB "%u Mo"
+    IDS_WARNINITIALRANGE "La taille initiale du fichier d'échange doit être 
comprise entre 2 Mo et %lu Mo sur le lecteur sélectionné."
+    IDS_WARNMAXIMUMRANGE "La taille maximale du fichier d'échange doit être 
supérieure ou égale à sa taille initiale, et inférieure à %lu Mo sur le lecteur 
sélectionné."
+    IDS_PAGEFILE_MB "%lu Mo"
     IDS_PAGEFILE_NONE "Aucun"
     IDS_PAGEFILE_SYSTEM "Géré par le système"
     IDS_INFOREBOOT "Vous devez redémarrer le système pour appliquer les 
changements."
     IDS_HWPROFILE_CONFIRM_DELETE_TITLE "Confirmation de suppression"
-    IDS_HWPROFILE_CONFIRM_DELETE "Êtes-vous sûre de vouloir supprimer le 
profil matériel ""%s"" ?"
+    IDS_HWPROFILE_CONFIRM_DELETE "Êtes-vous sûr de vouloir supprimer le profil 
matériel ""%s"" ?"
     IDS_HWPROFILE_ALREADY_IN_USE "Le nom de profil est déjà utilisé."
     IDS_HWPROFILE_PROFILE "Profil"
     IDS_HWPROFILE_WARNING "Attention"
diff --git a/dll/cpl/sysdm/lang/he-IL.rc b/dll/cpl/sysdm/lang/he-IL.rc
index 07be45209ec..a846116a434 100644
--- a/dll/cpl/sysdm/lang/he-IL.rc
+++ b/dll/cpl/sysdm/lang/he-IL.rc
@@ -356,11 +356,11 @@ BEGIN
     IDS_USERPROFILE_ACCOUNT_DELETED "Account Deleted"
     IDS_USERPROFILE_TYPE_TEXT "When %s logs onto this computer, should the 
operating system use the roaming profile or just the locally cached copy of the 
roaming profile."
     IDS_MESSAGEBOXTITLE "System control panel applet"
-    IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the 
paging file."
-    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the 
paging file."
-    IDS_WARNINITIALRANGE "The initial size of the paging file must not be 
smaller than 2 MB,  must not be larger than 4095 MB and must not exceed the 
available space on the selected drive."
-    IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be 
smaller than its initial size, must not be larger than 4095 MB and must not 
exceed the available space on the selected drive."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALSIZE "Enter a numeric value for the paging file initial 
size."
+    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the paging file maximum 
size."
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "ללא"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/hu-HU.rc b/dll/cpl/sysdm/lang/hu-HU.rc
index 1e679a92e7d..8af6e8d0ed8 100644
--- a/dll/cpl/sysdm/lang/hu-HU.rc
+++ b/dll/cpl/sysdm/lang/hu-HU.rc
@@ -358,9 +358,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Rendszer kezelőpanel"
     IDS_WARNINITIALSIZE "Adjon meg egy számértéket a lapozófájl kezdeti 
méretének."
     IDS_WARNMAXIMUMSIZE "Adjon meg egy számértéket a lapozófájl maximális 
méretének."
-    IDS_WARNINITIALRANGE "A lapozófájl kezdeti mérete nem lehet kisebb mint 2 
MB, nem lehet nagyobb mint 4095 MB és nem haladhatja meg a kijelölt meghajtón 
rendelkezésre álló szabad helyet."
-    IDS_WARNMAXIMUMRANGE "A lapozófájl maximális mérete nem lehet kisebb mint 
a kezdeti mérete, nem lehet nagyobb mint 4095 MB és nem haladhatja meg a 
kijelölt meghajtón rendelkezésre álló szabad helyet."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "nincs"
     IDS_PAGEFILE_SYSTEM "Rendszer által kezelt"
     IDS_INFOREBOOT "A változtatások életbe lépéséhez újra kell indítania a 
számítógépet."
diff --git a/dll/cpl/sysdm/lang/id-ID.rc b/dll/cpl/sysdm/lang/id-ID.rc
index bbd73c52329..6387fc065c8 100644
--- a/dll/cpl/sysdm/lang/id-ID.rc
+++ b/dll/cpl/sysdm/lang/id-ID.rc
@@ -356,9 +356,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Applet panel kontrol sistem"
     IDS_WARNINITIALSIZE "Masukkan nilai numerik untuk ukuran awal halaman 
berkas."
     IDS_WARNMAXIMUMSIZE "Masukkan nilai numerik untuk ukuran maksimum halaman 
berkas."
-    IDS_WARNINITIALRANGE "Ukuran awal halaman berkas tidak boleh lebih kecil 
dari 2 MB dan tidak boleh melebihi ruang yang tersedia pada drive yang dipilih."
-    IDS_WARNMAXIMUMRANGE "Ukuran maksimum halaman berkas tidak boleh lebih 
kecil dari ukuran awal, maupun lebih besar dari 4095 MB dan tidak boleh 
melebihi ruang yang tersedia pada drive yang dipilih."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "Ukuran awal halaman berkas tidak boleh lebih kecil 
dari 2 MB dan %lu MB pada drive yang dipilih."
+    IDS_WARNMAXIMUMRANGE "Ukuran maksimum halaman berkas harus lebih besar 
atau sama persis dari ukuran awal, dan kurang dari %lu MB pada drive yang 
dipilih."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Tidak ada"
     IDS_PAGEFILE_SYSTEM "Diatur Sistem"
     IDS_INFOREBOOT "Anda harus memulai ulang komputer untuk menerapkan 
perubahan."
diff --git a/dll/cpl/sysdm/lang/it-IT.rc b/dll/cpl/sysdm/lang/it-IT.rc
index e4847fce032..5eba295a4f9 100644
--- a/dll/cpl/sysdm/lang/it-IT.rc
+++ b/dll/cpl/sysdm/lang/it-IT.rc
@@ -356,9 +356,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Applet di sistema del pannello di controllo"
     IDS_WARNINITIALSIZE "Immettere la dimensione iniziale del file di paging."
     IDS_WARNMAXIMUMSIZE "Immettere la dimensione massima del file di paging."
-    IDS_WARNINITIALRANGE "La dimensione iniziale del file di paging non può 
essere inferiore a 2 MB e non può superare lo spazio disponibile nell'unità 
selezionata."
-    IDS_WARNMAXIMUMRANGE "La dimensione massima del file di paging non può 
essere inferiore a quella iniziale e non può superare lo spazio disponibile 
nell'unità selezionata."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "None"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/ja-JP.rc b/dll/cpl/sysdm/lang/ja-JP.rc
index 702b922ea20..a3dbe2818f8 100644
--- a/dll/cpl/sysdm/lang/ja-JP.rc
+++ b/dll/cpl/sysdm/lang/ja-JP.rc
@@ -356,9 +356,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "システム コントロール パネル アプレット"
     IDS_WARNINITIALSIZE "ページングファイルの初期サイズの数値を入力して下さい。"
     IDS_WARNMAXIMUMSIZE "ページングファイルの最大サイズの数値を入力して下さい。"
-    IDS_WARNINITIALRANGE "ページングファイルの初期サイズは2 
MB以上でなければなりません。また、選択中のドライブの利用可能なサイズを超えてはいけません。"
-    IDS_WARNMAXIMUMRANGE "ページングファイルの最大サイズは初期サイズ以上でなければなりません。また、4095 MB 
か選択中のドライブの利用可能なサイズを超えてはいけません。"
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "なし"
     IDS_PAGEFILE_SYSTEM "システム管理"
     IDS_INFOREBOOT "変更を適用するには、コンピュータを再起動する必要があります。"
diff --git a/dll/cpl/sysdm/lang/nl-NL.rc b/dll/cpl/sysdm/lang/nl-NL.rc
index 97b0b41b050..5ea78163666 100644
--- a/dll/cpl/sysdm/lang/nl-NL.rc
+++ b/dll/cpl/sysdm/lang/nl-NL.rc
@@ -354,11 +354,11 @@ BEGIN
     IDS_USERPROFILE_ACCOUNT_DELETED "Account Deleted"
     IDS_USERPROFILE_TYPE_TEXT "When %s logs onto this computer, should the 
operating system use the roaming profile or just the locally cached copy of the 
roaming profile."
     IDS_MESSAGEBOXTITLE "System control panel applet"
-    IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the 
paging file."
-    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the 
paging file."
-    IDS_WARNINITIALRANGE "The initial size of the paging file must not be 
smaller than 2 MB,  must not be larger than 4095 MB and must not exceed the 
available space on the selected drive."
-    IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be 
smaller than its initial size, must not be larger than 4095 MB and must not 
exceed the available space on the selected drive."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALSIZE "Enter a numeric value for the paging file initial 
size."
+    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the paging file maximum 
size."
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "None"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/no-NO.rc b/dll/cpl/sysdm/lang/no-NO.rc
index c34edcab505..1a15da46310 100644
--- a/dll/cpl/sysdm/lang/no-NO.rc
+++ b/dll/cpl/sysdm/lang/no-NO.rc
@@ -354,11 +354,11 @@ BEGIN
     IDS_USERPROFILE_ACCOUNT_DELETED "Account Deleted"
     IDS_USERPROFILE_TYPE_TEXT "When %s logs onto this computer, should the 
operating system use the roaming profile or just the locally cached copy of the 
roaming profile."
     IDS_MESSAGEBOXTITLE "System control panel applet"
-    IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the 
paging file."
-    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the 
paging file."
-    IDS_WARNINITIALRANGE "The initial size of the paging file must not be 
smaller than 2 MB,  must not be larger than 4095 MB and must not exceed the 
available space on the selected drive."
-    IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be 
smaller than its initial size, must not be larger than 4095 MB and must not 
exceed the available space on the selected drive."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALSIZE "Enter a numeric value for the paging file initial 
size."
+    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the paging file maximum 
size."
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Ingen"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/pl-PL.rc b/dll/cpl/sysdm/lang/pl-PL.rc
index e796f33f771..e786ca11c45 100644
--- a/dll/cpl/sysdm/lang/pl-PL.rc
+++ b/dll/cpl/sysdm/lang/pl-PL.rc
@@ -365,9 +365,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "System"
     IDS_WARNINITIALSIZE "Wprowadź wielkość dla początkowego rozmiaru pliku 
stronicowania."
     IDS_WARNMAXIMUMSIZE "Wprowadź wielkość dla maksymalnego rozmiaru pliku 
stronicowania."
-    IDS_WARNINITIALRANGE "Początkowy rozmiar pliku stronicowania nie może być 
mniejszy niż 2 MB i nie może przekraczać dostępnej ilości miejsca w wybranym 
napędzie."
-    IDS_WARNMAXIMUMRANGE "Maksymalny rozmiar pliku stronicowania nie może być 
mniejszy niż jego rozmiar początkowy i nie może przekraczać dostępnej ilości 
miejsca w wybranym napędzie."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Brak"
     IDS_PAGEFILE_SYSTEM "Kontrolowany przez system"
     IDS_INFOREBOOT "Musisz ponownie uruchomić komputer, aby zastosować zmiany."
diff --git a/dll/cpl/sysdm/lang/pt-PT.rc b/dll/cpl/sysdm/lang/pt-PT.rc
index 06c448f9c07..eaa654a6b91 100644
--- a/dll/cpl/sysdm/lang/pt-PT.rc
+++ b/dll/cpl/sysdm/lang/pt-PT.rc
@@ -360,9 +360,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Aplicação do painel de controle do sistema"
     IDS_WARNINITIALSIZE "Digite um valor numérico para o tamanho inicial do 
arquivo de paginação."
     IDS_WARNMAXIMUMSIZE "Digite um valor numérico para o tamanho máximo do 
arquivo de paginação."
-    IDS_WARNINITIALRANGE "O tamanho inicial do arquivo de paginação não deve 
ser menor que 2 MB e não deve exceder o espaço disponível na unidade 
seleccionada."
-    IDS_WARNMAXIMUMRANGE "O tamanho máximo do arquivo de paginação não deve 
ser menor que o tamanho inicial, não deve ser maior que 4095 MB e não deve 
exceder o espaço disponível na unidade seleccionada."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Nenhum"
     IDS_PAGEFILE_SYSTEM "Gerenciado pelo sistema"
     IDS_INFOREBOOT "Precisa reiniciar o computador para aplicar as alterações."
diff --git a/dll/cpl/sysdm/lang/ro-RO.rc b/dll/cpl/sysdm/lang/ro-RO.rc
index 7628a16592c..b2ec0483bf0 100644
--- a/dll/cpl/sysdm/lang/ro-RO.rc
+++ b/dll/cpl/sysdm/lang/ro-RO.rc
@@ -365,9 +365,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Specificare valori de sistem"
     IDS_WARNINITIALSIZE "Introduceți o valoare numerică pentru dimensiunea 
inițială a fișierului de paginare."
     IDS_WARNMAXIMUMSIZE "Introduceți o valoare numerică pentru dimensiunea 
maximă a fișierului de paginare."
-    IDS_WARNINITIALRANGE "Dimensiunea inițială a fișierului de paginare 
trebuie să fie încadrată între 2 Mo și spațiul liber disponibil al unității 
selectate."
-    IDS_WARNMAXIMUMRANGE "Dimensiunea maximă a fișierului de paginare trebuie 
să fie încadrată între dimensiunea inițială și spațiul liber disponibil al 
unității selectate."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Nespecificat"
     IDS_PAGEFILE_SYSTEM "Gestionat de sistem"
     IDS_INFOREBOOT "Pentru aplicarea modificărilor este necesară repornirea 
calculatorului."
diff --git a/dll/cpl/sysdm/lang/ru-RU.rc b/dll/cpl/sysdm/lang/ru-RU.rc
index c6e0e38810c..209b608170a 100644
--- a/dll/cpl/sysdm/lang/ru-RU.rc
+++ b/dll/cpl/sysdm/lang/ru-RU.rc
@@ -356,9 +356,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Панель управления системы"
     IDS_WARNINITIALSIZE "Введите числовое значение исходного размера файла 
подкачки."
     IDS_WARNMAXIMUMSIZE "Введите числовое значение для параметра максимальный 
размер файла подкачки."
-    IDS_WARNINITIALRANGE "Начальный размер файла подкачки должен быть не 
меньше, чем 2 МБ и не должен превышать свободного места на выбранном диске."
-    IDS_WARNMAXIMUMRANGE "Максимальный размер файла подкачки должен быть не 
меньше, чем начальный размер, который не должен превышать свободного места на 
выбранном диске."
-    IDS_PAGEFILE_MB "%u МБ"
+    IDS_WARNINITIALRANGE "Исходный размер файла подкачки должен быть в 
диапазоне между 2 МБ и %lu МБ на выбранном диске."
+    IDS_WARNMAXIMUMRANGE "Максимальный размер файла подкачки должен быть 
больше или равен своему исходному размеру, и при этом меньше %lu МБ на 
выбранном диске."
+    IDS_PAGEFILE_MB "%lu МБ"
     IDS_PAGEFILE_NONE "Нет"
     IDS_PAGEFILE_SYSTEM "По выбору системы"
     IDS_INFOREBOOT "Необходимо перезагрузить компьютер для применения 
изменений."
diff --git a/dll/cpl/sysdm/lang/sk-SK.rc b/dll/cpl/sysdm/lang/sk-SK.rc
index 3f62f5fda36..995c5f66c39 100644
--- a/dll/cpl/sysdm/lang/sk-SK.rc
+++ b/dll/cpl/sysdm/lang/sk-SK.rc
@@ -362,11 +362,11 @@ BEGIN
     IDS_USERPROFILE_ACCOUNT_DELETED "Account Deleted"
     IDS_USERPROFILE_TYPE_TEXT "When %s logs onto this computer, should the 
operating system use the roaming profile or just the locally cached copy of the 
roaming profile."
     IDS_MESSAGEBOXTITLE "System control panel applet"
-    IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the 
paging file."
-    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the 
paging file."
-    IDS_WARNINITIALRANGE "The initial size of the paging file must not be 
smaller than 2 MB,  must not be larger than 4095 MB and must not exceed the 
available space on the selected drive."
-    IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be 
smaller than its initial size, must not be larger than 4095 MB and must not 
exceed the available space on the selected drive."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALSIZE "Enter a numeric value for the paging file initial 
size."
+    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the paging file maximum 
size."
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Žiadne"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/sq-AL.rc b/dll/cpl/sysdm/lang/sq-AL.rc
index 921188aff24..4a5aa9a3be9 100644
--- a/dll/cpl/sysdm/lang/sq-AL.rc
+++ b/dll/cpl/sysdm/lang/sq-AL.rc
@@ -356,9 +356,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Sistemi i kontrollit panelit programeve"
     IDS_WARNINITIALSIZE "Futni një vlerë numerike për madhësinë fillestare e 
faqeve të dokumentave."
     IDS_WARNMAXIMUMSIZE "Futni një vlerë numerike për madhësinë maksimale e 
faqeve të dokumentave."
-    IDS_WARNINITIALRANGE "Madhësia fillestare e faqes së dokumentit nuk duhet 
të jetë më e vogël se 2 MB dhe nuk duhet të kalojë hapësirën në dispozicion në 
driver-in e përzgjedhur."
-    IDS_WARNMAXIMUMRANGE "Madhësia maksimale e faqes së dokumenit nuk duhet të 
jetë më e vogël se madhësia e saj fillestare dhe nuk duhet të kalojë hapësirën 
në dispozicion në driver-in e përzgjedhur."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Asnjë"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/sv-SE.rc b/dll/cpl/sysdm/lang/sv-SE.rc
index f7e80ff397c..9edf9d22373 100644
--- a/dll/cpl/sysdm/lang/sv-SE.rc
+++ b/dll/cpl/sysdm/lang/sv-SE.rc
@@ -356,11 +356,11 @@ BEGIN
     IDS_USERPROFILE_ACCOUNT_DELETED "Account Deleted"
     IDS_USERPROFILE_TYPE_TEXT "When %s logs onto this computer, should the 
operating system use the roaming profile or just the locally cached copy of the 
roaming profile."
     IDS_MESSAGEBOXTITLE "System control panel applet"
-    IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the 
paging file."
-    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the 
paging file."
-    IDS_WARNINITIALRANGE "The initial size of the paging file must not be 
smaller than 2 MB,  must not be larger than 4095 MB and must not exceed the 
available space on the selected drive."
-    IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be 
smaller than its initial size, must not be larger than 4095 MB and must not 
exceed the available space on the selected drive."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALSIZE "Enter a numeric value for the paging file initial 
size."
+    IDS_WARNMAXIMUMSIZE "Enter a numeric value for the paging file maximum 
size."
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "None"
     IDS_PAGEFILE_SYSTEM "System Managed"
     IDS_INFOREBOOT "You have to reboot the computer in order to apply the 
changes."
diff --git a/dll/cpl/sysdm/lang/tr-TR.rc b/dll/cpl/sysdm/lang/tr-TR.rc
index e84c91e8970..694377715c4 100644
--- a/dll/cpl/sysdm/lang/tr-TR.rc
+++ b/dll/cpl/sysdm/lang/tr-TR.rc
@@ -358,9 +358,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Sistem Denetim Masası Uygulaması"
     IDS_WARNINITIALSIZE "Sayfalama dosyasının başlangıç büyüklüğü için bir 
sayısal değer giriniz."
     IDS_WARNMAXIMUMSIZE "Sayfalama dosyasının maksimum büyüklüğü için bir 
sayısal değer giriniz."
-    IDS_WARNINITIALRANGE "Sayfalama dosyasının başlangıç büyüklüğü, 2 MB'tan 
küçük olmamalıdır ve seçili sürücüde var olan boşluğu aşmamalıdır."
-    IDS_WARNMAXIMUMRANGE "Sayfalama dosyasının maksimum büyüklüğü, kendisinin 
başlangıç büyüklüğünden küçük olmamalıdır ve seçili sürücüde var olan boşluğu 
aşmamalıdır."
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "Yok"
     IDS_PAGEFILE_SYSTEM "Sistem Yönetimli"
     IDS_INFOREBOOT "Değişiklikleri uygulamak için bilgisayarı yeniden 
başlatmalısınız."
diff --git a/dll/cpl/sysdm/lang/uk-UA.rc b/dll/cpl/sysdm/lang/uk-UA.rc
index 0082c0d079a..dc06aa27080 100644
--- a/dll/cpl/sysdm/lang/uk-UA.rc
+++ b/dll/cpl/sysdm/lang/uk-UA.rc
@@ -364,9 +364,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "Елемент панелі керування"
     IDS_WARNINITIALSIZE "Введіть числове значення для початкового розміру 
файлу довантаження."
     IDS_WARNMAXIMUMSIZE "Введіть числове значення для максимального розміру 
файлу довантаження."
-    IDS_WARNINITIALRANGE "Початковий розмір файлу довантаження не повинен бути 
меншим 2 Мб і не повинен перевищувати об'єм вільного місця на обраному диску."
-    IDS_WARNMAXIMUMRANGE "Максимальний розмір файлу довантаження не повинен 
бути меншим від початкового та не повинен перевищувати об'єм вільного місця на 
обраному диску."
-    IDS_PAGEFILE_MB "%u МБ"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu МБ"
     IDS_PAGEFILE_NONE "Немає"
     IDS_PAGEFILE_SYSTEM "За вибором системи"
     IDS_INFOREBOOT "Необхідно перезавантажити комп'ютер для застосування нових 
параметрів."
diff --git a/dll/cpl/sysdm/lang/zh-CN.rc b/dll/cpl/sysdm/lang/zh-CN.rc
index 0c2187ab0c9..65735ffd558 100644
--- a/dll/cpl/sysdm/lang/zh-CN.rc
+++ b/dll/cpl/sysdm/lang/zh-CN.rc
@@ -365,9 +365,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "系统控制面板小程序"
     IDS_WARNINITIALSIZE "为分页文件的初始大小输入一个数字值。"
     IDS_WARNMAXIMUMSIZE "为分页文件的最大大小输入一个数字值。"
-    IDS_WARNINITIALRANGE "分页文件的初始大小不得小于 2 MB,并且不得超过所选磁盘上的可用空间。"
-    IDS_WARNMAXIMUMRANGE "分页文件的最大大小不能小于其初始大小和不能超过所选磁盘上的可用空间。"
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "无"
     IDS_PAGEFILE_SYSTEM "系统已托管"
     IDS_INFOREBOOT "您必须重新启动计算机,才能应用更改。"
diff --git a/dll/cpl/sysdm/lang/zh-HK.rc b/dll/cpl/sysdm/lang/zh-HK.rc
index af01ab8d6ec..d4d3bdbade8 100644
--- a/dll/cpl/sysdm/lang/zh-HK.rc
+++ b/dll/cpl/sysdm/lang/zh-HK.rc
@@ -364,9 +364,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "系統控制台小程序"
     IDS_WARNINITIALSIZE "為分頁文件的初始大小輸入一個數值。"
     IDS_WARNMAXIMUMSIZE "為分頁文件的最大大小輸入一個數值。"
-    IDS_WARNINITIALRANGE "分頁文件的初始大小不得小於 2 MB,並且不得超過所選磁碟上的可用空間。"
-    IDS_WARNMAXIMUMRANGE "分頁文件的最大大小不能小於其初始大小及不能超過所選磁碟上的可用空間。"
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "無"
     IDS_PAGEFILE_SYSTEM "受管理的系統"
     IDS_INFOREBOOT "您必須重新啟動電腦,才能套用更改。"
diff --git a/dll/cpl/sysdm/lang/zh-TW.rc b/dll/cpl/sysdm/lang/zh-TW.rc
index 6d022a4a93c..6575f54ce30 100644
--- a/dll/cpl/sysdm/lang/zh-TW.rc
+++ b/dll/cpl/sysdm/lang/zh-TW.rc
@@ -365,9 +365,9 @@ BEGIN
     IDS_MESSAGEBOXTITLE "系統控制臺小程序"
     IDS_WARNINITIALSIZE "為分頁文件的初始大小輸入一個數字值。"
     IDS_WARNMAXIMUMSIZE "為分頁文件的最大大小輸入一個數字值。"
-    IDS_WARNINITIALRANGE "分頁文件的初始大小不得小於 2 MB,並且不得超過所選磁碟上的可用空間。"
-    IDS_WARNMAXIMUMRANGE "分頁文件的最大大小不能小於其初始大小和不能超過所選磁碟上的可用空間。"
-    IDS_PAGEFILE_MB "%u MB"
+    IDS_WARNINITIALRANGE "The initial paging file size must be between 2 MB 
and %lu MB on the selected drive."
+    IDS_WARNMAXIMUMRANGE "The maximum paging file size must be larger than or 
equal to its initial size, and less than %lu MB on the selected drive."
+    IDS_PAGEFILE_MB "%lu MB"
     IDS_PAGEFILE_NONE "無"
     IDS_PAGEFILE_SYSTEM "受管理的系統"
     IDS_INFOREBOOT "您必須重新啟動電腦,才能套用更改。"
diff --git a/dll/cpl/sysdm/virtmem.c b/dll/cpl/sysdm/virtmem.c
index 6c72ca6c4e4..ac78983fa31 100644
--- a/dll/cpl/sysdm/virtmem.c
+++ b/dll/cpl/sysdm/virtmem.c
@@ -9,9 +9,57 @@
 
 #include "precomp.h"
 
+#ifdef _M_IX86
+/* Used for SharedUserData by GetMaxPageFileSize() in the PAE case */
+#define NTOS_MODE_USER
+#include <ndk/pstypes.h>
+#endif
+
 #define NDEBUG
 #include <debug.h>
 
+// #define MAX_PAGING_FILES     16  // See also ntoskrnl/include/internal/mm.h
+#define MEGABYTE                        (1024 * 1024)
+
+/* Values adapted from smss/pagefile.c, converted in megabytes and 
rounded-down.
+ * Compare to the more "accurate" values from SMSS (and NTOS) in bytes. */
+
+/* Minimum pagefile size: 2 MB, instead of 256 pages (1 MB) */
+#define MINIMUM_PAGEFILE_SIZE           2
+
+/* Maximum pagefile sizes for different architectures */
+#define MAXIMUM_PAGEFILE_SIZE32         (4UL * 1024 - 1)
+#define MAXIMUM_PAGEFILE_SIZE64         (16UL * 1024 * 1024 - 1)
+
+#if defined(_M_IX86)
+/* 4095 MB */
+    #define MAXIMUM_PAGEFILE_SIZE       MAXIMUM_PAGEFILE_SIZE32
+/* PAE uses the same size as x64 */
+    #define MAXIMUM_PAGEFILE_SIZE_PAE   MAXIMUM_PAGEFILE_SIZE64
+#elif defined (_M_AMD64) || defined(_M_ARM64)
+/* Around 16 TB */
+    #define MAXIMUM_PAGEFILE_SIZE       MAXIMUM_PAGEFILE_SIZE64
+#elif defined (_M_IA64)
+/* Around 32 TB */
+    #define MAXIMUM_PAGEFILE_SIZE       (32UL * 1024 * 1024 - 1)
+#elif defined(_M_ARM)
+/* Around 2 GB */
+    #if (NTDDI_VERSION >= NTDDI_WINBLUE) // NTDDI_WIN81
+    #define MAXIMUM_PAGEFILE_SIZE       (2UL * 1024 - 1)
+    #else
+/* Around 4 GB */
+    #define MAXIMUM_PAGEFILE_SIZE       MAXIMUM_PAGEFILE_SIZE32
+    #endif
+#else
+/* On unknown architectures, default to either one of the 32 or 64 bit sizes */
+#pragma message("Unknown architecture")
+    #ifdef _WIN64
+    #define MAXIMUM_PAGEFILE_SIZE       MAXIMUM_PAGEFILE_SIZE64
+    #else
+    #define MAXIMUM_PAGEFILE_SIZE       MAXIMUM_PAGEFILE_SIZE32
+    #endif
+#endif
+
 typedef struct _PAGEFILE
 {
     TCHAR  szDrive[3];
@@ -21,6 +69,7 @@ typedef struct _PAGEFILE
     INT    NewMinSize;
     INT    NewMaxSize;
     UINT   FreeSize;
+    BOOL   bIsNotFAT;
     BOOL   bUsed;
 } PAGEFILE, *PPAGEFILE;
 
@@ -29,22 +78,36 @@ typedef struct _VIRTMEM
     HWND   hSelf;
     HWND   hListBox;
     LPTSTR szPagingFiles;
-    INT    Count;
+    UINT   Count;
     BOOL   bModified;
-    PAGEFILE  Pagefile[26];
+    PAGEFILE PageFile[26];
 } VIRTMEM, *PVIRTMEM;
 
 
-static BOOL OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem);
+static __inline
+UINT
+GetMaxPageFileSize(
+    _In_ PPAGEFILE PageFile)
+{
+#ifdef _M_IX86
+    /* For x86 PAE-enabled systems, where the maximum pagefile size is
+     * greater than 4 GB, verify also that the drive's filesystem on which
+     * the pagefile is stored can support it. */
+    if (SharedUserData->ProcessorFeatures[PF_PAE_ENABLED] && 
PageFile->bIsNotFAT)
+        return min(PageFile->FreeSize, MAXIMUM_PAGEFILE_SIZE_PAE);
+#endif
+    return min(PageFile->FreeSize, MAXIMUM_PAGEFILE_SIZE);
+}
+
 static LPCTSTR lpKey = _T("SYSTEM\\CurrentControlSet\\Control\\Session 
Manager\\Memory Management");
 
 static BOOL
 ReadPageFileSettings(PVIRTMEM pVirtMem)
 {
+    BOOL bRet = FALSE;
     HKEY hkey = NULL;
     DWORD dwType;
     DWORD dwDataSize;
-    BOOL bRet = FALSE;
 
     if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                        lpKey,
@@ -64,12 +127,10 @@ ReadPageFileSettings(PVIRTMEM pVirtMem)
                             &dwDataSize) == ERROR_SUCCESS)
         {
             pVirtMem->szPagingFiles = (LPTSTR)HeapAlloc(GetProcessHeap(),
-                                                        0,
+                                                        HEAP_ZERO_MEMORY,
                                                         dwDataSize);
             if (pVirtMem->szPagingFiles != NULL)
             {
-                ZeroMemory(pVirtMem->szPagingFiles,
-                           dwDataSize);
                 if (RegQueryValueEx(hkey,
                                     _T("PagingFiles"),
                                     NULL,
@@ -98,7 +159,7 @@ GetPageFileSizes(LPTSTR lpPageFiles,
                  LPINT lpInitialSize,
                  LPINT lpMaximumSize)
 {
-    INT i = 0;
+    UINT i = 0;
 
     *lpInitialSize = -1;
     *lpMaximumSize = -1;
@@ -134,13 +195,15 @@ ParseMemSettings(PVIRTMEM pVirtMem)
     LPTSTR DrivePtr = szDrives;
     TCHAR szDrive[3];        // Single drive
     TCHAR szVolume[MAX_PATH + 1];
+    TCHAR szFSName[MAX_PATH + 1];
     INT MinSize;
     INT MaxSize;
     INT DriveLen;
-    INT PgCnt = 0;
     INT Len;
+    UINT PgCnt = 0;
+    PPAGEFILE PageFile;
 
-    DriveLen = GetLogicalDriveStrings(1023,
+    DriveLen = GetLogicalDriveStrings(_countof(szDrives) - 1,
                                       szDrives);
 
     while (DriveLen != 0)
@@ -151,7 +214,7 @@ ParseMemSettings(PVIRTMEM pVirtMem)
         DrivePtr = _tcsupr(DrivePtr);
 
         /* Copy the 'X:' portion */
-        lstrcpyn(szDrive, DrivePtr, sizeof(szDrive) / sizeof(TCHAR));
+        lstrcpyn(szDrive, DrivePtr, _countof(szDrive));
 
         if (GetDriveType(DrivePtr) == DRIVE_FIXED)
         {
@@ -159,36 +222,40 @@ ParseMemSettings(PVIRTMEM pVirtMem)
             MaxSize = -1;
 
             /* Does drive match the one in the registry ? */
-            if (!_tcsncmp(pVirtMem->szPagingFiles, szDrive, 2))
+            if (_tcsnicmp(pVirtMem->szPagingFiles, szDrive, 2) == 0)
             {
                 GetPageFileSizes(pVirtMem->szPagingFiles,
                                  &MinSize,
                                  &MaxSize);
             }
 
-            pVirtMem->Pagefile[PgCnt].OldMinSize = MinSize;
-            pVirtMem->Pagefile[PgCnt].OldMaxSize = MaxSize;
-            pVirtMem->Pagefile[PgCnt].NewMinSize = MinSize;
-            pVirtMem->Pagefile[PgCnt].NewMaxSize = MaxSize;
-            pVirtMem->Pagefile[PgCnt].bUsed = TRUE;
-            lstrcpy(pVirtMem->Pagefile[PgCnt].szDrive, szDrive);
-
+            PageFile = &pVirtMem->PageFile[PgCnt];
+            PageFile->OldMinSize = MinSize;
+            PageFile->OldMaxSize = MaxSize;
+            PageFile->NewMinSize = MinSize;
+            PageFile->NewMaxSize = MaxSize;
+            PageFile->bIsNotFAT  = TRUE; /* Suppose this is not a FAT volume */
+            PageFile->bUsed = TRUE;
+            lstrcpy(PageFile->szDrive, szDrive);
 
             /* Get the volume label if there is one */
             if (GetVolumeInformation(DrivePtr,
-                                     szVolume,
-                                     MAX_PATH + 1,
-                                     NULL,
-                                     NULL,
-                                     NULL,
-                                     NULL,
-                                     0))
+                                     szVolume, _countof(szVolume),
+                                     NULL, NULL, NULL,
+                                     szFSName, _countof(szFSName)))
             {
-                pVirtMem->Pagefile[PgCnt].pszVolume = 
HeapAlloc(GetProcessHeap(),
-                                                                0,
-                                                                
(_tcslen(szVolume) + 1) * sizeof(TCHAR));
-                if (pVirtMem->Pagefile[PgCnt].pszVolume != NULL)
-                    _tcscpy(pVirtMem->Pagefile[PgCnt].pszVolume, szVolume);
+                PageFile->pszVolume = HeapAlloc(GetProcessHeap(), 
HEAP_ZERO_MEMORY,
+                                                (_tcslen(szVolume) + 1) * 
sizeof(TCHAR));
+                if (PageFile->pszVolume != NULL)
+                    _tcscpy(PageFile->pszVolume, szVolume);
+
+                /*
+                 * Check whether the volume is FAT, which cannot support files
+                 * larger than 4GB (for FAT32 and FATX, and less for FAT16).
+                 * This will limit the maximum size of the pagefile this volume
+                 * can contain (see GetMaxPageFileSize()).
+                 */
+                PageFile->bIsNotFAT = (_tcsnicmp(szFSName, _T("FAT"), 3) != 0);
             }
 
             PgCnt++;
@@ -204,29 +271,32 @@ ParseMemSettings(PVIRTMEM pVirtMem)
 static VOID
 WritePageFileSettings(PVIRTMEM pVirtMem)
 {
+    BOOL bErr = TRUE;
     HKEY hk = NULL;
-    TCHAR szPagingFiles[2048];
     TCHAR szText[256];
-    INT i, nPos = 0;
-    BOOL bErr = TRUE;
+    TCHAR szPagingFiles[2048];
+    UINT i, nPos = 0;
+    PPAGEFILE PageFile;
 
     for (i = 0; i < pVirtMem->Count; ++i)
     {
-        if (pVirtMem->Pagefile[i].bUsed &&
-            pVirtMem->Pagefile[i].NewMinSize != -1 &&
-            pVirtMem->Pagefile[i].NewMaxSize != -1)
+        PageFile = &pVirtMem->PageFile[i];
+
+        if (PageFile->bUsed &&
+            PageFile->NewMinSize != -1 &&
+            PageFile->NewMaxSize != -1)
         {
             _stprintf(szText,
                       _T("%s\\pagefile.sys %i %i"),
-                      pVirtMem->Pagefile[i].szDrive,
-                      pVirtMem->Pagefile[i].NewMinSize,
-                      pVirtMem->Pagefile[i].NewMaxSize);
+                      PageFile->szDrive,
+                      PageFile->NewMinSize,
+                      PageFile->NewMaxSize);
 
             /* Add it to our overall registry string */
             lstrcpy(szPagingFiles + nPos, szText);
 
             /* Record the position where the next string will start */
-            nPos += (INT)lstrlen(szText) + 1;
+            nPos += (UINT)lstrlen(szText) + 1;
 
             /* Add another NULL for REG_MULTI_SZ */
             szPagingFiles[nPos] = _T('\0');
@@ -248,8 +318,8 @@ WritePageFileSettings(PVIRTMEM pVirtMem)
                           _T("PagingFiles"),
                           0,
                           REG_MULTI_SZ,
-                          (LPBYTE) szPagingFiles,
-                          (DWORD) nPos * sizeof(TCHAR)) == ERROR_SUCCESS)
+                          (LPBYTE)szPagingFiles,
+                          (DWORD)nPos * sizeof(TCHAR)) == ERROR_SUCCESS)
         {
             bErr = FALSE;
         }
@@ -260,14 +330,14 @@ WritePageFileSettings(PVIRTMEM pVirtMem)
     if (bErr == FALSE)
     {
         /* Delete obsolete paging files on the next boot */
-        for (i = 0; i < 26; i++)
+        for (i = 0; i < _countof(pVirtMem->PageFile); i++)
         {
-            if (pVirtMem->Pagefile[i].OldMinSize != -1 &&
-                pVirtMem->Pagefile[i].NewMinSize == -1)
+            if (pVirtMem->PageFile[i].OldMinSize != -1 &&
+                pVirtMem->PageFile[i].NewMinSize == -1)
             {
                 _stprintf(szText,
                           _T("%s\\pagefile.sys"),
-                          pVirtMem->Pagefile[i].szDrive);
+                          pVirtMem->PageFile[i].szDrive);
 
                 MoveFileEx(szText, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
             }
@@ -276,7 +346,6 @@ WritePageFileSettings(PVIRTMEM pVirtMem)
 
     if (bErr)
         ShowLastWin32Error(pVirtMem->hSelf);
-
 }
 
 
@@ -317,45 +386,50 @@ OnCustom(PVIRTMEM pVirtMem)
 }
 
 
+static BOOL OnSelChange(PVIRTMEM pVirtMem);
+
 static VOID
 InitPagefileList(PVIRTMEM pVirtMem)
 {
-    TCHAR szDisplayString[256];
-    TCHAR szSize[64];
     INT Index;
-    INT i;
+    UINT i;
+    PPAGEFILE PageFile;
+    TCHAR szSize[64];
+    TCHAR szDisplayString[256];
 
-    for (i = 0; i < 26; i++)
+    for (i = 0; i < _countof(pVirtMem->PageFile); i++)
     {
-        if (pVirtMem->Pagefile[i].bUsed)
+        PageFile = &pVirtMem->PageFile[i];
+
+        if (PageFile->bUsed)
         {
-            if ((pVirtMem->Pagefile[i].NewMinSize == -1) &&
-                (pVirtMem->Pagefile[i].NewMaxSize == -1))
+            if ((PageFile->NewMinSize == -1) &&
+                (PageFile->NewMaxSize == -1))
             {
                 LoadString(hApplet,
                            IDS_PAGEFILE_NONE,
                            szSize,
-                           sizeof(szSize) / sizeof(szSize[0]));
+                           _countof(szSize));
             }
-            else if ((pVirtMem->Pagefile[i].NewMinSize == 0) &&
-                     (pVirtMem->Pagefile[i].NewMaxSize == 0))
+            else if ((PageFile->NewMinSize == 0) &&
+                     (PageFile->NewMaxSize == 0))
             {
                 LoadString(hApplet,
                            IDS_PAGEFILE_SYSTEM,
                            szSize,
-                           sizeof(szSize) / sizeof(szSize[0]));
+                           _countof(szSize));
             }
             else
             {
                 _stprintf(szSize, _T("%d - %d"),
-                          pVirtMem->Pagefile[i].NewMinSize,
-                          pVirtMem->Pagefile[i].NewMaxSize);
+                          PageFile->NewMinSize,
+                          PageFile->NewMaxSize);
             }
 
             _stprintf(szDisplayString,
                       _T("%s  [%s]\t%s"),
-                      pVirtMem->Pagefile[i].szDrive,
-                      pVirtMem->Pagefile[i].pszVolume ? 
pVirtMem->Pagefile[i].pszVolume : _T(""),
+                      PageFile->szDrive,
+                      PageFile->pszVolume ? PageFile->pszVolume : _T(""),
                       szSize);
 
             Index = SendMessage(pVirtMem->hListBox, LB_ADDSTRING, (WPARAM)0, 
(LPARAM)szDisplayString);
@@ -365,7 +439,7 @@ InitPagefileList(PVIRTMEM pVirtMem)
 
     SendMessage(pVirtMem->hListBox, LB_SETCURSEL, (WPARAM)0, (LPARAM)0);
 
-    OnSelChange(pVirtMem->hSelf, pVirtMem);
+    OnSelChange(pVirtMem);
 }
 
 
@@ -374,37 +448,38 @@ UpdatePagefileEntry(PVIRTMEM pVirtMem,
                     INT ListIndex,
                     INT DriveIndex)
 {
-    TCHAR szDisplayString[256];
+    PPAGEFILE PageFile = &pVirtMem->PageFile[DriveIndex];
     TCHAR szSize[64];
+    TCHAR szDisplayString[256];
 
-    if ((pVirtMem->Pagefile[DriveIndex].NewMinSize == -1) &&
-        (pVirtMem->Pagefile[DriveIndex].NewMaxSize == -1))
+    if ((PageFile->NewMinSize == -1) &&
+        (PageFile->NewMaxSize == -1))
     {
         LoadString(hApplet,
                    IDS_PAGEFILE_NONE,
                    szSize,
-                   sizeof(szSize) / sizeof(szSize[0]));
+                   _countof(szSize));
     }
-    else if ((pVirtMem->Pagefile[DriveIndex].NewMinSize == 0) &&
-             (pVirtMem->Pagefile[DriveIndex].NewMaxSize == 0))
+    else if ((PageFile->NewMinSize == 0) &&
+             (PageFile->NewMaxSize == 0))
     {
         LoadString(hApplet,
                    IDS_PAGEFILE_SYSTEM,
                    szSize,
-                   sizeof(szSize) / sizeof(szSize[0]));
+                   _countof(szSize));
     }
     else
     {
         _stprintf(szSize,
                   _T("%d - %d"),
-                  pVirtMem->Pagefile[DriveIndex].NewMinSize,
-                  pVirtMem->Pagefile[DriveIndex].NewMaxSize);
+                  PageFile->NewMinSize,
+                  PageFile->NewMaxSize);
     }
 
     _stprintf(szDisplayString,
               _T("%s  [%s]\t%s"),
-              pVirtMem->Pagefile[DriveIndex].szDrive,
-              pVirtMem->Pagefile[DriveIndex].pszVolume ? 
pVirtMem->Pagefile[DriveIndex].pszVolume : L"",
+              PageFile->szDrive,
+              PageFile->pszVolume ? PageFile->pszVolume : _T(""),
               szSize);
 
     SendMessage(pVirtMem->hListBox, LB_DELETESTRING, (WPARAM)ListIndex, 0);
@@ -420,13 +495,14 @@ OnSet(PVIRTMEM pVirtMem)
     UINT MinSize = -1;
     UINT MaxSize = -1;
     BOOL bTranslated;
-    INT DriveIndex = 0;
+    UINT DriveIndex;
+    PPAGEFILE PageFile;
 
-    Index  = (INT)SendDlgItemMessage(pVirtMem->hSelf,
-                                     IDC_PAGEFILELIST,
-                                     LB_GETCURSEL,
-                                     0,
-                                     0);
+    Index = (INT)SendDlgItemMessage(pVirtMem->hSelf,
+                                    IDC_PAGEFILELIST,
+                                    LB_GETCURSEL,
+                                    0,
+                                    0);
     if (Index >= 0 && Index < pVirtMem->Count)
     {
         DriveIndex = SendDlgItemMessage(pVirtMem->hSelf,
@@ -435,10 +511,14 @@ OnSet(PVIRTMEM pVirtMem)
                                         (WPARAM)Index,
                                         0);
 
+        PageFile = &pVirtMem->PageFile[DriveIndex];
+
         /* Check if custom settings are checked */
         if (IsDlgButtonChecked(pVirtMem->hSelf,
                                IDC_CUSTOM) == BST_CHECKED)
         {
+            UINT maxPageFileSize;
+
             MinSize = GetDlgItemInt(pVirtMem->hSelf,
                                     IDC_INITIALSIZE,
                                     &bTranslated,
@@ -467,56 +547,64 @@ OnSet(PVIRTMEM pVirtMem)
                 return;
             }
 
+            maxPageFileSize = GetMaxPageFileSize(PageFile);
+
             /* Check the valid range of the minimum size */
-            if (MinSize < 2 ||
-                MinSize > pVirtMem->Pagefile[DriveIndex].FreeSize ||
-                MinSize > 4096)
+            if ((MinSize < MINIMUM_PAGEFILE_SIZE) ||
+                (MinSize > maxPageFileSize))
             {
                 ResourceMessageBox(hApplet,
                                    NULL,
                                    MB_ICONWARNING | MB_OK,
                                    IDS_MESSAGEBOXTITLE,
-                                   IDS_WARNINITIALRANGE);
+                                   IDS_WARNINITIALRANGE,
+                                   maxPageFileSize);
                 return;
             }
 
             /* Check the valid range of the maximum size */
-            if (MaxSize < MinSize ||
-                MaxSize > pVirtMem->Pagefile[DriveIndex].FreeSize ||
-                MaxSize > 4096)
+            if ((MaxSize < MinSize) ||
+                (MaxSize > maxPageFileSize))
             {
                 ResourceMessageBox(hApplet,
                                    NULL,
                                    MB_ICONWARNING | MB_OK,
                                    IDS_MESSAGEBOXTITLE,
-                                   IDS_WARNMAXIMUMRANGE);
+                                   IDS_WARNMAXIMUMRANGE,
+                                   maxPageFileSize);
                 return;
             }
 
-            pVirtMem->Pagefile[DriveIndex].NewMinSize = MinSize;
-            pVirtMem->Pagefile[DriveIndex].NewMaxSize = MaxSize;
-            pVirtMem->Pagefile[DriveIndex].bUsed = TRUE;
+            // TODO: Check how much disk space would remain after
+            // storing a pagefile of a certain size. Warn/error out
+            // if less than 5 MB would remain.
+
+            PageFile->NewMinSize = MinSize;
+            PageFile->NewMaxSize = MaxSize;
+            PageFile->bUsed = TRUE;
         }
         else if (IsDlgButtonChecked(pVirtMem->hSelf,
                                     IDC_NOPAGEFILE) == BST_CHECKED)
         {
             /* No pagefile */
-            pVirtMem->Pagefile[DriveIndex].NewMinSize = -1;
-            pVirtMem->Pagefile[DriveIndex].NewMaxSize = -1;
-            pVirtMem->Pagefile[DriveIndex].bUsed = TRUE;
+            PageFile->NewMinSize = -1;
+            PageFile->NewMaxSize = -1;
+            PageFile->bUsed = TRUE;
         }
         else
         {
             /* System managed size*/
-            pVirtMem->Pagefile[DriveIndex].NewMinSize = 0;
-            pVirtMem->Pagefile[DriveIndex].NewMaxSize = 0;
-            pVirtMem->Pagefile[DriveIndex].bUsed = TRUE;
+            PageFile->NewMinSize = 0;
+            PageFile->NewMaxSize = 0;
+            PageFile->bUsed = TRUE;
         }
 
         /* Set the modified flag if min or max size has changed */
-        if ((pVirtMem->Pagefile[DriveIndex].OldMinSize != 
pVirtMem->Pagefile[DriveIndex].NewMinSize) ||
-            (pVirtMem->Pagefile[DriveIndex].OldMaxSize != 
pVirtMem->Pagefile[DriveIndex].NewMaxSize))
+        if ((PageFile->OldMinSize != PageFile->NewMinSize) ||
+            (PageFile->OldMaxSize != PageFile->NewMaxSize))
+        {
             pVirtMem->bModified = TRUE;
+        }
 
         UpdatePagefileEntry(pVirtMem, Index, DriveIndex);
     }
@@ -524,61 +612,66 @@ OnSet(PVIRTMEM pVirtMem)
 
 
 static BOOL
-OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
+OnSelChange(PVIRTMEM pVirtMem)
 {
-    TCHAR szBuffer[64];
+    INT Index;
+    UINT DriveIndex;
+    PPAGEFILE PageFile;
     MEMORYSTATUSEX MemoryStatus;
     ULARGE_INTEGER FreeDiskSpace;
-    UINT i, FreeMemMb, RecoMemMb, PageFileSizeMb;
-    INT Index;
-    TCHAR szText[MAX_PATH], szMegabytes[8];
-    WIN32_FIND_DATAW fdata = {0};
+    UINT i, PageFileSizeMb;
+    TCHAR szMegabytes[8];
+    TCHAR szBuffer[64];
+    TCHAR szText[MAX_PATH];
+    WIN32_FIND_DATA fdata = {0};
     HANDLE hFind;
     ULARGE_INTEGER pfSize;
 
-    Index = (INT)SendDlgItemMessage(hwndDlg,
+    Index = (INT)SendDlgItemMessage(pVirtMem->hSelf,
                                     IDC_PAGEFILELIST,
                                     LB_GETCURSEL,
                                     0,
                                     0);
     if (Index >= 0 && Index < pVirtMem->Count)
     {
+        DriveIndex = SendDlgItemMessage(pVirtMem->hSelf,
+                                        IDC_PAGEFILELIST,
+                                        LB_GETITEMDATA,
+                                        (WPARAM)Index,
+                                        0);
+
+        PageFile = &pVirtMem->PageFile[DriveIndex];
+
         LoadString(hApplet,
                    IDS_PAGEFILE_MB,
                    szMegabytes,
-                   ARRAYSIZE(szMegabytes));
+                   _countof(szMegabytes));
 
         /* Set drive letter */
-        SetDlgItemText(hwndDlg, IDC_DRIVE,
-                       pVirtMem->Pagefile[Index].szDrive);
+        SetDlgItemText(pVirtMem->hSelf, IDC_DRIVE,
+                       PageFile->szDrive);
 
         /* Set available disk space */
-        if (GetDiskFreeSpaceEx(pVirtMem->Pagefile[Index].szDrive,
+        if (GetDiskFreeSpaceEx(PageFile->szDrive,
                                NULL, NULL, &FreeDiskSpace))
         {
-            pVirtMem->Pagefile[Index].FreeSize = (UINT)(FreeDiskSpace.QuadPart 
/ (1024 * 1024));
-            _stprintf(szBuffer, szMegabytes, 
pVirtMem->Pagefile[Index].FreeSize);
-            SetDlgItemText(hwndDlg, IDC_SPACEAVAIL, szBuffer);
+            PageFile->FreeSize = (UINT)(FreeDiskSpace.QuadPart / MEGABYTE);
+            _stprintf(szBuffer, szMegabytes, PageFile->FreeSize);
+            SetDlgItemText(pVirtMem->hSelf, IDC_SPACEAVAIL, szBuffer);
         }
 
-        if (pVirtMem->Pagefile[Index].NewMinSize == -1 &&
-            pVirtMem->Pagefile[Index].NewMaxSize == -1)
+        if (PageFile->NewMinSize == -1 &&
+            PageFile->NewMaxSize == -1)
         {
             /* No pagefile */
-
-            EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_MAXSIZE), FALSE);
-            EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_INITIALSIZE), FALSE);
-
+            OnNoPagingFile(pVirtMem);
             CheckDlgButton(pVirtMem->hSelf, IDC_NOPAGEFILE, BST_CHECKED);
         }
-        else if (pVirtMem->Pagefile[Index].NewMinSize == 0 &&
-                 pVirtMem->Pagefile[Index].NewMaxSize == 0)
+        else if (PageFile->NewMinSize == 0 &&
+                 PageFile->NewMaxSize == 0)
         {
-            /* System managed size*/
-
-            EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_MAXSIZE), FALSE);
-            EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_INITIALSIZE), FALSE);
-
+            /* System managed size */
+            OnSysManSize(pVirtMem);
             CheckDlgButton(pVirtMem->hSelf, IDC_SYSMANSIZE, BST_CHECKED);
         }
         else
@@ -586,17 +679,16 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
             /* Custom size */
 
             /* Enable and fill the custom values */
-            EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_MAXSIZE), TRUE);
-            EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_INITIALSIZE), TRUE);
+            OnCustom(pVirtMem);
 
             SetDlgItemInt(pVirtMem->hSelf,
                           IDC_INITIALSIZE,
-                          pVirtMem->Pagefile[Index].NewMinSize,
+                          PageFile->NewMinSize,
                           FALSE);
 
             SetDlgItemInt(pVirtMem->hSelf,
                           IDC_MAXSIZE,
-                          pVirtMem->Pagefile[Index].NewMaxSize,
+                          PageFile->NewMaxSize,
                           FALSE);
 
             CheckDlgButton(pVirtMem->hSelf,
@@ -604,20 +696,24 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
                            BST_CHECKED);
         }
 
-        /* Set minimum pagefile size (2 MB) */
-        _stprintf(szBuffer, szMegabytes, 2);
-        SetDlgItemText(hwndDlg, IDC_MINIMUM, szBuffer);
+        /* Set minimum pagefile size */
+        _stprintf(szBuffer, szMegabytes, MINIMUM_PAGEFILE_SIZE);
+        SetDlgItemText(pVirtMem->hSelf, IDC_MINIMUM, szBuffer);
 
         /* Set recommended pagefile size */
-        MemoryStatus.dwLength = sizeof(MEMORYSTATUSEX);
+        MemoryStatus.dwLength = sizeof(MemoryStatus);
         if (GlobalMemoryStatusEx(&MemoryStatus))
         {
-            FreeMemMb = (UINT)(MemoryStatus.ullTotalPhys / (1024 * 1024));
-            RecoMemMb = FreeMemMb + (FreeMemMb / 2); /* The recommended VM 
size is 150% of free memory. */
-            if (RecoMemMb > 4096)
-                RecoMemMb = 4096;
+            UINT FreeMemMb, RecoMemMb;
+            UINT maxPageFileSize = GetMaxPageFileSize(PageFile);
+
+            FreeMemMb = (UINT)(MemoryStatus.ullTotalPhys / MEGABYTE);
+            /* The recommended VM size is 150% of free memory */
+            RecoMemMb = FreeMemMb + (FreeMemMb / 2);
+            if (RecoMemMb > maxPageFileSize)
+                RecoMemMb = maxPageFileSize;
             _stprintf(szBuffer, szMegabytes, RecoMemMb);
-            SetDlgItemText(hwndDlg, IDC_RECOMMENDED, szBuffer);
+            SetDlgItemText(pVirtMem->hSelf, IDC_RECOMMENDED, szBuffer);
         }
 
         /* Set current pagefile size */
@@ -627,24 +723,26 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
         {
             _stprintf(szText,
                       _T("%c:\\pagefile.sys"),
-                      pVirtMem->Pagefile[i].szDrive[0]);
+                      pVirtMem->PageFile[i].szDrive[0]);
 
-            hFind = FindFirstFileW(szText, &fdata);
+            hFind = FindFirstFile(szText, &fdata);
             if (hFind == INVALID_HANDLE_VALUE)
             {
-                DPRINT1("Unable to read PageFile size : %ls due to error 
%d\n", szText,GetLastError());
+                // FIXME: MsgBox error?
+                DPRINT1("Unable to read PageFile size: %ls due to error %d\n",
+                        szText, GetLastError());
             }
             else
             {
                 pfSize.LowPart = fdata.nFileSizeLow;
                 pfSize.HighPart = fdata.nFileSizeHigh;
-                PageFileSizeMb += pfSize.QuadPart / (1024*1024);
+                PageFileSizeMb += pfSize.QuadPart / MEGABYTE;
                 FindClose(hFind);
             }
         }
 
         _stprintf(szBuffer, szMegabytes, PageFileSizeMb);
-        SetDlgItemText(hwndDlg, IDC_CURRENT, szBuffer);
+        SetDlgItemText(pVirtMem->hSelf, IDC_CURRENT, szBuffer);
     }
 
     return TRUE;
@@ -670,7 +768,8 @@ OnVirtMemDialogOk(PVIRTMEM pVirtMem)
 static VOID
 OnInitVirtMemDialog(HWND hwnd, PVIRTMEM pVirtMem)
 {
-    INT i;
+    UINT i;
+    PPAGEFILE PageFile;
 
     pVirtMem->hSelf = hwnd;
     pVirtMem->hListBox = GetDlgItem(hwnd, IDC_PAGEFILELIST);
@@ -678,13 +777,16 @@ OnInitVirtMemDialog(HWND hwnd, PVIRTMEM pVirtMem)
 
     SetListBoxColumns(pVirtMem->hListBox);
 
-    for (i = 0; i < 26; i++)
+    for (i = 0; i < _countof(pVirtMem->PageFile); i++)
     {
-        pVirtMem->Pagefile[i].bUsed = FALSE;
-        pVirtMem->Pagefile[i].OldMinSize = -1;
-        pVirtMem->Pagefile[i].OldMaxSize = -1;
-        pVirtMem->Pagefile[i].NewMinSize = -1;
-        pVirtMem->Pagefile[i].NewMaxSize = -1;
+        PageFile = &pVirtMem->PageFile[i];
+        PageFile->bUsed = FALSE;
+        PageFile->OldMinSize = -1;
+        PageFile->OldMaxSize = -1;
+        PageFile->NewMinSize = -1;
+        PageFile->NewMaxSize = -1;
+        PageFile->FreeSize   = 0;
+        PageFile->bIsNotFAT  = TRUE; /* Suppose this is not a FAT volume */
     }
 
     /* Load the pagefile systems from the reg */
@@ -700,12 +802,12 @@ OnInitVirtMemDialog(HWND hwnd, PVIRTMEM pVirtMem)
 static VOID
 OnDestroy(PVIRTMEM pVirtMem)
 {
-    INT i;
+    UINT i;
 
-    for (i = 0; i < 26; i++)
+    for (i = 0; i < _countof(pVirtMem->PageFile); i++)
     {
-        if (pVirtMem->Pagefile[i].pszVolume != NULL)
-            HeapFree(GetProcessHeap(), 0, pVirtMem->Pagefile[i].pszVolume);
+        if (pVirtMem->PageFile[i].pszVolume != NULL)
+            HeapFree(GetProcessHeap(), 0, pVirtMem->PageFile[i].pszVolume);
     }
 
     if (pVirtMem->szPagingFiles)
@@ -730,6 +832,7 @@ VirtMemDlgProc(HWND hwndDlg,
     switch (uMsg)
     {
         case WM_INITDIALOG:
+        {
             pVirtMem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
sizeof(VIRTMEM));
             if (pVirtMem == NULL)
             {
@@ -741,6 +844,7 @@ VirtMemDlgProc(HWND hwndDlg,
 
             OnInitVirtMemDialog(hwndDlg, pVirtMem);
             break;
+        }
 
         case WM_DESTROY:
             OnDestroy(pVirtMem);
@@ -778,7 +882,7 @@ VirtMemDlgProc(HWND hwndDlg,
                     switch (HIWORD(wParam))
                     {
                         case LBN_SELCHANGE:
-                            OnSelChange(hwndDlg, pVirtMem);
+                            OnSelChange(pVirtMem);
                             return TRUE;
                     }
                     break;

Reply via email to