1 #ifndef __INCLUDE_INTERNAL_NTOSKRNL_H
2 #define __INCLUDE_INTERNAL_NTOSKRNL_H
5 * Use these to place a function in a specific section of the executable
7 #define PLACE_IN_SECTION(s) __attribute__((section (s)))
9 #define INIT_FUNCTION PLACE_IN_SECTION("init")
10 #define PAGE_LOCKED_FUNCTION PLACE_IN_SECTION("pagelk")
11 #define PAGE_UNLOCKED_FUNCTION PLACE_IN_SECTION("pagepo")
14 #define PAGE_LOCKED_FUNCTION
15 #define PAGE_UNLOCKED_FUNCTION
21 #define KeGetCurrentThread _KeGetCurrentThread
22 #define KeGetPreviousMode _KeGetPreviousMode
24 #undef PsGetCurrentProcess
25 #define PsGetCurrentProcess _PsGetCurrentProcess
28 // We are very lazy on ARM -- we just import intrinsics
29 // Question: Why wasn't this done for x86 too? (see fastintrlck.asm)
31 #define InterlockedDecrement _InterlockedDecrement
32 #define InterlockedDecrement16 _InterlockedDecrement16
33 #define InterlockedIncrement _InterlockedIncrement
34 #define InterlockedIncrement16 _InterlockedIncrement16
35 #define InterlockedCompareExchange _InterlockedCompareExchange
36 #define InterlockedCompareExchange16 _InterlockedCompareExchange16
37 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
38 #define InterlockedExchange _InterlockedExchange
39 #define InterlockedExchangeAdd _InterlockedExchangeAdd
40 #define InterlockedOr _InterlockedOr
41 #define InterlockedAnd _InterlockedAnd
45 #include "i386/v86m.h"
65 #include "../kdbg/kdb.h"
73 #include "arch/intrin_i.h"
76 * generic information class probing code
79 #define ICIF_QUERY 0x1
81 #define ICIF_QUERY_SIZE_VARIABLE 0x4
82 #define ICIF_SET_SIZE_VARIABLE 0x8
83 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
85 typedef struct _INFORMATION_CLASS_INFO
87 ULONG RequiredSizeQUERY
;
88 ULONG RequiredSizeSET
;
92 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
94 #define ICI_SQ_SAME(Type, Alignment, Flags) \
95 { Type, Type, Alignment, Alignment, Flags }
97 #define ICI_SQ(TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags) \
98 { TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags }
103 #define IQS_SAME(Type, Alignment, Flags) \
104 { sizeof(Type), sizeof(Type), sizeof(Alignment), sizeof(Alignment), Flags }
106 #define IQS(TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags) \
107 { sizeof(TypeQuery), sizeof(TypeSet), sizeof(AlignmentQuery), sizeof(AlignmentSet), Flags }
111 DefaultSetInfoBufferCheck(ULONG Class
,
112 const INFORMATION_CLASS_INFO
*ClassList
,
113 ULONG ClassListEntries
,
116 KPROCESSOR_MODE PreviousMode
)
118 NTSTATUS Status
= STATUS_SUCCESS
;
120 if (Class
< ClassListEntries
)
122 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
124 Status
= STATUS_INVALID_INFO_CLASS
;
126 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
127 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
129 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
131 Status
= STATUS_INFO_LENGTH_MISMATCH
;
135 if (NT_SUCCESS(Status
))
137 if (PreviousMode
!= KernelMode
)
143 ClassList
[Class
].AlignmentSET
);
147 Status
= _SEH_GetExceptionCode();
154 Status
= STATUS_INVALID_INFO_CLASS
;
161 DefaultQueryInfoBufferCheck(ULONG Class
,
162 const INFORMATION_CLASS_INFO
*ClassList
,
163 ULONG ClassListEntries
,
167 KPROCESSOR_MODE PreviousMode
)
169 NTSTATUS Status
= STATUS_SUCCESS
;
171 if (Class
< ClassListEntries
)
173 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
175 Status
= STATUS_INVALID_INFO_CLASS
;
177 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
178 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
180 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
182 Status
= STATUS_INFO_LENGTH_MISMATCH
;
186 if (NT_SUCCESS(Status
))
188 if (PreviousMode
!= KernelMode
)
194 ProbeForWrite(Buffer
,
196 ClassList
[Class
].AlignmentQUERY
);
199 if (ReturnLength
!= NULL
)
201 ProbeForWriteUlong(ReturnLength
);
206 Status
= _SEH_GetExceptionCode();
213 Status
= STATUS_INVALID_INFO_CLASS
;
219 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
222 #if defined(_X86_) || defined(_M_AMD64) || defined(_MIPS_) || defined(_PPC_) || defined(_ARM_)
224 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
225 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
227 #elif defined(_IA64_)
229 /* on Itanium if the 24 most significant bits are set, we're not dealing with
231 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
234 #error IsPointerOffset() needs to be defined for this architecture
239 C_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA
, SystemCall
) == 0x300);
240 C_ASSERT(FIELD_OFFSET(KTHREAD
, InitialStack
) == KTHREAD_INITIAL_STACK
);
241 C_ASSERT(FIELD_OFFSET(KTHREAD
, Teb
) == KTHREAD_TEB
);
242 C_ASSERT(FIELD_OFFSET(KTHREAD
, KernelStack
) == KTHREAD_KERNEL_STACK
);
243 C_ASSERT(FIELD_OFFSET(KTHREAD
, NpxState
) == KTHREAD_NPX_STATE
);
244 C_ASSERT(FIELD_OFFSET(KTHREAD
, ServiceTable
) == KTHREAD_SERVICE_TABLE
);
245 C_ASSERT(FIELD_OFFSET(KTHREAD
, PreviousMode
) == KTHREAD_PREVIOUS_MODE
);
246 C_ASSERT(FIELD_OFFSET(KTHREAD
, TrapFrame
) == KTHREAD_TRAP_FRAME
);
247 C_ASSERT(FIELD_OFFSET(KTHREAD
, CallbackStack
) == KTHREAD_CALLBACK_STACK
);
248 C_ASSERT(FIELD_OFFSET(KTHREAD
, ApcState
.Process
) == KTHREAD_APCSTATE_PROCESS
);
249 C_ASSERT(FIELD_OFFSET(KPROCESS
, DirectoryTableBase
) == KPROCESS_DIRECTORY_TABLE_BASE
);
250 C_ASSERT(FIELD_OFFSET(KPCR
, Tib
.ExceptionList
) == KPCR_EXCEPTION_LIST
);
251 C_ASSERT(FIELD_OFFSET(KPCR
, Self
) == KPCR_SELF
);
253 C_ASSERT(FIELD_OFFSET(KPCR
, IRR
) == KPCR_IRR
);
254 C_ASSERT(FIELD_OFFSET(KPCR
, IDR
) == KPCR_IDR
);
255 C_ASSERT(FIELD_OFFSET(KPCR
, Irql
) == KPCR_IRQL
);
256 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, CurrentThread
) == KPCR_CURRENT_THREAD
);
257 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, NextThread
) == KPCR_PRCB_NEXT_THREAD
);
258 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, NpxThread
) == KPCR_NPX_THREAD
);
259 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) == KPCR_PRCB_DATA
);
260 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, KeSystemCalls
) == KPCR_SYSTEM_CALLS
);
261 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcData
) + FIELD_OFFSET(KDPC_DATA
, DpcQueueDepth
) == KPCR_PRCB_DPC_QUEUE_DEPTH
);
262 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcData
) + 16 == KPCR_PRCB_DPC_COUNT
);
263 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcStack
) == KPCR_PRCB_DPC_STACK
);
264 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, TimerRequest
) == KPCR_PRCB_TIMER_REQUEST
);
265 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, MaximumDpcQueueDepth
) == KPCR_PRCB_MAXIMUM_DPC_QUEUE_DEPTH
);
266 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcRequestRate
) == KPCR_PRCB_DPC_REQUEST_RATE
);
267 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcInterruptRequested
) == KPCR_PRCB_DPC_INTERRUPT_REQUESTED
);
268 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcRoutineActive
) == KPCR_PRCB_DPC_ROUTINE_ACTIVE
);
269 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcLastCount
) == KPCR_PRCB_DPC_LAST_COUNT
);
270 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, TimerRequest
) == KPCR_PRCB_TIMER_REQUEST
);
271 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, QuantumEnd
) == KPCR_PRCB_QUANTUM_END
);
272 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DeferredReadyListHead
) == KPCR_PRCB_DEFERRED_READY_LIST_HEAD
);
273 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, PowerState
) == KPCR_PRCB_POWER_STATE_IDLE_FUNCTION
);
274 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, PrcbLock
) == KPCR_PRCB_PRCB_LOCK
);
275 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcStack
) == KPCR_PRCB_DPC_STACK
);
276 C_ASSERT(sizeof(FX_SAVE_AREA
) == SIZEOF_FX_SAVE_AREA
);
278 /* Platform specific checks */
279 C_ASSERT(FIELD_OFFSET(KPROCESS
, IopmOffset
) == KPROCESS_IOPM_OFFSET
);
280 C_ASSERT(FIELD_OFFSET(KPROCESS
, LdtDescriptor
) == KPROCESS_LDT_DESCRIPTOR0
);
281 C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME
, SavedExceptionStack
) == TF_SAVED_EXCEPTION_STACK
);
282 C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME
, regs
) == TF_REGS
);
283 C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME
, orig_ebp
) == TF_ORIG_EBP
);
284 C_ASSERT(FIELD_OFFSET(KTSS
, Esp0
) == KTSS_ESP0
);
285 C_ASSERT(FIELD_OFFSET(KTSS
, IoMapBase
) == KTSS_IOMAPBASE
);
288 #endif /* INCLUDE_INTERNAL_NTOSKRNL_H */