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 #define ExRaiseStatus RtlRaiseStatus
87 * Inlined Probing Macros
92 ProbeAndCaptureUnicodeString(OUT PUNICODE_STRING Dest
,
93 IN KPROCESSOR_MODE CurrentMode
,
94 IN PUNICODE_STRING UnsafeSrc
)
96 NTSTATUS Status
= STATUS_SUCCESS
;
100 /* Probe the structure and buffer*/
101 if(CurrentMode
!= KernelMode
)
105 ProbeForRead(UnsafeSrc
,
106 sizeof(UNICODE_STRING
),
109 if(Dest
->Buffer
!= NULL
)
111 if (Dest
->Length
!= 0)
113 ProbeForRead(Dest
->Buffer
,
117 /* Allocate space for the buffer */
118 Buffer
= ExAllocatePoolWithTag(PagedPool
,
119 Dest
->Length
+ sizeof(WCHAR
),
120 TAG('U', 'S', 'T', 'R'));
123 Status
= STATUS_INSUFFICIENT_RESOURCES
;
128 RtlCopyMemory(Buffer
, Dest
->Buffer
, Dest
->Length
);
129 Buffer
[Dest
->Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
131 /* Set it as the buffer */
132 Dest
->Buffer
= Buffer
;
136 /* sanitize structure */
138 Dest
->MaximumLength
= 0;
144 /* sanitize structure */
146 Dest
->MaximumLength
= 0;
151 Status
= _SEH_GetExceptionCode();
157 /* Just copy the UNICODE_STRING structure, don't allocate new memory!
158 We trust the caller to supply valid pointers and data. */
169 ReleaseCapturedUnicodeString(IN PUNICODE_STRING CapturedString
,
170 IN KPROCESSOR_MODE CurrentMode
)
172 if(CurrentMode
!= KernelMode
&& CapturedString
->Buffer
!= NULL
)
174 ExFreePool(CapturedString
->Buffer
);
179 * NOTE: Alignment of the pointers is not verified!
181 #define ProbeForWriteGenericType(Ptr, Type) \
183 if ((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) || \
184 (ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) { \
185 RtlRaiseStatus (STATUS_ACCESS_VIOLATION); \
187 *(volatile Type *)(Ptr) = *(volatile Type *)(Ptr); \
190 #define ProbeForWriteBoolean(Ptr) ProbeForWriteGenericType(Ptr, BOOLEAN)
191 #define ProbeForWriteUchar(Ptr) ProbeForWriteGenericType(Ptr, UCHAR)
192 #define ProbeForWriteChar(Ptr) ProbeForWriteGenericType(Ptr, Char)
193 #define ProbeForWriteUshort(Ptr) ProbeForWriteGenericType(Ptr, USHORT)
194 #define ProbeForWriteShort(Ptr) ProbeForWriteGenericType(Ptr, SHORT)
195 #define ProbeForWriteUlong(Ptr) ProbeForWriteGenericType(Ptr, ULONG)
196 #define ProbeForWriteLong(Ptr) ProbeForWriteGenericType(Ptr, LONG)
197 #define ProbeForWriteUint(Ptr) ProbeForWriteGenericType(Ptr, UINT)
198 #define ProbeForWriteInt(Ptr) ProbeForWriteGenericType(Ptr, INT)
199 #define ProbeForWriteUlonglong(Ptr) ProbeForWriteGenericType(Ptr, ULONGLONG)
200 #define ProbeForWriteLonglong(Ptr) ProbeForWriteGenericType(Ptr, LONGLONG)
201 #define ProbeForWriteLonglong(Ptr) ProbeForWriteGenericType(Ptr, LONGLONG)
202 #define ProbeForWritePointer(Ptr) ProbeForWriteGenericType(Ptr, PVOID)
203 #define ProbeForWriteHandle(Ptr) ProbeForWriteGenericType(Ptr, HANDLE)
204 #define ProbeForWriteLangid(Ptr) ProbeForWriteGenericType(Ptr, LANGID)
205 #define ProbeForWriteLargeInteger(Ptr) ProbeForWriteGenericType(&(Ptr)->QuadPart, LONGLONG)
206 #define ProbeForWriteUlargeInteger(Ptr) ProbeForWriteGenericType(&(Ptr)->QuadPart, ULONGLONG)
208 #define ProbeForReadGenericType(Ptr, Type, Default) \
209 (((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) || \
210 (ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) ? \
211 ExRaiseStatus (STATUS_ACCESS_VIOLATION), Default : \
214 #define ProbeForReadBoolean(Ptr) ProbeForReadGenericType(Ptr, BOOLEAN, FALSE)
215 #define ProbeForReadUchar(Ptr) ProbeForReadGenericType(Ptr, UCHAR, 0)
216 #define ProbeForReadChar(Ptr) ProbeForReadGenericType(Ptr, CHAR, 0)
217 #define ProbeForReadUshort(Ptr) ProbeForReadGenericType(Ptr, USHORT, 0)
218 #define ProbeForReadShort(Ptr) ProbeForReadGenericType(Ptr, SHORT, 0)
219 #define ProbeForReadUlong(Ptr) ProbeForReadGenericType(Ptr, ULONG, 0)
220 #define ProbeForReadLong(Ptr) ProbeForReadGenericType(Ptr, LONG, 0)
221 #define ProbeForReadUint(Ptr) ProbeForReadGenericType(Ptr, UINT, 0)
222 #define ProbeForReadInt(Ptr) ProbeForReadGenericType(Ptr, INT, 0)
223 #define ProbeForReadUlonglong(Ptr) ProbeForReadGenericType(Ptr, ULONGLONG, 0)
224 #define ProbeForReadLonglong(Ptr) ProbeForReadGenericType(Ptr, LONGLONG, 0)
225 #define ProbeForReadPointer(Ptr) ProbeForReadGenericType(Ptr, PVOID, NULL)
226 #define ProbeForReadHandle(Ptr) ProbeForReadGenericType(Ptr, HANDLE, NULL)
227 #define ProbeForReadLangid(Ptr) ProbeForReadGenericType(Ptr, LANGID, 0)
228 #define ProbeForReadLargeInteger(Ptr) ((LARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, LONGLONG, 0))
229 #define ProbeForReadUlargeInteger(Ptr) ((ULARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, ULONGLONG, 0))
232 * generic information class probing code
235 #define ICIF_QUERY 0x1
237 #define ICIF_QUERY_SIZE_VARIABLE 0x4
238 #define ICIF_SET_SIZE_VARIABLE 0x8
239 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
241 typedef struct _INFORMATION_CLASS_INFO
243 ULONG RequiredSizeQUERY
;
244 ULONG RequiredSizeSET
;
246 ULONG AlignmentQUERY
;
248 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
250 #define ICI_SQ_SAME(Size, Alignment, Flags) \
251 { Size, Size, Alignment, Alignment, Flags }
253 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
254 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
256 static inline NTSTATUS
257 DefaultSetInfoBufferCheck(UINT Class
,
258 const INFORMATION_CLASS_INFO
*ClassList
,
259 UINT ClassListEntries
,
262 KPROCESSOR_MODE PreviousMode
)
264 NTSTATUS Status
= STATUS_SUCCESS
;
266 if (Class
>= 0 && Class
< ClassListEntries
)
268 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
270 Status
= STATUS_INVALID_INFO_CLASS
;
272 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
273 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
275 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
277 Status
= STATUS_INFO_LENGTH_MISMATCH
;
281 if (NT_SUCCESS(Status
))
283 if (PreviousMode
!= KernelMode
)
289 ClassList
[Class
].AlignmentSET
);
293 Status
= _SEH_GetExceptionCode();
300 Status
= STATUS_INVALID_INFO_CLASS
;
305 static inline NTSTATUS
306 DefaultQueryInfoBufferCheck(UINT Class
,
307 const INFORMATION_CLASS_INFO
*ClassList
,
308 UINT ClassListEntries
,
312 KPROCESSOR_MODE PreviousMode
)
314 NTSTATUS Status
= STATUS_SUCCESS
;
316 if (Class
>= 0 && Class
< ClassListEntries
)
318 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
320 Status
= STATUS_INVALID_INFO_CLASS
;
322 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
323 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
325 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
327 Status
= STATUS_INFO_LENGTH_MISMATCH
;
331 if (NT_SUCCESS(Status
))
333 if (PreviousMode
!= KernelMode
)
339 ProbeForWrite(Buffer
,
341 ClassList
[Class
].AlignmentQUERY
);
344 if (ReturnLength
!= NULL
)
346 ProbeForWriteUlong(ReturnLength
);
351 Status
= _SEH_GetExceptionCode();
358 Status
= STATUS_INVALID_INFO_CLASS
;
364 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
367 #if defined(_X86_) || defined(_M_AMD64)
369 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
370 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
372 #elif defined(_IA64_)
374 /* on Itanium if the 24 most significant bits are set, we're not dealing with
376 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
379 #error IsPointerOffset() needs to be defined for this architecture
386 #define MM_STACK_SIZE (3*4096)
388 #endif /* INCLUDE_INTERNAL_NTOSKRNL_H */