Загрузка данных


#include <windows.h>

typedef struct _KSYSTEM_TIME
{
    ULONG LowPart;
    LONG High1Time;
    LONG High2Time;
} KSYSTEM_TIME, *PKSYSTEM_TIME;

typedef struct _KUSER_SHARED_DATA
{
    ULONG TickCountLowDeprecated;
    ULONG TickCountMultiplier;
    volatile KSYSTEM_TIME InterruptTime;
    volatile KSYSTEM_TIME SystemTime;
    volatile KSYSTEM_TIME TimeZoneBias;
    USHORT ImageNumberLow;
    USHORT ImageNumberHigh;
    WCHAR NtSystemRoot[260];
    ULONG MaxStackTraceDepth;
    ULONG CryptoExponent;
    ULONG TimeZoneId;
    ULONG LargePageMinimum;
    ULONG AitSamplingValue;
    ULONG AppCompatFlag;
    ULONGLONG RNGSeedVersion;
    ULONG GlobalValidationRunlevel;
    LONG TimeZoneBiasStamp;
    ULONG NtBuildNumber;
    NT_PRODUCT_TYPE NtProductType;
    BOOLEAN ProductTypeIsValid;
    BOOLEAN Reserved0[1];
    USHORT NativeProcessorArchitecture;
    ULONG NtMajorVersion;
    ULONG NtMinorVersion;
    BOOLEAN ProcessorFeatures[64];
    ULONG Reserved1;
    ULONG Reserved3;
    volatile ULONG TimeSlip;
    ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
    ULONG BootId;
    LARGE_INTEGER SystemExpirationDate;
    ULONG SuiteMask;
    BOOLEAN KdDebuggerEnabled;
    union
    {
        UCHAR MitigationPolicies;
        UCHAR CycleDivider;
    };
    USHORT ActiveConsoleId;
    volatile USHORT DismountCount;
    ULONG ComPlusPackage;
    ULONG LastSystemRITEventTickCount;
    ULONG NumberOfPhysicalPages;
    BOOLEAN SafeBootMode;
    UCHAR VirtualizationFlags;
    ULONG TraceLogging;
    ULONGLONG TestRetInstruction;
    LONGLONG SystemCall;
    ULONG SystemCallReturn;
    ULONGLONG SystemCallPad[3];
    union
    {
        volatile KSYSTEM_TIME TickCount;
        volatile ULONGLONG TickCountQuad;
    };
    ULONG Cookie;
    ULONG ConsoleHandle;
    ULONGLONG TimeUpdateLock;
    ULONGLONG BaselineSystemTimeQpc;
    ULONGLONG BaselineInterruptTimeQpc;
    ULONGLONG ReservedForFutureUse;
    ULONGLONG ReservedForFutureUse2;
} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;

struct SavedState
{
    ULONGLONG InterruptTime;
    ULONGLONG SystemTime;
    LONGLONG TimeZoneBias;
    ULONG LastSystemRITEventTickCount;
    ULONGLONG TickCount;
    ULONGLONG TickCountMultiplier;
    ULONGLONG BaselineSystemTimeQpc;
    ULONGLONG BaselineInterruptTimeQpc;
    ULONGLONG PerformanceCounter;
    ULONGLONG PerformanceFrequency;
};

