Что такое 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; ...
Должно быть это тоже самое что и ExpTickCountMultiplier. Вычисляется он в KiInitializeKernel -> ExpInitializeExecutive -> ExComputeTickCountMultiplier. Код (Text): ULONG NtGetTickCount ( VOID ) /*++ Routine Description: This function computes the number of milliseconds since the system was booted. The computation is performed by multiplying the clock interrupt count by a scaled fixed binary multiplier and then right shifting the 64-bit result to extract the 32-bit millisecond count. The multiplier fraction is scaled by 24 bits. Thus for a 100 Hz clock rate, there are 10 ticks per millisecond, and the multiplier is 0x0a000000 (10 << 24). For a 128 Hz clock rate, there are 7.8125, or 7 13/16 ticks per millisecond, and so the multiplier is 0x07d00000. This effectively replaces a (slow) divide instruction with a (fast) multiply instruction. The multiplier value is only calculated once based on the TimeIncrement value (clock tick interval in 100ns units). N.B. The tick count value wraps every 2^32 milliseconds (49.71 days). Arguments: None. Return Value: The number of milliseconds since the system was booted is returned as the function value. --*/ { ULONGLONG Product; // // compute unsigned 64-bit product // Product = (ULONGLONG)KeTickCount * ExpTickCountMultiplier; // // shift off 24-bit fraction part and // return the 32-bit canonical ULONG integer part. // return ((ULONG)(Product >> 24)); }