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
24 #include "i386/v86m.h"
26 #ifndef InterlockedExchangeAddSizeT
27 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
28 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
29 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
31 #include "powerpc/mm.h"
49 #include "../kdbg/kdb.h"
59 * Defines a descriptor as it appears in the processor tables
61 typedef struct __DESCRIPTOR
65 } IDT_DESCRIPTOR
, GDT_DESCRIPTOR
;
68 //extern GDT_DESCRIPTOR KiGdt[256];
71 * Initalization functions (called once by main())
73 VOID
MmInitSystem(ULONG Phase
, PLOADER_PARAMETER_BLOCK LoaderBlock
, ULONG LastKernelAddress
);
75 VOID
IoInit2(BOOLEAN BootLog
);
76 VOID NTAPI
IoInit3(VOID
);
77 BOOLEAN NTAPI
ObInit(VOID
);
78 VOID
CmInitializeRegistry(VOID
);
79 VOID NTAPI
CmInitHives(BOOLEAN SetupBoot
);
80 VOID
CmInit2(PCHAR CommandLine
);
81 VOID
CmShutdownRegistry(VOID
);
82 BOOLEAN
CmImportSystemHive(PCHAR ChunkBase
, ULONG ChunkSize
);
83 BOOLEAN
CmImportHardwareHive(PCHAR ChunkBase
, ULONG ChunkSize
);
84 VOID
KdInitSystem(ULONG Reserved
, PLOADER_PARAMETER_BLOCK LoaderBlock
);
86 /* FIXME - RtlpCreateUnicodeString is obsolete and should be removed ASAP! */
88 RtlpCreateUnicodeString(
89 IN OUT PUNICODE_STRING UniDest
,
91 IN POOL_TYPE PoolType
);
95 RtlpLogException(IN PEXCEPTION_RECORD ExceptionRecord
,
96 IN PCONTEXT ContextRecord
,
100 /* FIXME: Interlocked functions that need to be made into a public header */
104 InterlockedAnd(IN OUT LONG
volatile *Target
,
113 j
= InterlockedCompareExchange((PLONG
)Target
,
124 InterlockedOr(IN OUT LONG
volatile *Target
,
133 j
= InterlockedCompareExchange((PLONG
)Target
,
144 * generic information class probing code
147 #define ICIF_QUERY 0x1
149 #define ICIF_QUERY_SIZE_VARIABLE 0x4
150 #define ICIF_SET_SIZE_VARIABLE 0x8
151 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
153 typedef struct _INFORMATION_CLASS_INFO
155 ULONG RequiredSizeQUERY
;
156 ULONG RequiredSizeSET
;
158 ULONG AlignmentQUERY
;
160 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
162 #define ICI_SQ_SAME(Type, Alignment, Flags) \
163 { Type, Type, Alignment, Alignment, Flags }
165 #define ICI_SQ(TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags) \
166 { TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags }
171 #define IQS_SAME(Type, Alignment, Flags) \
172 { sizeof(Type), sizeof(Type), sizeof(Alignment), sizeof(Alignment), Flags }
174 #define IQS(TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags) \
175 { sizeof(TypeQuery), sizeof(TypeSet), sizeof(AlignmentQuery), sizeof(AlignmentSet), Flags }
179 DefaultSetInfoBufferCheck(ULONG Class
,
180 const INFORMATION_CLASS_INFO
*ClassList
,
181 ULONG ClassListEntries
,
184 KPROCESSOR_MODE PreviousMode
)
186 NTSTATUS Status
= STATUS_SUCCESS
;
188 if (Class
>= 0 && Class
< ClassListEntries
)
190 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
192 Status
= STATUS_INVALID_INFO_CLASS
;
194 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
195 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
197 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
199 Status
= STATUS_INFO_LENGTH_MISMATCH
;
203 if (NT_SUCCESS(Status
))
205 if (PreviousMode
!= KernelMode
)
211 ClassList
[Class
].AlignmentSET
);
215 Status
= _SEH_GetExceptionCode();
222 Status
= STATUS_INVALID_INFO_CLASS
;
229 DefaultQueryInfoBufferCheck(ULONG Class
,
230 const INFORMATION_CLASS_INFO
*ClassList
,
231 ULONG ClassListEntries
,
235 KPROCESSOR_MODE PreviousMode
)
237 NTSTATUS Status
= STATUS_SUCCESS
;
239 if (Class
>= 0 && Class
< ClassListEntries
)
241 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
243 Status
= STATUS_INVALID_INFO_CLASS
;
245 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
246 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
248 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
250 Status
= STATUS_INFO_LENGTH_MISMATCH
;
254 if (NT_SUCCESS(Status
))
256 if (PreviousMode
!= KernelMode
)
262 ProbeForWrite(Buffer
,
264 ClassList
[Class
].AlignmentQUERY
);
267 if (ReturnLength
!= NULL
)
269 ProbeForWriteUlong(ReturnLength
);
274 Status
= _SEH_GetExceptionCode();
281 Status
= STATUS_INVALID_INFO_CLASS
;
287 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
290 #if defined(_X86_) || defined(_M_AMD64)
292 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
293 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
295 #elif defined(_IA64_)
297 /* on Itanium if the 24 most significant bits are set, we're not dealing with
299 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
301 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
303 #error IsPointerOffset() needs to be defined for this architecture
308 C_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA
, SystemCall
) == 0x300);
309 C_ASSERT(FIELD_OFFSET(KTHREAD
, InitialStack
) == KTHREAD_INITIAL_STACK
);
310 C_ASSERT(FIELD_OFFSET(KTHREAD
, Teb
) == KTHREAD_TEB
);
311 C_ASSERT(FIELD_OFFSET(KTHREAD
, KernelStack
) == KTHREAD_KERNEL_STACK
);
312 C_ASSERT(FIELD_OFFSET(KTHREAD
, NpxState
) == KTHREAD_NPX_STATE
);
313 C_ASSERT(FIELD_OFFSET(KTHREAD
, ServiceTable
) == KTHREAD_SERVICE_TABLE
);
314 C_ASSERT(FIELD_OFFSET(KTHREAD
, PreviousMode
) == KTHREAD_PREVIOUS_MODE
);
315 C_ASSERT(FIELD_OFFSET(KTHREAD
, TrapFrame
) == KTHREAD_TRAP_FRAME
);
316 C_ASSERT(FIELD_OFFSET(KTHREAD
, CallbackStack
) == KTHREAD_CALLBACK_STACK
);
317 C_ASSERT(FIELD_OFFSET(KTHREAD
, ApcState
.Process
) == KTHREAD_APCSTATE_PROCESS
);
318 C_ASSERT(FIELD_OFFSET(KPROCESS
, DirectoryTableBase
) == KPROCESS_DIRECTORY_TABLE_BASE
);
320 C_ASSERT(FIELD_OFFSET(KPROCESS
, IopmOffset
) == KPROCESS_IOPM_OFFSET
);
321 C_ASSERT(FIELD_OFFSET(KPROCESS
, LdtDescriptor
) == KPROCESS_LDT_DESCRIPTOR0
);
322 C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME
, SavedExceptionStack
) == TF_SAVED_EXCEPTION_STACK
);
323 C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME
, regs
) == TF_REGS
);
324 C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME
, orig_ebp
) == TF_ORIG_EBP
);
326 //C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
327 //C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
328 C_ASSERT(FIELD_OFFSET(KPCR
, IRR
) == KPCR_IRR
);
329 C_ASSERT(FIELD_OFFSET(KPCR
, IDR
) == KPCR_IDR
);
330 C_ASSERT(FIELD_OFFSET(KPCR
, Irql
) == KPCR_IRQL
);
332 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, CurrentThread
) == KPCR_CURRENT_THREAD
);
333 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, NpxThread
) == KPCR_NPX_THREAD
);
334 C_ASSERT(FIELD_OFFSET(KTSS
, Esp0
) == KTSS_ESP0
);
335 C_ASSERT(FIELD_OFFSET(KTSS
, IoMapBase
) == KTSS_IOMAPBASE
);
336 C_ASSERT(FIELD_OFFSET(KIPCR
, PrcbData
) + FIELD_OFFSET(KPRCB
, DpcStack
) == KPCR_PRCB_DPC_STACK
);
337 C_ASSERT(sizeof(FX_SAVE_AREA
) == SIZEOF_FX_SAVE_AREA
);
341 #include <reactos/ppcboot.h>
342 #include <reactos/ppcdebug.h>
345 #endif /* INCLUDE_INTERNAL_NTOSKRNL_H */