void UpdateLoop(SavedState* state, DWORD update_interval_ms, BOOL* stop_flag)
{
    PKUSER_SHARED_DATA kuser = (PKUSER_SHARED_DATA)0x7FFE0000;

    while (!*stop_flag)
    {
        LARGE_INTEGER CurrentPerfCounter;
        LARGE_INTEGER CurrentPerfFreq;
        QueryPerformanceCounter(&CurrentPerfCounter);
        QueryPerformanceFrequency(&CurrentPerfFreq);

        ULONGLONG ElapsedQpc = CurrentPerfCounter.QuadPart - state->PerformanceCounter;
        ULONGLONG ElapsedMs = (ElapsedQpc * 10000) / state->PerformanceFrequency;

        state->InterruptTime += ElapsedMs;
        state->SystemTime += ElapsedMs;

        ULONGLONG ElapsedTickCount = (ElapsedQpc * state->TickCountMultiplier) >> 32;
        state->TickCount += ElapsedTickCount;
        state->LastSystemRITEventTickCount += (ULONG)ElapsedTickCount;

        state->PerformanceCounter = CurrentPerfCounter.QuadPart;

        kuser->InterruptTime.LowPart = (ULONG)state->InterruptTime;
        kuser->InterruptTime.High1Time = (LONG)(state->InterruptTime >> 32);
        kuser->InterruptTime.High2Time = (LONG)(state->InterruptTime >> 32);

        kuser->SystemTime.LowPart = (ULONG)state->SystemTime;
        kuser->SystemTime.High1Time = (LONG)(state->SystemTime >> 32);
        kuser->SystemTime.High2Time = (LONG)(state->SystemTime >> 32);

        ULONGLONG AbsBias = (state->TimeZoneBias < 0) ? (-state->TimeZoneBias) : state->TimeZoneBias;
        kuser->TimeZoneBias.LowPart = (ULONG)AbsBias;
        kuser->TimeZoneBias.High1Time = (LONG)(AbsBias >> 32);
        kuser->TimeZoneBias.High2Time = (LONG)(AbsBias >> 32);

        kuser->LastSystemRITEventTickCount = state->LastSystemRITEventTickCount;

        kuser->TickCount.LowPart = (ULONG)state->TickCount;
        kuser->TickCount.High1Time = (LONG)(state->TickCount >> 32);
        kuser->TickCount.High2Time = (LONG)(state->TickCount >> 32);

        kuser->BaselineSystemTimeQpc = CurrentPerfCounter.QuadPart;
        kuser->BaselineInterruptTimeQpc = CurrentPerfCounter.QuadPart;

        Sleep(update_interval_ms);
    }
}

SavedState CaptureCurrentState()
{
    PKUSER_SHARED_DATA kuser = (PKUSER_SHARED_DATA)0x7FFE0000;
    SavedState state;

    LARGE_INTEGER PerfCounter;
    LARGE_INTEGER PerfFreq;
    QueryPerformanceCounter(&PerfCounter);
    QueryPerformanceFrequency(&PerfFreq);

    state.InterruptTime = ((ULONGLONG)kuser->InterruptTime.High1Time << 32) | kuser->InterruptTime.LowPart;
    state.SystemTime = ((ULONGLONG)kuser->SystemTime.High1Time << 32) | kuser->SystemTime.LowPart;
    
    LONGLONG BiasHigh = ((LONGLONG)kuser->TimeZoneBias.High1Time << 32);
    state.TimeZoneBias = BiasHigh | kuser->TimeZoneBias.LowPart;
    
    state.LastSystemRITEventTickCount = kuser->LastSystemRITEventTickCount;
    state.TickCount = ((ULONGLONG)kuser->TickCount.High1Time << 32) | kuser->TickCount.LowPart;
    state.TickCountMultiplier = kuser->TickCountMultiplier;
    state.BaselineSystemTimeQpc = kuser->BaselineSystemTimeQpc;
    state.BaselineInterruptTimeQpc = kuser->BaselineInterruptTimeQpc;
    state.PerformanceCounter = PerfCounter.QuadPart;
    state.PerformanceFrequency = PerfFreq.QuadPart;

    return state;
}

int main()
{
    SavedState old_state = CaptureCurrentState();

    old_state.SystemTime -= 6048000000000;
    old_state.InterruptTime -= 6048000000000;
    old_state.TickCount -= 604800;
    old_state.LastSystemRITEventTickCount -= 604800;

    BOOL stop = FALSE;
    UpdateLoop(&old_state, 15, &stop);

    return 0;
}