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 */
137 Dest
->MaximumLength
= 0;
143 /* sanitize structure */
145 Dest
->MaximumLength
= 0;
150 Status
= _SEH_GetExceptionCode();
156 /* Just copy the UNICODE_STRING structure, don't allocate new memory!
157 We trust the caller to supply valid pointers and data. */
168 ReleaseCapturedUnicodeString(IN PUNICODE_STRING CapturedString
,
169 IN KPROCESSOR_MODE CurrentMode
)
171 if(CurrentMode
!= KernelMode
&& CapturedString
->Buffer
!= NULL
)
173 ExFreePool(CapturedString
->Buffer
);
178 * NOTE: Alignment of the pointers is not verified!
180 #define ProbeForWriteGenericType(Ptr, Type) \
182 if ((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) || \
183 (ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) { \
184 RtlRaiseStatus (STATUS_ACCESS_VIOLATION); \
186 *(volatile Type *)(Ptr) = *(volatile Type *)(Ptr); \
189 #define ProbeForWriteBoolean(Ptr) ProbeForWriteGenericType(Ptr, BOOLEAN)
190 #define ProbeForWriteUchar(Ptr) ProbeForWriteGenericType(Ptr, UCHAR)
191 #define ProbeForWriteChar(Ptr) ProbeForWriteGenericType(Ptr, Char)
192 #define ProbeForWriteUshort(Ptr) ProbeForWriteGenericType(Ptr, USHORT)
193 #define ProbeForWriteShort(Ptr) ProbeForWriteGenericType(Ptr, SHORT)
194 #define ProbeForWriteUlong(Ptr) ProbeForWriteGenericType(Ptr, ULONG)
195 #define ProbeForWriteLong(Ptr) ProbeForWriteGenericType(Ptr, LONG)
196 #define ProbeForWriteUint(Ptr) ProbeForWriteGenericType(Ptr, UINT)
197 #define ProbeForWriteInt(Ptr) ProbeForWriteGenericType(Ptr, INT)
198 #define ProbeForWriteUlonglong(Ptr) ProbeForWriteGenericType(Ptr, ULONGLONG)
199 #define ProbeForWriteLonglong(Ptr) ProbeForWriteGenericType(Ptr, LONGLONG)
200 #define ProbeForWriteLonglong(Ptr) ProbeForWriteGenericType(Ptr, LONGLONG)
201 #define ProbeForWritePointer(Ptr) ProbeForWriteGenericType(Ptr, PVOID)
202 #define ProbeForWriteHandle(Ptr) ProbeForWriteGenericType(Ptr, HANDLE)
203 #define ProbeForWriteLangid(Ptr) ProbeForWriteGenericType(Ptr, LANGID)
204 #define ProbeForWriteLargeInteger(Ptr) ProbeForWriteGenericType(&(Ptr)->QuadPart, LONGLONG)
205 #define ProbeForWriteUlargeInteger(Ptr) ProbeForWriteGenericType(&(Ptr)->QuadPart, ULONGLONG)
207 #define ProbeForReadGenericType(Ptr, Type, Default) \
208 (((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) || \
209 (ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) ? \
210 ExRaiseStatus (STATUS_ACCESS_VIOLATION), Default : \
211 *(volatile Type *)(Ptr))
213 #define ProbeForReadBoolean(Ptr) ProbeForReadGenericType(Ptr, BOOLEAN, FALSE)
214 #define ProbeForReadUchar(Ptr) ProbeForReadGenericType(Ptr, UCHAR, 0)
215 #define ProbeForReadChar(Ptr) ProbeForReadGenericType(Ptr, CHAR, 0)
216 #define ProbeForReadUshort(Ptr) ProbeForReadGenericType(Ptr, USHORT, 0)
217 #define ProbeForReadShort(Ptr) ProbeForReadGenericType(Ptr, SHORT, 0)
218 #define ProbeForReadUlong(Ptr) ProbeForReadGenericType(Ptr, ULONG, 0)
219 #define ProbeForReadLong(Ptr) ProbeForReadGenericType(Ptr, LONG, 0)
220 #define ProbeForReadUint(Ptr) ProbeForReadGenericType(Ptr, UINT, 0)
221 #define ProbeForReadInt(Ptr) ProbeForReadGenericType(Ptr, INT, 0)
222 #define ProbeForReadUlonglong(Ptr) ProbeForReadGenericType(Ptr, ULONGLONG, 0)
223 #define ProbeForReadLonglong(Ptr) ProbeForReadGenericType(Ptr, LONGLONG, 0)
224 #define ProbeForReadPointer(Ptr) ProbeForReadGenericType(Ptr, PVOID, NULL)
225 #define ProbeForReadHandle(Ptr) ProbeForReadGenericType(Ptr, HANDLE, NULL)
226 #define ProbeForReadLangid(Ptr) ProbeForReadGenericType(Ptr, LANGID, 0)
227 #define ProbeForReadLargeInteger(Ptr) ((LARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, LONGLONG, 0))
228 #define ProbeForReadUlargeInteger(Ptr) ((ULARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, ULONGLONG, 0))
231 * generic information class probing code
234 #define ICIF_QUERY 0x1
236 #define ICIF_QUERY_SIZE_VARIABLE 0x4
237 #define ICIF_SET_SIZE_VARIABLE 0x8
238 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
240 typedef struct _INFORMATION_CLASS_INFO
242 ULONG RequiredSizeQUERY
;
243 ULONG RequiredSizeSET
;
245 ULONG AlignmentQUERY
;
247 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
249 #define ICI_SQ_SAME(Size, Alignment, Flags) \
250 { Size, Size, Alignment, Alignment, Flags }
252 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
253 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
255 static inline NTSTATUS
256 DefaultSetInfoBufferCheck(UINT Class
,
257 const INFORMATION_CLASS_INFO
*ClassList
,
258 UINT ClassListEntries
,
261 KPROCESSOR_MODE PreviousMode
)
263 NTSTATUS Status
= STATUS_SUCCESS
;
265 if (Class
>= 0 && Class
< ClassListEntries
)
267 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
269 Status
= STATUS_INVALID_INFO_CLASS
;
271 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
272 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
274 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
276 Status
= STATUS_INFO_LENGTH_MISMATCH
;
280 if (NT_SUCCESS(Status
))
282 if (PreviousMode
!= KernelMode
)
288 ClassList
[Class
].AlignmentSET
);
292 Status
= _SEH_GetExceptionCode();
299 Status
= STATUS_INVALID_INFO_CLASS
;
304 static inline NTSTATUS
305 DefaultQueryInfoBufferCheck(UINT Class
,
306 const INFORMATION_CLASS_INFO
*ClassList
,
307 UINT ClassListEntries
,
311 KPROCESSOR_MODE PreviousMode
)
313 NTSTATUS Status
= STATUS_SUCCESS
;
315 if (Class
>= 0 && Class
< ClassListEntries
)
317 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
319 Status
= STATUS_INVALID_INFO_CLASS
;
321 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
322 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
324 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
326 Status
= STATUS_INFO_LENGTH_MISMATCH
;
330 if (NT_SUCCESS(Status
))
332 if (PreviousMode
!= KernelMode
)
338 ProbeForWrite(Buffer
,
340 ClassList
[Class
].AlignmentQUERY
);
343 if (ReturnLength
!= NULL
)
345 ProbeForWriteUlong(ReturnLength
);
350 Status
= _SEH_GetExceptionCode();
357 Status
= STATUS_INVALID_INFO_CLASS
;
363 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
366 #if defined(_X86_) || defined(_M_AMD64)
368 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
369 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
371 #elif defined(_IA64_)
373 /* on Itanium if the 24 most significant bits are set, we're not dealing with
375 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
378 #error IsPointerOffset() needs to be defined for this architecture
385 #define MM_STACK_SIZE (3*4096)
387 #endif /* INCLUDE_INTERNAL_NTOSKRNL_H */