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")
31 #include "../kdbg/kdb.h"
40 * Defines a descriptor as it appears in the processor tables
42 typedef struct __DESCRIPTOR
46 } IDT_DESCRIPTOR
, GDT_DESCRIPTOR
;
50 extern IDT_DESCRIPTOR KiIdt
[256];
51 //extern GDT_DESCRIPTOR KiGdt[256];
54 * Initalization functions (called once by main())
56 VOID
MmInitSystem(ULONG Phase
, PLOADER_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
, PLOADER_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
,
106 * generic information class probing code
109 #define ICIF_QUERY 0x1
111 #define ICIF_QUERY_SIZE_VARIABLE 0x4
112 #define ICIF_SET_SIZE_VARIABLE 0x8
113 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
115 typedef struct _INFORMATION_CLASS_INFO
117 ULONG RequiredSizeQUERY
;
118 ULONG RequiredSizeSET
;
120 ULONG AlignmentQUERY
;
122 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
124 #define ICI_SQ_SAME(Size, Alignment, Flags) \
125 { Size, Size, Alignment, Alignment, Flags }
127 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
128 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
130 static __inline NTSTATUS
131 DefaultSetInfoBufferCheck(UINT Class
,
132 const INFORMATION_CLASS_INFO
*ClassList
,
133 UINT ClassListEntries
,
136 KPROCESSOR_MODE PreviousMode
)
138 NTSTATUS Status
= STATUS_SUCCESS
;
140 if (Class
>= 0 && Class
< ClassListEntries
)
142 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
144 Status
= STATUS_INVALID_INFO_CLASS
;
146 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
147 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
149 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
151 Status
= STATUS_INFO_LENGTH_MISMATCH
;
155 if (NT_SUCCESS(Status
))
157 if (PreviousMode
!= KernelMode
)
163 ClassList
[Class
].AlignmentSET
);
167 Status
= _SEH_GetExceptionCode();
174 Status
= STATUS_INVALID_INFO_CLASS
;
179 static __inline NTSTATUS
180 DefaultQueryInfoBufferCheck(UINT Class
,
181 const INFORMATION_CLASS_INFO
*ClassList
,
182 UINT ClassListEntries
,
186 KPROCESSOR_MODE PreviousMode
)
188 NTSTATUS Status
= STATUS_SUCCESS
;
190 if (Class
>= 0 && Class
< ClassListEntries
)
192 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
194 Status
= STATUS_INVALID_INFO_CLASS
;
196 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
197 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
199 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
201 Status
= STATUS_INFO_LENGTH_MISMATCH
;
205 if (NT_SUCCESS(Status
))
207 if (PreviousMode
!= KernelMode
)
213 ProbeForWrite(Buffer
,
215 ClassList
[Class
].AlignmentQUERY
);
218 if (ReturnLength
!= NULL
)
220 ProbeForWriteUlong(ReturnLength
);
225 Status
= _SEH_GetExceptionCode();
232 Status
= STATUS_INVALID_INFO_CLASS
;
238 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
241 #if defined(_X86_) || defined(_M_AMD64)
243 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
244 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
246 #elif defined(_IA64_)
248 /* on Itanium if the 24 most significant bits are set, we're not dealing with
250 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
253 #error IsPointerOffset() needs to be defined for this architecture
260 #define MM_STACK_SIZE (3*4096)
262 #endif /* INCLUDE_INTERNAL_NTOSKRNL_H */