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 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
),
111 ProbeForRead(Dest
->Buffer
,
118 Status
= _SEH_GetExceptionCode();
122 if (!NT_SUCCESS(Status
)) return Status
;
126 /* Just copy it directly */
130 /* Allocate space for the buffer */
131 Buffer
= ExAllocatePool(PagedPool
, Dest
->MaximumLength
);
136 RtlCopyMemory(Buffer
, Dest
->Buffer
, Dest
->MaximumLength
);
138 /* Set it as the buffer */
139 Dest
->Buffer
= Buffer
;
142 Status
= STATUS_INSUFFICIENT_RESOURCES
;
151 ReleaseCapturedUnicodeString(IN PUNICODE_STRING CapturedString
,
152 KPROCESSOR_MODE CurrentMode
)
154 if(CurrentMode
!= KernelMode
) ExFreePool(CapturedString
->Buffer
);
158 * NOTE: Alignment of the pointers is not verified!
160 #define ProbeForWriteGenericType(Ptr, Type) \
162 if ((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) || \
163 (ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) { \
164 RtlRaiseStatus (STATUS_ACCESS_VIOLATION); \
166 *(volatile Type *)(Ptr) = *(volatile Type *)(Ptr); \
169 #define ProbeForWriteBoolean(Ptr) ProbeForWriteGenericType(Ptr, BOOLEAN)
170 #define ProbeForWriteUchar(Ptr) ProbeForWriteGenericType(Ptr, UCHAR)
171 #define ProbeForWriteChar(Ptr) ProbeForWriteGenericType(Ptr, Char)
172 #define ProbeForWriteUshort(Ptr) ProbeForWriteGenericType(Ptr, USHORT)
173 #define ProbeForWriteShort(Ptr) ProbeForWriteGenericType(Ptr, SHORT)
174 #define ProbeForWriteUlong(Ptr) ProbeForWriteGenericType(Ptr, ULONG)
175 #define ProbeForWriteLong(Ptr) ProbeForWriteGenericType(Ptr, LONG)
176 #define ProbeForWriteUint(Ptr) ProbeForWriteGenericType(Ptr, UINT)
177 #define ProbeForWriteInt(Ptr) ProbeForWriteGenericType(Ptr, INT)
178 #define ProbeForWriteUlonglong(Ptr) ProbeForWriteGenericType(Ptr, ULONGLONG)
179 #define ProbeForWriteLonglong(Ptr) ProbeForWriteGenericType(Ptr, LONGLONG)
180 #define ProbeForWriteLonglong(Ptr) ProbeForWriteGenericType(Ptr, LONGLONG)
181 #define ProbeForWritePointer(Ptr) ProbeForWriteGenericType(Ptr, PVOID)
182 #define ProbeForWriteHandle(Ptr) ProbeForWriteGenericType(Ptr, HANDLE)
183 #define ProbeForWriteLangid(Ptr) ProbeForWriteGenericType(Ptr, LANGID)
184 #define ProbeForWriteLargeInteger(Ptr) ProbeForWriteGenericType(&(Ptr)->QuadPart, LONGLONG)
185 #define ProbeForWriteUlargeInteger(Ptr) ProbeForWriteGenericType(&(Ptr)->QuadPart, ULONGLONG)
187 #define ProbeForReadGenericType(Ptr, Type, Default) \
188 (((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) || \
189 (ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) ? \
190 ExRaiseStatus (STATUS_ACCESS_VIOLATION), Default : \
193 #define ProbeForReadBoolean(Ptr) ProbeForReadGenericType(Ptr, BOOLEAN, FALSE)
194 #define ProbeForReadUchar(Ptr) ProbeForReadGenericType(Ptr, UCHAR, 0)
195 #define ProbeForReadChar(Ptr) ProbeForReadGenericType(Ptr, CHAR, 0)
196 #define ProbeForReadUshort(Ptr) ProbeForReadGenericType(Ptr, USHORT, 0)
197 #define ProbeForReadShort(Ptr) ProbeForReadGenericType(Ptr, SHORT, 0)
198 #define ProbeForReadUlong(Ptr) ProbeForReadGenericType(Ptr, ULONG, 0)
199 #define ProbeForReadLong(Ptr) ProbeForReadGenericType(Ptr, LONG, 0)
200 #define ProbeForReadUint(Ptr) ProbeForReadGenericType(Ptr, UINT, 0)
201 #define ProbeForReadInt(Ptr) ProbeForReadGenericType(Ptr, INT, 0)
202 #define ProbeForReadUlonglong(Ptr) ProbeForReadGenericType(Ptr, ULONGLONG, 0)
203 #define ProbeForReadLonglong(Ptr) ProbeForReadGenericType(Ptr, LONGLONG, 0)
204 #define ProbeForReadPointer(Ptr) ProbeForReadGenericType(Ptr, PVOID, NULL)
205 #define ProbeForReadHandle(Ptr) ProbeForReadGenericType(Ptr, HANDLE, NULL)
206 #define ProbeForReadLangid(Ptr) ProbeForReadGenericType(Ptr, LANGID, 0)
207 #define ProbeForReadLargeInteger(Ptr) ((LARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, LONGLONG, 0))
208 #define ProbeForReadUlargeInteger(Ptr) ((ULARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, ULONGLONG, 0))
211 * generic information class probing code
214 #define ICIF_QUERY 0x1
216 #define ICIF_QUERY_SIZE_VARIABLE 0x4
217 #define ICIF_SET_SIZE_VARIABLE 0x8
218 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
220 typedef struct _INFORMATION_CLASS_INFO
222 ULONG RequiredSizeQUERY
;
223 ULONG RequiredSizeSET
;
225 ULONG AlignmentQUERY
;
227 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
229 #define ICI_SQ_SAME(Size, Alignment, Flags) \
230 { Size, Size, Alignment, Alignment, Flags }
232 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
233 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
235 static inline NTSTATUS
236 DefaultSetInfoBufferCheck(UINT Class
,
237 const INFORMATION_CLASS_INFO
*ClassList
,
238 UINT ClassListEntries
,
241 KPROCESSOR_MODE PreviousMode
)
243 NTSTATUS Status
= STATUS_SUCCESS
;
245 if (Class
>= 0 && Class
< ClassListEntries
)
247 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
249 Status
= STATUS_INVALID_INFO_CLASS
;
251 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
252 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
254 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
256 Status
= STATUS_INFO_LENGTH_MISMATCH
;
260 if (NT_SUCCESS(Status
))
262 if (PreviousMode
!= KernelMode
)
268 ClassList
[Class
].AlignmentSET
);
272 Status
= _SEH_GetExceptionCode();
279 Status
= STATUS_INVALID_INFO_CLASS
;
284 static inline NTSTATUS
285 DefaultQueryInfoBufferCheck(UINT Class
,
286 const INFORMATION_CLASS_INFO
*ClassList
,
287 UINT ClassListEntries
,
291 KPROCESSOR_MODE PreviousMode
)
293 NTSTATUS Status
= STATUS_SUCCESS
;
295 if (Class
>= 0 && Class
< ClassListEntries
)
297 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
299 Status
= STATUS_INVALID_INFO_CLASS
;
301 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
302 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
304 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
306 Status
= STATUS_INFO_LENGTH_MISMATCH
;
310 if (NT_SUCCESS(Status
))
312 if (PreviousMode
!= KernelMode
)
318 ProbeForWrite(Buffer
,
320 ClassList
[Class
].AlignmentQUERY
);
323 if (ReturnLength
!= NULL
)
325 ProbeForWriteUlong(ReturnLength
);
330 Status
= _SEH_GetExceptionCode();
337 Status
= STATUS_INVALID_INFO_CLASS
;
343 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
346 #if defined(_X86_) || defined(_M_AMD64)
348 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
349 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
351 #elif defined(_IA64_)
353 /* on Itanium if the 24 most significant bits are set, we're not dealing with
355 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
358 #error IsPointerOffset() needs to be defined for this architecture
365 #define MM_STACK_SIZE (3*4096)
367 #endif /* INCLUDE_INTERNAL_NTOSKRNL_H */