So:CacheAwareScheduling has values 0 1 2 3 4 5 6 7 (3 bit flags non documented)
MaxDynamicTickDuration 1000 basicaly disables DynamicTick, since Min value (non registry) is the same
SerializeTimerExpiration 0=def/auto 1=force 2=off (win internals), but 2 falls back to 0 in win10
MaximumSharedReadyQueueSize if I set 256 I get BSOD, 128 works
Is it possible for you to list all these kernel values on your running system (while you are at it)?
Allthough Windows 10 is pretty optimized on this it would be nice to know running values.
Cheers
Correct, DWORD: MinDynamicTickDuration cannot be changed via the registry, only via debugger.
I didnt tested max value of MaximumSharedReadyQueueSize.
I believe it might be possible to list all values. But the values and names are not the same names as in the registry. Some DWORDs are not associated with a name or it is not readable, more of a guessing game.
Not all settings can be changed via the registry atleast some of them require special combinations or you need the deactived some locks. As I found out, some locks are unlocked by default.
Example: Here, there is a DWORD called KiForceIdleDisabled, but here the prefix already helps us, the next point would be to find out what the registry keyword is, somehow some values are not linked, which could be a problem with IDA. Possibilities would be: "ForceIdleDisabled","IdleForceDisable" etc.
This DWORD is no power setting recognizable by the prefix and I had a different value before that when I tested some other things. Now it's back to 0. Of course, in this example, this DWORD could be linked to power settings.
Idle Strings:
Code:
ActiveIdleLevel
ActiveIdleThreshold
ActiveIdleTimeout
DisableIdleStatesAtBoot
Enlightened Idle
ForceIdleGracePeriod
ForceIdleResetReason
HalProcessorIdle
Idle
IdleAllowScaling
IdleDemoteThreshold
IdleDisable
IdleDurationExpirationTimeout
IdleIntervalCountBucketLimitsInMs
IdleIntervalCountBuckets
IdleMaxDurationInUs
IdleMinDurationInUs
IdlePhaseWatchdog
IdleProcessorsRequireQosManagement
IdlePromoteThreshold
IdleScanInterval
IdleStateCount
IdleStateMax
IdleStateTimeout
IdleTimeCheck
IdleTotalDurationInUs
LatencyToleranceIdleResiliency
PdcIdlePhaseDefaultWatchdogTimeoutSeconds
PoCpuIdledSinceLastCallImprecise
PoFxCompleteIdleCondition
PoFxCompleteIdleCondition
PoFxCompleteIdleState
PoFxCompleteIdleState
PoFxIdleComponent
PoFxIdleComponent
PoFxSetDeviceIdleTimeout
PoFxSetDeviceIdleTimeout
PoGetProcessorIdleAccounting
PoRegisterDeviceForIdleDetection
Power-IdleStatesMax-Enabled
SystemIdle
WorkerFactoryThreadIdleTimeout
Some Code of DynamicTick:
Code:
__int64 __fastcall KiSetupTimeIncrement(unsigned __int64 a1, unsigned int a2)
{
unsigned int v3; // er9
unsigned int v4; // eax
unsigned int v5; // ecx
unsigned __int64 v6; // rax
LARGE_INTEGER v7; // rax
LARGE_INTEGER v8; // rbx
LARGE_INTEGER v9; // rdi
unsigned __int64 v10; // rax
__int64 result; // rax
char v12; // [rsp+30h] [rbp+8h] BYREF
char v13; // [rsp+38h] [rbp+10h] BYREF
LARGE_INTEGER PerformanceFrequency; // [rsp+40h] [rbp+18h] BYREF
PerformanceFrequency.QuadPart = 0i64;
v12 = 0;
v3 = 156250; // Minimum Timer Resolution
v4 = a2;
if ( a2 <= 5000 ) // Maximum Timer Resolution ?
v4 = 5000;
v5 = KiMinDynamicTickDuration;
KeMinimumIncrement = v4;
if ( a1 < 156250 )
v3 = a1;
KeMaximumIncrement = v3;
if ( a2 > KiMinDynamicTickDuration )
{
v5 = a2;
KiMinDynamicTickDuration = a2;
}
v6 = KiMaxDynamicTickDuration;
if ( a1 < KiMaxDynamicTickDuration )
{
v6 = a1;
KiMaxDynamicTickDuration = a1;
}
if ( v6 < v5 )
KiMaxDynamicTickDuration = v5;
KiTickOffset = v3;
v13 = 0;
KiMaximumIncrementReciprocal = RtlpComputeFraction(1u, v3, &v13);
KeNumberProcessorsGroup0[1] = -v13;
v7 = KeQueryPerformanceCounter(&PerformanceFrequency);
v8 = PerformanceFrequency;
KeTimeAdjustmentFrequency = PerformanceFrequency.QuadPart;
v9 = v7;
v10 = RtlGenerateQpcToIncrementConstants(PerformanceFrequency.LowPart, &v12);
MEMORY[0xFFFFF78000000300] = v8.QuadPart;
MEMORY[0xFFFFF78000000360] = v10;
MEMORY[0xFFFFF78000000369] = v12;
MEMORY[0xFFFFF78000000358] = v10;
MEMORY[0xFFFFF78000000368] = v12;
MEMORY[0xFFFFF78000000348] = v9.QuadPart;
MEMORY[0xFFFFF78000000350] = v9.QuadPart;
result = 0x989680u / KeMaximumIncrement;
KiBalanceSetManagerPeriod = 0x989680u / KeMaximumIncrement;
KiBalanceSetManagerCount = 0x989680u / KeMaximumIncrement;
return result;
}