Что такое TickCountMultiplier в KUSER_SHARED_DATA

Тема в разделе "WASM.WIN32", создана пользователем AlexxVel, 22 апр 2006.

  1. AlexxVel

    AlexxVel New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    6
    Адрес:
    Russia
    Что такое TickCountMultiplier в структуре KUSER_SHARED_DATA?

    Вроде как по смыслу это количество 100нс одного тика

    Я думал эта та же самая величина, что является результатом KeQueryTimeIncrement()

    Однако на практике (WinXP без сервиспаков):

    KeQuerySystemTime: HighPart=0x01C66616 LowPart=0x41FAD7B0

    KeQueryTickCount: 0x000BA63B

    KeQueryTimeIncrement: 0x18730

    SharedUserData (по DWORD-но): 000BA63B 0A03AFB7 CD134810 00000011 00000011 41FAD7B0 01C66616

    т.о. TickCountMultiplier=0x0A03AFB7

    если это какой-то период в 100 наносекундных единицах, то переводя в секунды

    получается 16.8



    ЗЫ: под KUSER_SHARED_DATA понимается следующее:

    #define KI_USER_SHARED_DATA 0xffdf0000

    #define SharedUserData ((KUSER_SHARED_DATA * const) KI_USER_SHARED_DATA)

    typedef struct _KUSER_SHARED_DATA {

    volatile ULONG TickCountLow;

    ULONG TickCountMultiplier;

    volatile KSYSTEM_TIME InterruptTime;

    volatile KSYSTEM_TIME SystemTime;

    ...
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Должно быть это тоже самое что и ExpTickCountMultiplier. Вычисляется он в KiInitializeKernel -> ExpInitializeExecutive -> ExComputeTickCountMultiplier.


    Код (Text):
    1. ULONG
    2. NtGetTickCount (
    3.    VOID
    4.    )
    5.  
    6. /*++
    7.  
    8. Routine Description:
    9.  
    10.     This function computes the number of milliseconds since the system
    11.     was booted. The computation is performed by multiplying the clock
    12.     interrupt count by a scaled fixed binary multiplier and then right
    13.     shifting the 64-bit result to extract the 32-bit millisecond count.
    14.  
    15.     The multiplier fraction is scaled by 24 bits. Thus for a 100 Hz clock
    16.     rate, there are 10 ticks per millisecond, and the multiplier is
    17.     0x0a000000 (10 << 24). For a 128 Hz clock rate, there are 7.8125, or
    18.     7 13/16 ticks per millisecond, and so the multiplier is 0x07d00000.
    19.  
    20.     This effectively replaces a (slow) divide instruction with a (fast)
    21.     multiply instruction. The multiplier value is only calculated once
    22.     based on the TimeIncrement value (clock tick interval in 100ns units).
    23.  
    24.     N.B. The tick count value wraps every 2^32 milliseconds (49.71 days).
    25.  
    26. Arguments:
    27.  
    28.     None.
    29.  
    30. Return Value:
    31.  
    32.     The number of milliseconds since the system was booted is returned
    33.     as the function value.
    34.  
    35. --*/
    36.  
    37. {
    38.     ULONGLONG Product;
    39.  
    40.     //
    41.     // compute unsigned 64-bit product
    42.     //
    43.  
    44.     Product = (ULONGLONG)KeTickCount * ExpTickCountMultiplier;
    45.  
    46.     //
    47.     // shift off 24-bit fraction part and
    48.     // return the 32-bit canonical ULONG integer part.
    49.     //
    50.            
    51.     return ((ULONG)(Product >> 24));
    52. }
     
  3. AlexxVel

    AlexxVel New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    6
    Адрес:
    Russia
    Four-F

    Спасибо. Проверил Ваш ответ на практике. Все сошлось.