3 #include <section_attribs.h>
10 #define KeGetCurrentThread _KeGetCurrentThread
11 #define KeGetPreviousMode _KeGetPreviousMode
13 #undef PsGetCurrentProcess
14 #define PsGetCurrentProcess _PsGetCurrentProcess
16 #define RVA(m, b) ((PVOID)((ULONG_PTR)(b) + (ULONG_PTR)(m)))
19 // We are very lazy on ARM -- we just import intrinsics
20 // Question: Why wasn't this done for x86 too? (see fastintrlck.asm)
22 #define InterlockedDecrement _InterlockedDecrement
23 #define InterlockedDecrement16 _InterlockedDecrement16
24 #define InterlockedIncrement _InterlockedIncrement
25 #define InterlockedIncrement16 _InterlockedIncrement16
26 #define InterlockedCompareExchange _InterlockedCompareExchange
27 #define InterlockedCompareExchange16 _InterlockedCompareExchange16
28 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
29 #define InterlockedExchange _InterlockedExchange
30 #define InterlockedExchangeAdd _InterlockedExchangeAdd
31 #define InterlockedOr _InterlockedOr
32 #define InterlockedAnd _InterlockedAnd
35 // Use inlined versions of fast/guarded mutex routines
37 #define ExEnterCriticalRegionAndAcquireFastMutexUnsafe _ExEnterCriticalRegionAndAcquireFastMutexUnsafe
38 #define ExReleaseFastMutexUnsafeAndLeaveCriticalRegion _ExReleaseFastMutexUnsafeAndLeaveCriticalRegion
39 #define ExAcquireFastMutex _ExAcquireFastMutex
40 #define ExReleaseFastMutex _ExReleaseFastMutex
41 #define ExAcquireFastMutexUnsafe _ExAcquireFastMutexUnsafe
42 #define ExReleaseFastMutexUnsafe _ExReleaseFastMutexUnsafe
43 #define ExTryToAcquireFastMutex _ExTryToAcquireFastMutex
45 #define KeInitializeGuardedMutex _KeInitializeGuardedMutex
46 #define KeAcquireGuardedMutex _KeAcquireGuardedMutex
47 #define KeReleaseGuardedMutex _KeReleaseGuardedMutex
48 #define KeAcquireGuardedMutexUnsafe _KeAcquireGuardedMutexUnsafe
49 #define KeReleaseGuardedMutexUnsafe _KeReleaseGuardedMutexUnsafe
50 #define KeTryToAcquireGuardedMutex _KeTryToAcquireGuardedMutex
79 #include "arch/intrin_i.h"
83 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
86 #if defined(_X86_) || defined(_M_AMD64) || defined(_MIPS_) || defined(_PPC_) || defined(_ARM_)
88 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
89 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
93 /* on Itanium if the 24 most significant bits are set, we're not dealing with
95 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
98 #error IsPointerOffset() needs to be defined for this architecture
104 C_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA
, SystemCall
) == 0x300);
106 C_ASSERT(FIELD_OFFSET(KTHREAD
, InitialStack
) == KTHREAD_INITIAL_STACK
);
107 C_ASSERT(FIELD_OFFSET(KTHREAD
, KernelStack
) == KTHREAD_KERNEL_STACK
);
108 C_ASSERT(FIELD_OFFSET(KTHREAD
, SystemAffinityActive
) == FIELD_OFFSET(KTHREAD
, WaitBlock
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareByte
));
109 C_ASSERT(FIELD_OFFSET(KTHREAD
, ApcState
.Process
) == KTHREAD_APCSTATE_PROCESS
);
110 C_ASSERT(FIELD_OFFSET(KTHREAD
, ApcQueueable
) == FIELD_OFFSET(KTHREAD
, ApcState
.UserApcPending
) + 1);
111 C_ASSERT(FIELD_OFFSET(KTHREAD
, ApcQueueable
) == 0x3F);
112 C_ASSERT(FIELD_OFFSET(KTHREAD
, NextProcessor
) == 0x40);
113 C_ASSERT(FIELD_OFFSET(KTHREAD
, DeferredProcessor
) == 0x41);
114 C_ASSERT(FIELD_OFFSET(KTHREAD
, AdjustReason
) == 0x42);
115 C_ASSERT(FIELD_OFFSET(KTHREAD
, NpxState
) == KTHREAD_NPX_STATE
);
116 C_ASSERT(FIELD_OFFSET(KTHREAD
, Alertable
) == 0x58);
117 C_ASSERT(FIELD_OFFSET(KTHREAD
, SwapBusy
) == 0x05D);
118 C_ASSERT(FIELD_OFFSET(KTHREAD
, Teb
) == KTHREAD_TEB
);
119 C_ASSERT(FIELD_OFFSET(KTHREAD
, Timer
) == 0x078);
120 C_ASSERT(FIELD_OFFSET(KTHREAD
, ThreadFlags
) == 0x0A0);
121 C_ASSERT(FIELD_OFFSET(KTHREAD
, WaitBlock
) == 0x0A8);
122 C_ASSERT(FIELD_OFFSET(KTHREAD
, WaitBlockFill0
) == 0x0A8);
123 C_ASSERT(FIELD_OFFSET(KTHREAD
, QueueListEntry
) == 0x108);
124 C_ASSERT(FIELD_OFFSET(KTHREAD
, PreviousMode
) == KTHREAD_PREVIOUS_MODE
);
125 C_ASSERT(FIELD_OFFSET(KTHREAD
, PreviousMode
) == FIELD_OFFSET(KTHREAD
, WaitBlock
) + sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareByte
));
126 C_ASSERT(FIELD_OFFSET(KTHREAD
, ResourceIndex
) == FIELD_OFFSET(KTHREAD
, WaitBlock
) + 2*sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareByte
));
127 C_ASSERT(FIELD_OFFSET(KTHREAD
, LargeStack
) == FIELD_OFFSET(KTHREAD
, WaitBlock
) + 3*sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareByte
));
128 C_ASSERT(FIELD_OFFSET(KTHREAD
, TrapFrame
) == KTHREAD_TRAP_FRAME
);
129 C_ASSERT(FIELD_OFFSET(KTHREAD
, CallbackStack
) == KTHREAD_CALLBACK_STACK
);
130 C_ASSERT(FIELD_OFFSET(KTHREAD
, ServiceTable
) == KTHREAD_SERVICE_TABLE
);
131 C_ASSERT(FIELD_OFFSET(KTHREAD
, FreezeCount
) == FIELD_OFFSET(KTHREAD
, SavedApcState
.UserApcPending
) + 1);
132 C_ASSERT(FIELD_OFFSET(KTHREAD
, Quantum
) == FIELD_OFFSET(KTHREAD
, SuspendApc
.SpareByte0
));
133 C_ASSERT(FIELD_OFFSET(KTHREAD
, QuantumReset
) == FIELD_OFFSET(KTHREAD
, SuspendApc
.SpareByte1
));
134 C_ASSERT(FIELD_OFFSET(KTHREAD
, KernelTime
) == FIELD_OFFSET(KTHREAD
, SuspendApc
.SpareLong0
));
135 C_ASSERT(FIELD_OFFSET(KTHREAD
, TlsArray
) == FIELD_OFFSET(KTHREAD
, SuspendApc
.SystemArgument1
));
136 C_ASSERT(FIELD_OFFSET(KTHREAD
, LegoData
) == FIELD_OFFSET(KTHREAD
, SuspendApc
.SystemArgument2
));
137 C_ASSERT(FIELD_OFFSET(KTHREAD
, PowerState
) == FIELD_OFFSET(KTHREAD
, SuspendApc
.Inserted
) + 1);
138 C_ASSERT(sizeof(KTHREAD
) == 0x1B8);
140 C_ASSERT(FIELD_OFFSET(KPROCESS
, DirectoryTableBase
) == KPROCESS_DIRECTORY_TABLE_BASE
);
142 C_ASSERT(FIELD_OFFSET(KPCR
, NtTib
.ExceptionList
) == KPCR_EXCEPTION_LIST
);
143 C_ASSERT(FIELD_OFFSET(KPCR
, SelfPcr
) == KPCR_SELF
);
144 C_ASSERT(FIELD_OFFSET(KPCR
, IRR
) == KPCR_IRR
);
145 C_ASSERT(FIELD_OFFSET(KPCR
, IDR
) == KPCR_IDR
);
146 C_ASSERT(FIELD_OFFSET(KPCR
, Irql
) == KPCR_IRQL
);
147 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, CurrentThread
) == KPCR_CURRENT_THREAD
);
148 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, NextThread
) == KPCR_PRCB_NEXT_THREAD
);
149 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, NpxThread
) == KPCR_NPX_THREAD
);
150 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) == KPCR_PRCB_DATA
);
151 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, KeSystemCalls
) == KPCR_SYSTEM_CALLS
);
152 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcData
) + FIELD_OFFSET(KDPC_DATA
, DpcQueueDepth
) == KPCR_PRCB_DPC_QUEUE_DEPTH
);
153 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcData
) + 16 == KPCR_PRCB_DPC_COUNT
);
154 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcStack
) == KPCR_PRCB_DPC_STACK
);
155 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, TimerRequest
) == KPCR_PRCB_TIMER_REQUEST
);
156 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, MaximumDpcQueueDepth
) == KPCR_PRCB_MAXIMUM_DPC_QUEUE_DEPTH
);
157 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcRequestRate
) == KPCR_PRCB_DPC_REQUEST_RATE
);
158 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcInterruptRequested
) == KPCR_PRCB_DPC_INTERRUPT_REQUESTED
);
159 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcRoutineActive
) == KPCR_PRCB_DPC_ROUTINE_ACTIVE
);
160 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcLastCount
) == KPCR_PRCB_DPC_LAST_COUNT
);
161 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, TimerRequest
) == KPCR_PRCB_TIMER_REQUEST
);
162 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, QuantumEnd
) == KPCR_PRCB_QUANTUM_END
);
163 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DeferredReadyListHead
) == KPCR_PRCB_DEFERRED_READY_LIST_HEAD
);
164 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, PowerState
) == KPCR_PRCB_POWER_STATE_IDLE_FUNCTION
);
165 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, PrcbLock
) == KPCR_PRCB_PRCB_LOCK
);
166 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcStack
) == KPCR_PRCB_DPC_STACK
);
167 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, IdleSchedule
) == KPCR_PRCB_IDLE_SCHEDULE
);
168 C_ASSERT(sizeof(FX_SAVE_AREA
) == SIZEOF_FX_SAVE_AREA
);
170 /* Platform specific checks */
171 C_ASSERT(FIELD_OFFSET(KPROCESS
, IopmOffset
) == KPROCESS_IOPM_OFFSET
);
172 C_ASSERT(FIELD_OFFSET(KPROCESS
, LdtDescriptor
) == KPROCESS_LDT_DESCRIPTOR0
);
173 C_ASSERT(FIELD_OFFSET(KTSS
, Esp0
) == KTSS_ESP0
);
174 C_ASSERT(FIELD_OFFSET(KTSS
, IoMapBase
) == KTSS_IOMAPBASE
);