Files
reactos/sdk/include/ndk/kefuncs.h
Timo Kreuzer db47b59b11 [NDK][NTOS][NTDLL][KRNEL32] Fix read/write of KSYSTEM_TIME
Fix KiWriteSystemTime and move it to NDK. The previous implementation of KiWriteSystemTime was broken and updated the fields in the wrong order. Before that it was right for SystemTime and wrong for InterruptTime. ExpSetTimeZoneInformation had it wrong for the TimeZoneBias.
Add KiReadSystemTime to read KSYSTEM_TIME values correctly, instead of doing it manually (and partly wrongly) all over the place.
2025-04-18 01:09:56 +03:00

893 lines
14 KiB
C

/*++ NDK Version: 0098
Copyright (c) Alex Ionescu. All rights reserved.
Header Name:
kefuncs.h
Abstract:
Functions definitions for the Kernel services.
Author:
Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
--*/
#ifndef _KEFUNCS_H
#define _KEFUNCS_H
//
// Dependencies
//
#include <umtypes.h>
#include <ketypes.h>
#include <section_attribs.h>
#ifdef __cplusplus
extern "C"
{
#endif
#ifndef NTOS_MODE_USER
//
// Affinity helpers
//
FORCEINLINE KAFFINITY AFFINITY_MASK(ULONG Index)
{
ASSERT(Index < sizeof(KAFFINITY) * 8);
return (KAFFINITY)1 << Index;
}
FORCEINLINE BOOLEAN BitScanForwardAffinity(PULONG Index, KAFFINITY Mask)
{
#ifdef _WIN64
return BitScanForward64(Index, Mask);
#else
return BitScanForward(Index, Mask);
#endif
}
FORCEINLINE BOOLEAN BitScanReverseAffinity(PULONG Index, KAFFINITY Mask)
{
#ifdef _WIN64
return BitScanReverse64(Index, Mask);
#else
return BitScanReverse(Index, Mask);
#endif
}
FORCEINLINE BOOLEAN InterlockedBitTestAndSetAffinity(volatile KAFFINITY *Affinity, ULONG Index)
{
ASSERT(Index < sizeof(KAFFINITY) * 8);
#ifdef _WIN64
return InterlockedBitTestAndSet64((PLONG64)Affinity, Index);
#else
return InterlockedBitTestAndSet((PLONG)Affinity, Index);
#endif
}
FORCEINLINE BOOLEAN InterlockedBitTestAndResetAffinity(volatile KAFFINITY *Affinity, ULONG Index)
{
ASSERT(Index < sizeof(KAFFINITY) * 8);
#ifdef _WIN64
return InterlockedBitTestAndReset64((PLONG64)Affinity, Index);
#else
return InterlockedBitTestAndReset((PLONG)Affinity, Index);
#endif
}
//
// APC Functions
//
VOID
NTAPI
KeInitializeApc(
_In_ PKAPC Apc,
_In_ PKTHREAD Thread,
_In_ KAPC_ENVIRONMENT TargetEnvironment,
_In_ PKKERNEL_ROUTINE KernelRoutine,
_In_opt_ PKRUNDOWN_ROUTINE RundownRoutine,
_In_ PKNORMAL_ROUTINE NormalRoutine,
_In_ KPROCESSOR_MODE Mode,
_In_ PVOID Context
);
BOOLEAN
NTAPI
KeInsertQueueApc(
_In_ PKAPC Apc,
_In_ PVOID SystemArgument1,
_In_ PVOID SystemArgument2,
_In_ KPRIORITY PriorityBoost
);
VOID
NTAPI
KiDeliverApc(
_In_ KPROCESSOR_MODE PreviousMode,
#ifdef _M_AMD64
_In_ PKEXCEPTION_FRAME ExceptionFrame,
#else
_Reserved_ PKEXCEPTION_FRAME ExceptionFrame,
#endif
_In_ PKTRAP_FRAME TrapFrame
);
//
// Process/Thread Functions
//
VOID
NTAPI
KeTerminateThread(
_In_ KPRIORITY Increment
);
BOOLEAN
NTAPI
KeIsAttachedProcess(
VOID
);
VOID
NTAPI
KeSetEventBoostPriority(
_In_ PKEVENT Event,
_In_opt_ PKTHREAD *Thread
);
KAFFINITY
NTAPI
KeSetAffinityThread(
_Inout_ PKTHREAD Thread,
_In_ KAFFINITY Affinity
);
PKPROCESS
NTAPI
KeGetCurrentProcess(
VOID
);
BOOLEAN
NTAPI
KeAddSystemServiceTable(
_In_ PULONG_PTR Base,
_In_opt_ PULONG Count,
_In_ ULONG Limit,
_In_ PUCHAR Number,
_In_ ULONG Index
);
//
// Spinlock Functions
//
VOID
FASTCALL
KiAcquireSpinLock(
_Inout_ PKSPIN_LOCK SpinLock
);
VOID
FASTCALL
KiReleaseSpinLock(
_Inout_ PKSPIN_LOCK SpinLock
);
KIRQL
FASTCALL
KeAcquireQueuedSpinLockRaiseToSynch(
_In_ KSPIN_LOCK_QUEUE_NUMBER LockNumber
);
BOOLEAN
FASTCALL
KeTryToAcquireQueuedSpinLockRaiseToSynch(
_In_ KSPIN_LOCK_QUEUE_NUMBER LockNumber,
_In_ PKIRQL OldIrql
);
VOID
FASTCALL
KeAcquireInStackQueuedSpinLockRaiseToSynch(
_In_ PKSPIN_LOCK SpinLock,
_In_ PKLOCK_QUEUE_HANDLE LockHandle
);
//
// Interrupt Functions
//
VOID
NTAPI
KeInitializeInterrupt(
_Out_ PKINTERRUPT InterruptObject,
_In_ PKSERVICE_ROUTINE ServiceRoutine,
_In_ PVOID ServiceContext,
_In_ PKSPIN_LOCK SpinLock,
_In_ ULONG Vector,
_In_ KIRQL Irql,
_In_ KIRQL SynchronizeIrql,
_In_ KINTERRUPT_MODE InterruptMode,
_In_ BOOLEAN ShareVector,
_In_ CHAR ProcessorNumber,
_In_ BOOLEAN FloatingSave
);
BOOLEAN
NTAPI
KeConnectInterrupt(
_Inout_ PKINTERRUPT InterruptObject
);
BOOLEAN
NTAPI
KeDisconnectInterrupt(
_Inout_ PKINTERRUPT InterruptObject
);
VOID
NTAPI
KiDispatchInterrupt(
VOID
);
VOID
NTAPI
KiCoprocessorError(
VOID
);
DECLSPEC_NORETURN
VOID
__cdecl
KiUnexpectedInterrupt(
VOID
);
VOID
NTAPI
KeEnterKernelDebugger(
VOID
);
BOOLEAN
NTAPI
KeIsExecutingDpc(
VOID
);
BOOLEAN
NTAPI
KiIpiServiceRoutine(
_In_ PKTRAP_FRAME TrapFrame,
#ifdef _M_AMD64
_In_ PKEXCEPTION_FRAME ExceptionFrame
#else
_Reserved_ PKEXCEPTION_FRAME ExceptionFrame
#endif
);
//
// Generic DPC Routines
//
VOID
NTAPI
KeGenericCallDpc(
_In_ PKDEFERRED_ROUTINE Routine,
_In_ PVOID Context
);
VOID
NTAPI
KeSignalCallDpcDone(
_In_ PVOID SystemArgument1
);
BOOLEAN
NTAPI
KeSignalCallDpcSynchronize(
_In_ PVOID SystemArgument2
);
//
// ARC Configuration Functions. Only enabled if you have ARC Support
//
#ifdef _ARC_
PCONFIGURATION_COMPONENT_DATA
NTAPI
KeFindConfigurationNextEntry(
_In_ PCONFIGURATION_COMPONENT_DATA Child,
_In_ CONFIGURATION_CLASS Class,
_In_ CONFIGURATION_TYPE Type,
_In_opt_ PULONG ComponentKey,
_In_ PCONFIGURATION_COMPONENT_DATA *NextLink
);
PCONFIGURATION_COMPONENT_DATA
NTAPI
KeFindConfigurationEntry(
_In_ PCONFIGURATION_COMPONENT_DATA Child,
_In_ CONFIGURATION_CLASS Class,
_In_ CONFIGURATION_TYPE Type,
_In_opt_ PULONG ComponentKey
);
#endif
//
// Low-level Hardware/CPU Control Functions
//
VOID
NTAPI
KeFlushEntireTb(
_In_ BOOLEAN Invalid,
_In_ BOOLEAN AllProcessors
);
VOID
NTAPI
KeSetDmaIoCoherency(
_In_ ULONG Coherency
);
VOID
KeSetGdtSelector(
_In_ ULONG Entry,
_In_ ULONG Value1,
_In_ ULONG Value2
);
VOID
NTAPI
KeProfileInterrupt(
_In_ PKTRAP_FRAME TrapFrame
);
VOID
NTAPI
KeProfileInterruptWithSource(
_In_ PKTRAP_FRAME TrapFrame,
_In_ KPROFILE_SOURCE Source
);
VOID
NTAPI
KeSetProfileIrql(
_In_ KIRQL ProfileIrql
);
VOID
NTAPI
KeSetTimeIncrement(
_In_ ULONG MaxIncrement,
_In_ ULONG MinIncrement
);
NTSTATUS
NTAPI
Ke386CallBios(
_In_ ULONG BiosCommand,
_Inout_ PCONTEXT BiosArguments
);
//
// Misc. Functions
//
NTSTATUS
NTAPI
KeUserModeCallback(
_In_ ULONG FunctionID,
_In_reads_opt_(InputLength) PVOID InputBuffer,
_In_ ULONG InputLength,
_Outptr_result_buffer_(*OutputLength) PVOID *OutputBuffer,
_Out_ PULONG OutputLength
);
NTSTATUS
NTAPI
KeRaiseUserException(
_In_ NTSTATUS ExceptionCode
);
#endif
#ifndef NONAMELESSUNION
FORCEINLINE
LARGE_INTEGER
KiReadSystemTime(
_In_ volatile const KSYSTEM_TIME *SystemTime)
{
LARGE_INTEGER Time;
#ifdef _WIN64
/* Do a single atomic read */
Time.QuadPart = *(volatile ULONG64*)SystemTime;
#else
/* Read in a loop until we get a match */
for (;;)
{
Time.HighPart = SystemTime->High1Time;
Time.LowPart = SystemTime->LowPart;
if (Time.HighPart == SystemTime->High2Time) break;
YieldProcessor();
}
#endif
return Time;
}
#ifndef NTOS_MODE_USER
FORCEINLINE
VOID
KiWriteSystemTime(
_Out_ volatile KSYSTEM_TIME *SystemTime,
_In_ LARGE_INTEGER NewTime)
{
/* Update High2Time first to indicate an update in progress */
SystemTime->High2Time = NewTime.HighPart;
#ifdef _WIN64
/* Do a single 'atomic' write. This isn't actually guaranteed to be atomic,
if the address isn't 64 bit aligned. But as long as the entire 64 bits
are within a single cache line, we should be good (on x64 at least,
when it comes to ARM64, all bets are off) This is also what Windows does. */
*(LONGLONG*)SystemTime = NewTime.QuadPart;
#else
/* Update low part, then high part to allow readers detect partial updates. */
SystemTime->LowPart = NewTime.LowPart;
SystemTime->High1Time = NewTime.HighPart;
#endif
}
#endif // !NTOS_MODE_USER
#endif // !NONAMELESSUNION
//
// Native Calls
//
NTSYSCALLAPI
NTSTATUS
NTAPI
NtContinue(
_In_ PCONTEXT Context,
_In_ BOOLEAN TestAlert
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtCallbackReturn(
_In_ PVOID Result,
_In_ ULONG ResultLength,
_In_ NTSTATUS Status
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtCreateProfile(
_Out_ PHANDLE ProfileHandle,
_In_ HANDLE ProcessHandle,
_In_ PVOID ImageBase,
_In_ SIZE_T ImageSize,
_In_ ULONG Granularity,
_Out_ PVOID Buffer,
_In_ ULONG ProfilingSize,
_In_ KPROFILE_SOURCE Source,
_In_ KAFFINITY ProcessorMask
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtCreateProfileEx(
_Out_ PHANDLE ProfileHandle,
_In_ HANDLE ProcessHandle,
_In_ PVOID ImageBase,
_In_ SIZE_T ImageSize,
_In_ ULONG Granularity,
_Out_ PVOID Buffer,
_In_ ULONG ProfilingSize,
_In_ KPROFILE_SOURCE Source,
_In_ USHORT GroupCount,
_In_reads_(GroupCount) PGROUP_AFFINITY Affinity
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtDelayExecution(
_In_ BOOLEAN Alertable,
_In_ LARGE_INTEGER *Interval
);
ULONG
NTAPI
NtGetCurrentProcessorNumber(
VOID
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtGetContextThread(
_In_ HANDLE ThreadHandle,
_Out_ PCONTEXT Context
);
NTSYSCALLAPI
ULONG
NTAPI
NtGetTickCount(
VOID
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtQueryIntervalProfile(
_In_ KPROFILE_SOURCE ProfileSource,
_Out_ PULONG Interval
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtQueryPerformanceCounter(
_Out_ PLARGE_INTEGER Counter,
_Out_opt_ PLARGE_INTEGER Frequency
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtQuerySystemTime(
_Out_ PLARGE_INTEGER CurrentTime
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtQueryTimerResolution(
_Out_ PULONG MinimumResolution,
_Out_ PULONG MaximumResolution,
_Out_ PULONG ActualResolution
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtQueueApcThread(
_In_ HANDLE ThreadHandle,
_In_ PKNORMAL_ROUTINE ApcRoutine,
_In_opt_ PVOID NormalContext,
_In_opt_ PVOID SystemArgument1,
_In_opt_ PVOID SystemArgument2
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtQueueApcThreadEx(
_In_ HANDLE ThreadHandle,
_In_opt_ HANDLE UserApcReserveHandle,
_In_ PKNORMAL_ROUTINE ApcRoutine,
_In_opt_ PVOID NormalContext,
_In_opt_ PVOID SystemArgument1,
_In_opt_ PVOID SystemArgument2
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtRaiseException(
_In_ PEXCEPTION_RECORD ExceptionRecord,
_In_ PCONTEXT Context,
_In_ BOOLEAN SearchFrames
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtSetContextThread(
_In_ HANDLE ThreadHandle,
_In_ PCONTEXT Context
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtSetIntervalProfile(
_In_ ULONG Interval,
_In_ KPROFILE_SOURCE ClockSource
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtSetLdtEntries(
_In_ ULONG Selector1,
_In_ LDT_ENTRY LdtEntry1,
_In_ ULONG Selector2,
_In_ LDT_ENTRY LdtEntry2
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtSetSystemTime(
_In_ PLARGE_INTEGER SystemTime,
_In_opt_ PLARGE_INTEGER NewSystemTime
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtSetTimerResolution(
_In_ ULONG RequestedResolution,
_In_ BOOLEAN SetOrUnset,
_Out_ PULONG ActualResolution
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtStartProfile(
_In_ HANDLE ProfileHandle
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtStopProfile(
_In_ HANDLE ProfileHandle
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtTestAlert(
VOID
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtVdmControl(
_In_ ULONG ControlCode,
_In_ PVOID ControlData
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtW32Call(
_In_ ULONG RoutineIndex,
_In_ PVOID Argument,
_In_ ULONG ArgumentLength,
_Out_opt_ PVOID* Result,
_Out_opt_ PULONG ResultLength
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtYieldExecution(
VOID
);
NTSYSAPI
NTSTATUS
NTAPI
ZwContinue(
_In_ PCONTEXT Context,
_In_ BOOLEAN TestAlert
);
NTSYSAPI
NTSTATUS
NTAPI
ZwCallbackReturn(
_In_ PVOID Result,
_In_ ULONG ResultLength,
_In_ NTSTATUS Status
);
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateProfile(
_Out_ PHANDLE ProfileHandle,
_In_ HANDLE ProcessHandle,
_In_ PVOID ImageBase,
_In_ ULONG ImageSize,
_In_ ULONG Granularity,
_Out_ PVOID Buffer,
_In_ ULONG ProfilingSize,
_In_ KPROFILE_SOURCE Source,
_In_ KAFFINITY ProcessorMask
);
NTSYSAPI
NTSTATUS
NTAPI
ZwDelayExecution(
_In_ BOOLEAN Alertable,
_In_ LARGE_INTEGER *Interval
);
NTSYSAPI
NTSTATUS
NTAPI
ZwFlushInstructionCache(
_In_ HANDLE ProcessHandle,
_In_ PVOID BaseAddress,
_In_ ULONG NumberOfBytesToFlush
);
NTSYSAPI
NTSTATUS
NTAPI
ZwGetContextThread(
_In_ HANDLE ThreadHandle,
_Out_ PCONTEXT Context
);
NTSYSAPI
ULONG
NTAPI
ZwGetTickCount(
VOID
);
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryIntervalProfile(
_In_ KPROFILE_SOURCE ProfileSource,
_Out_ PULONG Interval
);
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryPerformanceCounter(
_Out_ PLARGE_INTEGER Counter,
_Out_opt_ PLARGE_INTEGER Frequency
);
NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemTime(
_Out_ PLARGE_INTEGER CurrentTime
);
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryTimerResolution(
_Out_ PULONG MinimumResolution,
_Out_ PULONG MaximumResolution,
_Out_ PULONG ActualResolution
);
NTSYSAPI
NTSTATUS
NTAPI
ZwQueueApcThread(
_In_ HANDLE ThreadHandle,
_In_ PKNORMAL_ROUTINE ApcRoutine,
_In_opt_ PVOID NormalContext,
_In_opt_ PVOID SystemArgument1,
_In_opt_ PVOID SystemArgument2
);
NTSYSAPI
NTSTATUS
NTAPI
ZwRaiseException(
_In_ PEXCEPTION_RECORD ExceptionRecord,
_In_ PCONTEXT Context,
_In_ BOOLEAN SearchFrames
);
NTSYSAPI
NTSTATUS
NTAPI
ZwSetContextThread(
_In_ HANDLE ThreadHandle,
_In_ PCONTEXT Context
);
NTSYSAPI
NTSTATUS
NTAPI
ZwSetIntervalProfile(
_In_ ULONG Interval,
_In_ KPROFILE_SOURCE ClockSource
);
NTSYSAPI
NTSTATUS
NTAPI
ZwSetLdtEntries(
_In_ ULONG Selector1,
_In_ LDT_ENTRY LdtEntry1,
_In_ ULONG Selector2,
_In_ LDT_ENTRY LdtEntry2
);
NTSYSAPI
NTSTATUS
NTAPI
ZwSetSystemTime(
_In_ PLARGE_INTEGER SystemTime,
_In_opt_ PLARGE_INTEGER NewSystemTime
);
NTSYSAPI
NTSTATUS
NTAPI
ZwSetTimerResolution(
_In_ ULONG RequestedResolution,
_In_ BOOLEAN SetOrUnset,
_Out_ PULONG ActualResolution
);
NTSYSAPI
NTSTATUS
NTAPI
ZwStartProfile(
_In_ HANDLE ProfileHandle
);
NTSYSAPI
NTSTATUS
NTAPI
ZwStopProfile(
_In_ HANDLE ProfileHandle
);
NTSYSAPI
NTSTATUS
NTAPI
ZwTestAlert(
VOID
);
NTSYSAPI
NTSTATUS
NTAPI
ZwVdmControl(
_In_ ULONG ControlCode,
_In_ PVOID ControlData
);
NTSYSAPI
NTSTATUS
NTAPI
ZwW32Call(
_In_ ULONG RoutineIndex,
_In_ PVOID Argument,
_In_ ULONG ArgumentLength,
_Out_opt_ PVOID* Result,
_Out_opt_ PULONG ResultLength
);
NTSYSAPI
NTSTATUS
NTAPI
ZwYieldExecution(
VOID
);
#endif
#ifdef __cplusplus
} // extern "C"
#endif