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)))
8 #define INIT_FUNCTION PLACE_IN_SECTION("init")
9 #define PAGE_LOCKED_FUNCTION PLACE_IN_SECTION("pagelk")
10 #define PAGE_UNLOCKED_FUNCTION PLACE_IN_SECTION("pagepo")
17 #include "i386/v86m.h"
32 #include "../kdbg/kdb.h"
42 * Defines a descriptor as it appears in the processor tables
44 typedef struct __DESCRIPTOR
48 } IDT_DESCRIPTOR
, GDT_DESCRIPTOR
;
51 //extern GDT_DESCRIPTOR KiGdt[256];
54 * Initalization functions (called once by main())
56 VOID
MmInitSystem(ULONG Phase
, PROS_LOADER_PARAMETER_BLOCK LoaderBlock
, ULONG LastKernelAddress
);
58 VOID
IoInit2(BOOLEAN BootLog
);
59 VOID STDCALL
IoInit3(VOID
);
62 VOID
CmInitializeRegistry(VOID
);
63 VOID STDCALL
CmInitHives(BOOLEAN SetupBoot
);
64 VOID
CmInit2(PCHAR CommandLine
);
65 VOID
CmShutdownRegistry(VOID
);
66 BOOLEAN
CmImportSystemHive(PCHAR ChunkBase
, ULONG ChunkSize
);
67 BOOLEAN
CmImportHardwareHive(PCHAR ChunkBase
, ULONG ChunkSize
);
68 VOID
KdInitSystem(ULONG Reserved
, PROS_LOADER_PARAMETER_BLOCK LoaderBlock
);
70 /* FIXME - RtlpCreateUnicodeString is obsolete and should be removed ASAP! */
72 RtlpCreateUnicodeString(
73 IN OUT PUNICODE_STRING UniDest
,
75 IN POOL_TYPE PoolType
);
79 RtlpLogException(IN PEXCEPTION_RECORD ExceptionRecord
,
80 IN PCONTEXT ContextRecord
,
84 /* FIXME: Interlocked functions that need to be made into a public header */
87 InterlockedAnd(IN OUT LONG
volatile *Target
,
96 j
= InterlockedCompareExchange((PLONG
)Target
,
107 InterlockedOr(IN OUT LONG
volatile *Target
,
116 j
= InterlockedCompareExchange((PLONG
)Target
,
126 * generic information class probing code
129 #define ICIF_QUERY 0x1
131 #define ICIF_QUERY_SIZE_VARIABLE 0x4
132 #define ICIF_SET_SIZE_VARIABLE 0x8
133 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
135 typedef struct _INFORMATION_CLASS_INFO
137 ULONG RequiredSizeQUERY
;
138 ULONG RequiredSizeSET
;
140 ULONG AlignmentQUERY
;
142 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
144 #define ICI_SQ_SAME(Type, Alignment, Flags) \
145 { Type, Type, Alignment, Alignment, Flags }
147 #define ICI_SQ(TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags) \
148 { TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags }
153 #define IQS_SAME(Type, Alignment, Flags) \
154 { sizeof(Type), sizeof(Type), sizeof(Alignment), sizeof(Alignment), Flags }
156 #define IQS(TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags) \
157 { sizeof(TypeQuery), sizeof(TypeSet), sizeof(AlignmentQuery), sizeof(AlignmentSet), Flags }
159 static __inline NTSTATUS
160 DefaultSetInfoBufferCheck(UINT Class
,
161 const INFORMATION_CLASS_INFO
*ClassList
,
162 UINT ClassListEntries
,
165 KPROCESSOR_MODE PreviousMode
)
167 NTSTATUS Status
= STATUS_SUCCESS
;
169 if (Class
>= 0 && Class
< ClassListEntries
)
171 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
173 Status
= STATUS_INVALID_INFO_CLASS
;
175 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
176 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
178 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
180 Status
= STATUS_INFO_LENGTH_MISMATCH
;
184 if (NT_SUCCESS(Status
))
186 if (PreviousMode
!= KernelMode
)
192 ClassList
[Class
].AlignmentSET
);
196 Status
= _SEH_GetExceptionCode();
203 Status
= STATUS_INVALID_INFO_CLASS
;
208 static __inline NTSTATUS
209 DefaultQueryInfoBufferCheck(UINT Class
,
210 const INFORMATION_CLASS_INFO
*ClassList
,
211 UINT ClassListEntries
,
215 KPROCESSOR_MODE PreviousMode
)
217 NTSTATUS Status
= STATUS_SUCCESS
;
219 if (Class
>= 0 && Class
< ClassListEntries
)
221 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
223 Status
= STATUS_INVALID_INFO_CLASS
;
225 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
226 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
228 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
230 Status
= STATUS_INFO_LENGTH_MISMATCH
;
234 if (NT_SUCCESS(Status
))
236 if (PreviousMode
!= KernelMode
)
242 ProbeForWrite(Buffer
,
244 ClassList
[Class
].AlignmentQUERY
);
247 if (ReturnLength
!= NULL
)
249 ProbeForWriteUlong(ReturnLength
);
254 Status
= _SEH_GetExceptionCode();
261 Status
= STATUS_INVALID_INFO_CLASS
;
267 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
270 #if defined(_X86_) || defined(_M_AMD64)
272 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
273 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
275 #elif defined(_IA64_)
277 /* on Itanium if the 24 most significant bits are set, we're not dealing with
279 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
282 #error IsPointerOffset() needs to be defined for this architecture
287 #endif /* INCLUDE_INTERNAL_NTOSKRNL_H */