[NTOS:CM] Add some more configuration options.

Add support for configuring the CM lazy-flush and delay-close variables:

  `CmpLazyFlushIntervalInSeconds`, `CmpLazyFlushHiveCount`,
  and `CmpDelayedCloseSize`,

using REG_DWORD values named respectively:

  `RegistryLazyFlushInterval`, `RegistryLazyFlushHiveCount`,
  and `DelayCloseSize`,

in the registry key
`HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Configuration Manager` .

Extra observations:
- While delay-close support exists in Windows 2003, configuring
  the delay-close size is possible only in Windows Vista and later.
- The possibility of configuring the lazy-flush hive count has been
  removed in Windows 8+.

See the comparison tables at:
https://redplait.blogspot.com/2011/07/cmcontrolvector.html
https://redplait.blogspot.com/2012/06/cmcontrolvector-for-w8.html
https://redplait.blogspot.com/2016/03/cmcontrolvector-from-windows-10-build.html

In addition:
Remove `CmpDelayedCloseIndex` from cm.h as it is not used anymore in our code.
This commit is contained in:
Hermès Bélusca-Maïto 2024-08-11 16:39:28 +02:00
parent d44ed03b6c
commit a18424267b
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
3 changed files with 27 additions and 4 deletions

View file

@ -675,6 +675,27 @@ DATA_SEG("INITDATA") CM_SYSTEM_CONTROL_VECTOR CmControlVector[] =
NULL,
NULL
},
{
L"Session Manager\\Configuration Manager",
L"RegistryLazyFlushInterval",
&CmpLazyFlushIntervalInSeconds,
NULL,
NULL
},
{
L"Session Manager\\Configuration Manager",
L"RegistryLazyFlushHiveCount",
&CmpLazyFlushHiveCount,
NULL,
NULL
},
{
L"Session Manager\\Configuration Manager",
L"DelayCloseSize",
&CmpDelayedCloseSize,
NULL,
NULL
},
{
L"Session Manager\\Configuration Manager",
L"VolatileBoot",

View file

@ -22,7 +22,7 @@ BOOLEAN CmpLazyFlushPending;
BOOLEAN CmpForceForceFlush;
BOOLEAN CmpHoldLazyFlush = TRUE;
ULONG CmpLazyFlushIntervalInSeconds = 5;
static ULONG CmpLazyFlushHiveCount = 7;
ULONG CmpLazyFlushHiveCount = 7;
ULONG CmpLazyFlushCount = 1;
LONG CmpFlushStarveWriters;
@ -60,7 +60,7 @@ CmpDoFlushNextHive(_In_ BOOLEAN ForceFlush,
if (!(CmHive->Hive.HiveFlags & HIVE_NOLAZYFLUSH) &&
(CmHive->FlushCount != CmpLazyFlushCount))
{
/* Great sucess! */
/* Great success! */
Result = TRUE;
/* One less to flush */
@ -80,7 +80,7 @@ CmpDoFlushNextHive(_In_ BOOLEAN ForceFlush,
DPRINT("Flushing: %wZ\n", &CmHive->FileFullPath);
DPRINT("Handle: %p\n", CmHive->FileHandles[HFILE_TYPE_PRIMARY]);
Status = HvSyncHive(&CmHive->Hive);
if(!NT_SUCCESS(Status))
if (!NT_SUCCESS(Status))
{
/* Let them know we failed */
DPRINT1("Failed to flush %wZ on handle %p (status 0x%08lx)\n",

View file

@ -1460,7 +1460,7 @@ extern HANDLE CmpRegistryRootHandle;
extern BOOLEAN ExpInTextModeSetup;
extern BOOLEAN InitIsWinPEMode;
extern ULONG CmpHashTableSize;
extern ULONG CmpDelayedCloseSize, CmpDelayedCloseIndex;
extern ULONG CmpDelayedCloseSize;
extern BOOLEAN CmpNoWrite;
extern BOOLEAN CmpForceForceFlush;
extern BOOLEAN CmpWasSetupBoot;
@ -1468,6 +1468,8 @@ extern BOOLEAN CmpProfileLoaded;
extern PCMHIVE CmiVolatileHive;
extern LIST_ENTRY CmiKeyObjectListHead;
extern BOOLEAN CmpHoldLazyFlush;
extern ULONG CmpLazyFlushIntervalInSeconds;
extern ULONG CmpLazyFlushHiveCount;
extern BOOLEAN HvShutdownComplete;
//