Здравствуйте, я хочу вернуть настройки useplatformtick в Windows 11 к настройкам Windows 10. Я пытался отладить функции и обнаружил, что только NtSetTimerResolution изменилась между версиями, потому что HalpSzUsePlatformTick равен 0 в обеих сборках, но Microsoft внесла некоторые изменения в управление системным таймером в Windows 11. win10 Код (Text): _int64 __fastcall NtSetTimerResolution(_int64 a1, char a2, int *a3) { unsigned int v5; // er14 __int64 v6; // r8 _KPROCESS *v7; // rbx unsigned int v8; // esi bool v9; // r15 int v10; // edi signed __int32 v11; // eax signed __int32 v12; // ett signed __int32 v13; // edi __int64 v14; // rcx __int64 v15; // rdx signed __int32 v17; // ett __int64 v18; // rdi void *v19; // rcx v5 = a1; if ( KeGetCurrentThread()->PreviousMode ) { v6 = 0x7FFFFFFF0000i64; if ( (unsigned __int64)a3 < 0x7FFFFFFF0000i64 ) v6 = (__int64)a3; *(_DWORD *)v6 = *(_DWORD *)v6; } v7 = KeGetCurrentThread()->ApcState.Process; v8 = 0; v9 = 1; LOBYTE(a1) = 1; ExAcquireTimeRefreshLock(a1); v10 = KeTimeIncrement; _m_prefetchw((char *)&v7[1].DirectoryTableBase + 4); v11 = HIDWORD(v7[1].DirectoryTableBase); if ( a2 ) { do { v12 = v11; v11 = _InterlockedCompareExchange((volatile signed __int32 *)&v7[1].DirectoryTableBase + 1, v11 | 0x80001000, v11); } while ( v12 != v11 ); v13 = v11; if ( v11 >= 0 ) ExpInsertTimerResolutionEntry(v7); if ( _bittest(&v13, 0xCu) ) v9 = v5 <= LODWORD(v7[1].EndPadding[1]); else ++ExpTimerResolutionCount; if ( !v7[1].EndPadding[0] || v5 < HIDWORD(v7[1].EndPadding[1]) ) { v18 = PoDiagCaptureUsermodeStack(); if ( v18 ) { v19 = (void *)v7[1].EndPadding[0]; if ( v19 ) ExFreePoolWithTag(v19, 0x50455654u); v7[1].EndPadding[0] = v18; HIDWORD(v7[1].EndPadding[1]) = v5; } } LODWORD(v7[1].EndPadding[1]) = v5; PoTraceSystemTimerResolution(0i64, v7); if ( (HIDWORD(v7[2].Header.WaitListHead.Flink) & 0x4000000) != 0 ) { v10 = KeTimeIncrement; goto LABEL_16; } v15 = v5; LOBYTE(v14) = v9; } else { do { v17 = v11; v11 = _InterlockedCompareExchange((volatile signed __int32 *)&v7[1].DirectoryTableBase + 1, v11 & 0xFFFFEFFF, v11); } while ( v17 != v11 ); if ( !_bittest(&v11, 0xCu) ) { v8 = -1073741243; goto LABEL_16; } --ExpTimerResolutionCount; LODWORD(v7[1].EndPadding[1]) = 0; PoTraceSystemTimerResolution(0i64, v7); v15 = 0i64; v14 = 0i64; } v10 = ExpUpdateTimerResolution(v14, v15, 0i64); LABEL_16: ExReleaseResourceLite(&ExpTimeRefreshLock); KeLeaveCriticalRegion(); *a3 = v10; return v8; } win11 Код (Text): __int64 __fastcall NtSetTimerResolution(__int64 a1, char a2, unsigned __int64 a3) { unsigned int v5; // esi __int64 v6; // r8 _KPROCESS *v7; // rbx unsigned int v8; // er13 int v9; // er15 signed __int32 v10; // eax signed __int32 v11; // ett __int64 v12; // rdx __int64 v13; // rcx void *v14; // r14 void *v15; // rdi bool v17; // r14 signed __int32 v18; // ett signed __int32 v19; // edi __int64 v20; // rcx unsigned __int64 v21; // rax bool v22; // zf unsigned int v23; // [rsp+70h] [rbp+8h] _DWORD *v24; // [rsp+80h] [rbp+18h] char v25; // [rsp+88h] [rbp+20h] v24 = (_DWORD *)a3; v23 = a1; v5 = a1; if ( KeGetCurrentThread()->PreviousMode ) { v6 = 0x7FFFFFFF0000i64; if ( a3 < 0x7FFFFFFF0000i64 ) v6 = a3; *(_DWORD *)v6 = *(_DWORD *)v6; } v7 = KeGetCurrentThread()->ApcState.Process; v25 = 0; v8 = 0; LOBYTE(a1) = 1; ExAcquireTimeRefreshLock(a1); v9 = KeTimeIncrement; _m_prefetchw((char *)&v7[1].DirectoryTableBase + 4); v10 = HIDWORD(v7[1].DirectoryTableBase); if ( a2 ) { v17 = 1; do { v18 = v10; v10 = _InterlockedCompareExchange((volatile signed __int32 *)&v7[1].DirectoryTableBase + 1, v10 | 0x80001000, v10); } while ( v18 != v10 ); v19 = v10; if ( v10 >= 0 ) ExpInsertTimerResolutionEntry(v7); if ( _bittest(&v19, 0xCu) ) v17 = v5 <= LODWORD(v7[1].PerProcessorCycleTimes); else ++ExpTimerResolutionCount; if ( !v7[1].LastRebalanceQpc || v5 < HIDWORD(v7[1].PerProcessorCycleTimes) ) v25 = 1; LODWORD(v7[1].PerProcessorCycleTimes) = v5; PoTraceSystemTimerResolution(0i64, v7); if ( (HIDWORD(v7[2].Header.WaitListHead.Flink) & 0x4000000) != 0 ) { v9 = KePseudoHrTimeIncrement; goto LABEL_10; } v12 = v5; LOBYTE(v13) = v17; } else { do { v11 = v10; v10 = _InterlockedCompareExchange((volatile signed __int32 *)&v7[1].DirectoryTableBase + 1, v10 & 0xFFFFEFFF, v10); } while ( v11 != v10 ); if ( !_bittest(&v10, 0xCu) ) { v8 = -1073741243; goto LABEL_10; } --ExpTimerResolutionCount; LODWORD(v7[1].PerProcessorCycleTimes) = 0; PoTraceSystemTimerResolution(0i64, v7); v12 = 0i64; v13 = 0i64; } v9 = ExpUpdateTimerResolution(v13, v12, 0i64); LABEL_10: ExReleaseResourceLite(&ExpTimeRefreshLock); KeLeaveCriticalRegion(); v14 = 0i64; v15 = 0i64; if ( v25 ) { v15 = (void *)PoDiagCaptureUsermodeStack(); if ( v15 ) { LOBYTE(v20) = 1; ExAcquireTimeRefreshLock(v20); v21 = v7[1].LastRebalanceQpc; v22 = v21 == 0; if ( v21 ) { if ( v23 >= HIDWORD(v7[1].PerProcessorCycleTimes) ) { LABEL_33: ExReleaseResourceLite(&ExpTimeRefreshLock); KeLeaveCriticalRegion(); goto LABEL_11; } v22 = v21 == 0; } if ( !v22 ) v14 = (void *)v7[1].LastRebalanceQpc; HIDWORD(v7[1].PerProcessorCycleTimes) = v23; v7[1].LastRebalanceQpc = (unsigned __int64)v15; v15 = 0i64; goto LABEL_33; } } LABEL_11: if ( v14 ) ExFreePoolWithTag(v14, 0x50455654u); if ( v15 ) ExFreePoolWithTag(v15, 0x50455654u); *v24 = v9; return v8; } Также Windows 11 использует таймер с периодичностью 1 мс вместо 15 мс. Чтобы исправить это, мне пришлось добавить ключ реестра [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel] 'GlobalTimerResolutionRequests'=dword:00000001, чтобы вернуть значение таймера к 15 мс. win 11 win 10 Сейчас я пытаюсь понять, как мне вернуть настройки useplatformtick, которые заставляют использовать RTC в Windows 11. Нужно ли мне вносить изменения в NtSetTimerResolution?