"В Windows 11 useplatformtick включен по умолчанию и не может быть отключен

Тема в разделе "WASM.OS.DEVEL", создана пользователем zky02, 30 апр 2024.

  1. zky02

    zky02 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2024
    Сообщения:
    21
    Здравствуйте, я хочу вернуть настройки useplatformtick в Windows 11 к настройкам Windows 10. Я пытался отладить функции и обнаружил, что только NtSetTimerResolution изменилась между версиями, потому что HalpSzUsePlatformTick равен 0 в обеих сборках, но Microsoft внесла некоторые изменения в управление системным таймером в Windows 11.

    win10
    Код (Text):
    1. _int64 __fastcall NtSetTimerResolution(_int64 a1, char a2, int *a3)
    2. {
    3.   unsigned int v5; // er14
    4.   __int64 v6; // r8
    5.   _KPROCESS *v7; // rbx
    6.   unsigned int v8; // esi
    7.   bool v9; // r15
    8.   int v10; // edi
    9.   signed __int32 v11; // eax
    10.   signed __int32 v12; // ett
    11.   signed __int32 v13; // edi
    12.   __int64 v14; // rcx
    13.   __int64 v15; // rdx
    14.   signed __int32 v17; // ett
    15.   __int64 v18; // rdi
    16.   void *v19; // rcx
    17.  
    18.   v5 = a1;
    19.   if ( KeGetCurrentThread()->PreviousMode )
    20.   {
    21.     v6 = 0x7FFFFFFF0000i64;
    22.     if ( (unsigned __int64)a3 < 0x7FFFFFFF0000i64 )
    23.       v6 = (__int64)a3;
    24.     *(_DWORD *)v6 = *(_DWORD *)v6;
    25.   }
    26.   v7 = KeGetCurrentThread()->ApcState.Process;
    27.   v8 = 0;
    28.   v9 = 1;
    29.   LOBYTE(a1) = 1;
    30.   ExAcquireTimeRefreshLock(a1);
    31.   v10 = KeTimeIncrement;
    32.   _m_prefetchw((char *)&v7[1].DirectoryTableBase + 4);
    33.   v11 = HIDWORD(v7[1].DirectoryTableBase);
    34.   if ( a2 )
    35.   {
    36.     do
    37.     {
    38.       v12 = v11;
    39.       v11 = _InterlockedCompareExchange((volatile signed __int32 *)&v7[1].DirectoryTableBase + 1, v11 | 0x80001000, v11);
    40.     }
    41.     while ( v12 != v11 );
    42.     v13 = v11;
    43.     if ( v11 >= 0 )
    44.       ExpInsertTimerResolutionEntry(v7);
    45.     if ( _bittest(&v13, 0xCu) )
    46.       v9 = v5 <= LODWORD(v7[1].EndPadding[1]);
    47.     else
    48.       ++ExpTimerResolutionCount;
    49.     if ( !v7[1].EndPadding[0] || v5 < HIDWORD(v7[1].EndPadding[1]) )
    50.     {
    51.       v18 = PoDiagCaptureUsermodeStack();
    52.       if ( v18 )
    53.       {
    54.         v19 = (void *)v7[1].EndPadding[0];
    55.         if ( v19 )
    56.           ExFreePoolWithTag(v19, 0x50455654u);
    57.         v7[1].EndPadding[0] = v18;
    58.         HIDWORD(v7[1].EndPadding[1]) = v5;
    59.       }
    60.     }
    61.     LODWORD(v7[1].EndPadding[1]) = v5;
    62.     PoTraceSystemTimerResolution(0i64, v7);
    63.     if ( (HIDWORD(v7[2].Header.WaitListHead.Flink) & 0x4000000) != 0 )
    64.     {
    65.       v10 = KeTimeIncrement;
    66.       goto LABEL_16;
    67.     }
    68.     v15 = v5;
    69.     LOBYTE(v14) = v9;
    70.   }
    71.   else
    72.   {
    73.     do
    74.     {
    75.       v17 = v11;
    76.       v11 = _InterlockedCompareExchange((volatile signed __int32 *)&v7[1].DirectoryTableBase + 1, v11 & 0xFFFFEFFF, v11);
    77.     }
    78.     while ( v17 != v11 );
    79.     if ( !_bittest(&v11, 0xCu) )
    80.     {
    81.       v8 = -1073741243;
    82.       goto LABEL_16;
    83.     }
    84.     --ExpTimerResolutionCount;
    85.     LODWORD(v7[1].EndPadding[1]) = 0;
    86.     PoTraceSystemTimerResolution(0i64, v7);
    87.     v15 = 0i64;
    88.     v14 = 0i64;
    89.   }
    90.   v10 = ExpUpdateTimerResolution(v14, v15, 0i64);
    91. LABEL_16:
    92.   ExReleaseResourceLite(&ExpTimeRefreshLock);
    93.   KeLeaveCriticalRegion();
    94.   *a3 = v10;
    95.   return v8;
    96. }
    win11

    Код (Text):
    1. __int64 __fastcall NtSetTimerResolution(__int64 a1, char a2, unsigned __int64 a3)
    2. {
    3.   unsigned int v5; // esi
    4.   __int64 v6; // r8
    5.   _KPROCESS *v7; // rbx
    6.   unsigned int v8; // er13
    7.   int v9; // er15
    8.   signed __int32 v10; // eax
    9.   signed __int32 v11; // ett
    10.   __int64 v12; // rdx
    11.   __int64 v13; // rcx
    12.   void *v14; // r14
    13.   void *v15; // rdi
    14.   bool v17; // r14
    15.   signed __int32 v18; // ett
    16.   signed __int32 v19; // edi
    17.   __int64 v20; // rcx
    18.   unsigned __int64 v21; // rax
    19.   bool v22; // zf
    20.   unsigned int v23; // [rsp+70h] [rbp+8h]
    21.   _DWORD *v24; // [rsp+80h] [rbp+18h]
    22.   char v25; // [rsp+88h] [rbp+20h]
    23.  
    24.   v24 = (_DWORD *)a3;
    25.   v23 = a1;
    26.   v5 = a1;
    27.   if ( KeGetCurrentThread()->PreviousMode )
    28.   {
    29.     v6 = 0x7FFFFFFF0000i64;
    30.     if ( a3 < 0x7FFFFFFF0000i64 )
    31.       v6 = a3;
    32.     *(_DWORD *)v6 = *(_DWORD *)v6;
    33.   }
    34.   v7 = KeGetCurrentThread()->ApcState.Process;
    35.   v25 = 0;
    36.   v8 = 0;
    37.   LOBYTE(a1) = 1;
    38.   ExAcquireTimeRefreshLock(a1);
    39.   v9 = KeTimeIncrement;
    40.   _m_prefetchw((char *)&v7[1].DirectoryTableBase + 4);
    41.   v10 = HIDWORD(v7[1].DirectoryTableBase);
    42.   if ( a2 )
    43.   {
    44.     v17 = 1;
    45.     do
    46.     {
    47.       v18 = v10;
    48.       v10 = _InterlockedCompareExchange((volatile signed __int32 *)&v7[1].DirectoryTableBase + 1, v10 | 0x80001000, v10);
    49.     }
    50.     while ( v18 != v10 );
    51.     v19 = v10;
    52.     if ( v10 >= 0 )
    53.       ExpInsertTimerResolutionEntry(v7);
    54.     if ( _bittest(&v19, 0xCu) )
    55.       v17 = v5 <= LODWORD(v7[1].PerProcessorCycleTimes);
    56.     else
    57.       ++ExpTimerResolutionCount;
    58.     if ( !v7[1].LastRebalanceQpc || v5 < HIDWORD(v7[1].PerProcessorCycleTimes) )
    59.       v25 = 1;
    60.     LODWORD(v7[1].PerProcessorCycleTimes) = v5;
    61.     PoTraceSystemTimerResolution(0i64, v7);
    62.     if ( (HIDWORD(v7[2].Header.WaitListHead.Flink) & 0x4000000) != 0 )
    63.     {
    64.       v9 = KePseudoHrTimeIncrement;
    65.       goto LABEL_10;
    66.     }
    67.     v12 = v5;
    68.     LOBYTE(v13) = v17;
    69.   }
    70.   else
    71.   {
    72.     do
    73.     {
    74.       v11 = v10;
    75.       v10 = _InterlockedCompareExchange((volatile signed __int32 *)&v7[1].DirectoryTableBase + 1, v10 & 0xFFFFEFFF, v10);
    76.     }
    77.     while ( v11 != v10 );
    78.     if ( !_bittest(&v10, 0xCu) )
    79.     {
    80.       v8 = -1073741243;
    81.       goto LABEL_10;
    82.     }
    83.     --ExpTimerResolutionCount;
    84.     LODWORD(v7[1].PerProcessorCycleTimes) = 0;
    85.     PoTraceSystemTimerResolution(0i64, v7);
    86.     v12 = 0i64;
    87.     v13 = 0i64;
    88.   }
    89.   v9 = ExpUpdateTimerResolution(v13, v12, 0i64);
    90. LABEL_10:
    91.   ExReleaseResourceLite(&ExpTimeRefreshLock);
    92.   KeLeaveCriticalRegion();
    93.   v14 = 0i64;
    94.   v15 = 0i64;
    95.   if ( v25 )
    96.   {
    97.     v15 = (void *)PoDiagCaptureUsermodeStack();
    98.     if ( v15 )
    99.     {
    100.       LOBYTE(v20) = 1;
    101.       ExAcquireTimeRefreshLock(v20);
    102.       v21 = v7[1].LastRebalanceQpc;
    103.       v22 = v21 == 0;
    104.       if ( v21 )
    105.       {
    106.         if ( v23 >= HIDWORD(v7[1].PerProcessorCycleTimes) )
    107.         {
    108. LABEL_33:
    109.           ExReleaseResourceLite(&ExpTimeRefreshLock);
    110.           KeLeaveCriticalRegion();
    111.           goto LABEL_11;
    112.         }
    113.         v22 = v21 == 0;
    114.       }
    115.       if ( !v22 )
    116.         v14 = (void *)v7[1].LastRebalanceQpc;
    117.       HIDWORD(v7[1].PerProcessorCycleTimes) = v23;
    118.       v7[1].LastRebalanceQpc = (unsigned __int64)v15;
    119.       v15 = 0i64;
    120.       goto LABEL_33;
    121.     }
    122.   }
    123. LABEL_11:
    124.   if ( v14 )
    125.     ExFreePoolWithTag(v14, 0x50455654u);
    126.   if ( v15 )
    127.     ExFreePoolWithTag(v15, 0x50455654u);
    128.   *v24 = v9;
    129.   return v8;
    130. }

    Также Windows 11 использует таймер с периодичностью 1 мс вместо 15 мс. Чтобы исправить это, мне пришлось добавить ключ реестра [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel] 'GlobalTimerResolutionRequests'=dword:00000001, чтобы вернуть значение таймера к 15 мс.

    win 11

    [​IMG]

    win 10

    [​IMG]

    Сейчас я пытаюсь понять, как мне вернуть настройки useplatformtick, которые заставляют использовать RTC в Windows 11. Нужно ли мне вносить изменения в NtSetTimerResolution?
     

    Вложения:

    Последнее редактирование: 1 май 2024