/** * PROJECT: ExectOS * COPYRIGHT: See COPYING.md in the top level directory * FILE: sdk/xtdk/ketypes.h * DESCRIPTION: XT kernel core structures definitions * DEVELOPERS: Rafal Kupiec */ #ifndef __XTDK_KETYPES_H #define __XTDK_KETYPES_H #include #include #include #include #include ARCH_HEADER(xtstruct.h) /* Exception types and handling mechanisms */ #define EXCEPTION_CONTINUE_SEARCH 0x00 #define EXCEPTION_EXECUTE_HANDLER 0x01 #define EXCEPTION_CONTINUE_EXECUTION 0xFF /* Maximum number of exception parameters */ #define EXCEPTION_MAXIMUM_PARAMETERS 15 /* APC pending state length */ #define KAPC_STATE_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN)) /* Kernel service descriptor tables count */ #define KSERVICE_TABLES_COUNT 4 /* Timer length */ #define KTIMER_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)) /* Kernel builtin wait blocks */ #define EVENT_WAIT_BLOCK 2 #define KTHREAD_WAIT_BLOCK 3 #define KTIMER_WAIT_BLOCK 3 #define SEMAPHORE_WAIT_BLOCK 2 /* Quantum values */ #define READY_SKIP_QUANTUM 2 #define THREAD_QUANTUM 6 /* Thread priority levels */ #define THREAD_LOW_PRIORITY 0 #define THREAD_LOW_REALTIME_PRIORITY 16 #define THREAD_HIGH_PRIORITY 31 #define THREAD_MAXIMUM_PRIORITY 32 /* Adjust reason */ typedef enum _ADJUST_REASON { AdjustNone = 0, AdjustUnwait = 1, AdjustBoost = 2 } ADJUST_REASON, *PADJUST_REASON; /* Exception disposition return values */ typedef enum _EXCEPTION_DISPOSITION { ExceptionContinueExecution, ExceptionContinueSearch, ExceptionNestedException, ExceptionCollidedUnwind, } EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION; /* APC environment types */ typedef enum _KAPC_ENVIRONMENT { OriginalApcEnvironment, AttachedApcEnvironment, CurrentApcEnvironment, InsertApcEnvironment } KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT; /* DPC importance enumeration list */ typedef enum _KDPC_IMPORTANCE { LowImportance, MediumImportance, HighImportance, MediumHighImportance } KDPC_IMPORTANCE, *PKDPC_IMPORTANCE; /* Event types list */ typedef enum _KEVENT_TYPE { NotificationEvent, SynchronizationEvent } KEVENT_TYPE, *PKEVENT_TYPE; /* Kernel objects */ typedef enum _KOBJECTS { EventNotificationObject = 0, EventSynchronizationObject = 1, MutantObject = 2, ProcessObject = 3, QueueObject = 4, SemaphoreObject = 5, ThreadObject = 6, GateObject = 7, TimerNotificationObject = 8, TimerSynchronizationObject = 9, Spare2Object = 10, Spare3Object = 11, Spare4Object = 12, Spare5Object = 13, Spare6Object = 14, Spare7Object = 15, Spare8Object = 16, Spare9Object = 17, ApcObject = 18, DpcObject = 19, DeviceQueueObject = 20, EventPairObject = 21, InterruptObject = 22, ProfileObject = 23, ThreadedDpcObject = 24, MaximumKernelObject = 25 } KOBJECTS, *PKOBJECTS; /* Process states */ typedef enum _KPROCESS_STATE { ProcessInMemory, ProcessOutOfMemory, ProcessInTransition, ProcessOutTransition, ProcessInSwap, ProcessOutSwap } KPROCESS_STATE, *PKPROCESS_STATE; /* Thread state */ typedef enum _KTHREAD_STATE { Initialized, Ready, Running, Standby, Terminated, Waiting, Transition, DeferredReady } KTHREAD_STATE, *PKTHREAD_STATE; /* Timer type */ typedef enum _KTIMER_TYPE { NotificationTimer, SynchronizationTimer } KTIMER_TYPE, *PKTIMER_TYPE; /* APC Types */ typedef enum _MODE { KernelMode, UserMode, MaximumMode } MODE, *PMODE; /* Wait type */ typedef enum _WAIT_TYPE { WaitAll, WaitAny } WAIT_TYPE, *PWAIT_TYPE; /* Kernel routine callbacks */ typedef EXCEPTION_DISPOSITION (XTCDECL *PEXCEPTION_ROUTINE)(IN PEXCEPTION_RECORD ExceptionRecord, IN PVOID EstablisherFrame, IN OUT PCONTEXT ContextRecord, IN OUT PVOID DispatcherContext); typedef VOID (XTCDECL *PKDEFERRED_ROUTINE)(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2); typedef VOID (XTAPI *PKNORMAL_ROUTINE)(IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2); typedef VOID (XTAPI *PKKERNEL_ROUTINE)(IN PKAPC Apc, IN OUT PKNORMAL_ROUTINE *NormalRoutine, IN OUT PVOID *NormalContext, IN OUT PVOID *SystemArgument1, IN OUT PVOID *SystemArgument2); typedef VOID (XTAPI *PKRUNDOWN_ROUTINE)(IN PKAPC Apc); typedef VOID (XTCDECL *PKSTART_ROUTINE)(IN PVOID StartContext); typedef VOID (XTCDECL *PKSYSTEM_ROUTINE)(IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext); /* Exception record structure definition */ typedef struct _EXCEPTION_RECORD { XTSTATUS ExceptionCode; ULONG ExceptionFlags; PEXCEPTION_RECORD ExceptionRecord; PVOID ExceptionAddress; ULONG NumberParameters; ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; } EXCEPTION_RECORD, *PEXCEPTION_RECORD; /* Asynchronous Procedure Call (APC) object structure definition */ typedef struct _KAPC { UCHAR Type; UCHAR SpareByte0; UCHAR Size; UCHAR SpareByte1; ULONG SpareLong0; PKTHREAD Thread; LIST_ENTRY ApcListEntry; PKKERNEL_ROUTINE KernelRoutine; PKRUNDOWN_ROUTINE RundownRoutine; PKNORMAL_ROUTINE NormalRoutine; PVOID NormalContext; PVOID SystemArgument1; PVOID SystemArgument2; CHAR ApcStateIndex; KPROCESSOR_MODE ApcMode; BOOLEAN Inserted; } KAPC, *PKAPC; /* Deferred Procedure Call (DPC) object structure definition */ typedef struct _KDPC { UCHAR Type; UCHAR Importance; UCHAR Number; UCHAR Expedite; LIST_ENTRY DpcListEntry; PKDEFERRED_ROUTINE DeferredRoutine; PVOID DeferredContext; PVOID SystemArgument1; PVOID SystemArgument2; PVOID DpcData; } KDPC, *PKDPC; /* DPC data structure definition */ typedef struct _KDPC_DATA { LIST_ENTRY DpcListHead; KSPIN_LOCK DpcLock; VOLATILE ULONG DpcQueueDepth; ULONG DpcCount; } KDPC_DATA, *PKDPC_DATA; /* Event object structure definition */ typedef struct _KEVENT { DISPATCHER_HEADER Header; } KEVENT, *PKEVENT; /* Exception registration record structure definition */ typedef struct _EXCEPTION_REGISTRATION_RECORD { PEXCEPTION_REGISTRATION_RECORD Next; PEXCEPTION_ROUTINE Handler; } EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD; /* APC state structure definition */ typedef struct _KAPC_STATE { LIST_ENTRY ApcListHead[MaximumMode]; PKPROCESS Process; BOOLEAN KernelApcInProgress; BOOLEAN KernelApcPending; BOOLEAN UserApcPending; } KAPC_STATE, *PKAPC_STATE; /* Event gate structure definition */ typedef struct _KGATE { DISPATCHER_HEADER Header; } KGATE, *PKGATE; /* Semaphore object structure definition */ typedef struct _KSEMAPHORE { DISPATCHER_HEADER Header; LONG Limit; } KSEMAPHORE, *PKSEMAPHORE; /* Per processor lock queue structure definition */ typedef struct _KSPIN_LOCK_QUEUE { PKSPIN_LOCK_QUEUE Next; PKSPIN_LOCK Lock; } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE; /* Queue object structure definition */ typedef struct _KQUEUE { DISPATCHER_HEADER Header; LIST_ENTRY EntryListHead; ULONG CurrentCount; ULONG MaximumCount; LIST_ENTRY ThreadListHead; } KQUEUE, *PKQUEUE; /* Kernel service table descriptor */ typedef struct _KSERVICE_DESCRIPTOR_TABLE { PULONG_PTR Base; PULONG Count; ULONG Limit; PUCHAR Number; } KSERVICE_DESCRIPTOR_TABLE, *PKSERVICE_DESCRIPTOR_TABLE; /* Timer object structure definition */ typedef struct _KTIMER { DISPATCHER_HEADER Header; ULARGE_INTEGER DueTime; LIST_ENTRY TimerListEntry; LONG Period; } KTIMER, *PKTIMER; /* Wait block structure definition */ typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; PKTHREAD Thread; PVOID Object; PKWAIT_BLOCK *NextWaitBlock; USHORT WaitKey; UCHAR WaitType; UCHAR SpareByte; LONG SpareLong; } KWAIT_BLOCK, *PKWAIT_BLOCK; /* XT Thread Information Block (TIB) definition */ typedef struct _THREAD_INFORMATION_BLOCK { PEXCEPTION_REGISTRATION_RECORD ExceptionList; PVOID StackBase; PVOID StackLimit; PVOID SubSystemTib; PVOID ArbitraryUserPointer; PTHREAD_INFORMATION_BLOCK Self; } THREAD_INFORMATION_BLOCK, *PTHREAD_INFORMATION_BLOCK; /* Process control block structure definition */ typedef struct _KPROCESS { DISPATCHER_HEADER Header; LIST_ENTRY ProfileListHead; ULONG_PTR DirectoryTable[2]; USHORT IopmOffset; VOLATILE KAFFINITY ActiveProcessors; LIST_ENTRY ReadyListHead; LIST_ENTRY ThreadListHead; KAFFINITY Affinity; union { struct { LONG AutoAlignment:1; LONG DisableBoost:1; LONG DisableQuantum:1; LONG ReservedFlags:29; }; LONG ProcessFlags; }; SCHAR BasePriority; SCHAR Quantum; UCHAR State; ULONG_PTR StackCount; } KPROCESS, *PKPROCESS; /* Thread control block structure definition */ typedef struct _KTHREAD { DISPATCHER_HEADER Header; LIST_ENTRY MutantListHead; PVOID InitialStack; PVOID KernelStack; PVOID StackBase; PVOID StackLimit; KSPIN_LOCK ThreadLock; volatile UCHAR State; union { KAPC_STATE ApcState; struct { UCHAR ApcStateFill[KAPC_STATE_LENGTH]; BOOLEAN ApcQueueable; VOLATILE UCHAR NextProcessor; VOLATILE UCHAR DeferredProcessor; UCHAR AdjustReason; SCHAR AdjustIncrement; }; }; KSPIN_LOCK ApcQueueLock; ULONG ContextSwitches; LONG_PTR WaitStatus; union { PKWAIT_BLOCK WaitBlockList; PKGATE GateObject; }; BOOLEAN Alertable; BOOLEAN WaitNext; UCHAR WaitReason; SCHAR Priority; UCHAR StackSwap; VOLATILE UCHAR SwapBusy; BOOLEAN Alerted[MaximumMode]; union { LIST_ENTRY WaitListEntry; SINGLE_LIST_ENTRY SwapListEntry; }; PKQUEUE Queue; CHAR PreviousMode; SHORT SpecialApcDisable; PTHREAD_ENVIRONMENT_BLOCK EnvironmentBlock; union { KTIMER Timer; struct { UCHAR TimerFill[KTIMER_LENGTH]; union { struct { LONG AutoAlignment:1; LONG DisableBoost:1; LONG ReservedFlags:30; }; LONG ThreadFlags; }; }; }; KWAIT_BLOCK WaitBlock[KTHREAD_WAIT_BLOCK + 1]; UCHAR NpxState; KIRQL WaitIrql; LIST_ENTRY QueueListEntry; PKTRAP_FRAME TrapFrame; PVOID CallbackStack; PVOID ServiceTable; ULONG KernelLimit; UCHAR ApcStateIndex; BOOLEAN StackResident; PKPROCESS Process; KAFFINITY Affinity; PKAPC_STATE ApcStatePointer[2]; KAPC_STATE SavedApcState; KAPC SuspendApc; KSEMAPHORE SuspendSemaphore; } KTHREAD, *PKTHREAD; #endif /* __XTDK_KEFUNCS_H */