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
86 static const UNICODE_STRING __emptyUnicodeString
= {0};
87 static const LARGE_INTEGER __emptyLargeInteger
= {{0, 0}};
88 static const ULARGE_INTEGER __emptyULargeInteger
= {{0, 0}};
91 * NOTE: Alignment of the pointers is not verified!
93 #define ProbeForWriteGenericType(Ptr, Type) \
95 if ((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) || \
96 (ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) { \
97 RtlRaiseStatus (STATUS_ACCESS_VIOLATION); \
99 *(volatile Type *)(Ptr) = *(volatile Type *)(Ptr); \
102 #define ProbeForWriteBoolean(Ptr) ProbeForWriteGenericType(Ptr, BOOLEAN)
103 #define ProbeForWriteUchar(Ptr) ProbeForWriteGenericType(Ptr, UCHAR)
104 #define ProbeForWriteChar(Ptr) ProbeForWriteGenericType(Ptr, Char)
105 #define ProbeForWriteUshort(Ptr) ProbeForWriteGenericType(Ptr, USHORT)
106 #define ProbeForWriteShort(Ptr) ProbeForWriteGenericType(Ptr, SHORT)
107 #define ProbeForWriteUlong(Ptr) ProbeForWriteGenericType(Ptr, ULONG)
108 #define ProbeForWriteLong(Ptr) ProbeForWriteGenericType(Ptr, LONG)
109 #define ProbeForWriteUint(Ptr) ProbeForWriteGenericType(Ptr, UINT)
110 #define ProbeForWriteInt(Ptr) ProbeForWriteGenericType(Ptr, INT)
111 #define ProbeForWriteUlonglong(Ptr) ProbeForWriteGenericType(Ptr, ULONGLONG)
112 #define ProbeForWriteLonglong(Ptr) ProbeForWriteGenericType(Ptr, LONGLONG)
113 #define ProbeForWriteLonglong(Ptr) ProbeForWriteGenericType(Ptr, LONGLONG)
114 #define ProbeForWritePointer(Ptr) ProbeForWriteGenericType(Ptr, PVOID)
115 #define ProbeForWriteHandle(Ptr) ProbeForWriteGenericType(Ptr, HANDLE)
116 #define ProbeForWriteLangid(Ptr) ProbeForWriteGenericType(Ptr, LANGID)
117 #define ProbeForWriteSize_t(Ptr) ProbeForWriteGenericType(Ptr, SIZE_T)
118 #define ProbeForWriteLargeInteger(Ptr) ProbeForWriteGenericType(&(Ptr)->QuadPart, LONGLONG)
119 #define ProbeForWriteUlargeInteger(Ptr) ProbeForWriteGenericType(&(Ptr)->QuadPart, ULONGLONG)
120 #define ProbeForWriteUnicodeString(Ptr) ProbeForWriteGenericType(Ptr, UNICODE_STRING)
122 #define ProbeForReadGenericType(Ptr, Type, Default) \
123 (((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) || \
124 (ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) ? \
125 ExRaiseStatus (STATUS_ACCESS_VIOLATION), Default : \
128 #define ProbeForReadBoolean(Ptr) ProbeForReadGenericType(Ptr, BOOLEAN, FALSE)
129 #define ProbeForReadUchar(Ptr) ProbeForReadGenericType(Ptr, UCHAR, 0)
130 #define ProbeForReadChar(Ptr) ProbeForReadGenericType(Ptr, CHAR, 0)
131 #define ProbeForReadUshort(Ptr) ProbeForReadGenericType(Ptr, USHORT, 0)
132 #define ProbeForReadShort(Ptr) ProbeForReadGenericType(Ptr, SHORT, 0)
133 #define ProbeForReadUlong(Ptr) ProbeForReadGenericType(Ptr, ULONG, 0)
134 #define ProbeForReadLong(Ptr) ProbeForReadGenericType(Ptr, LONG, 0)
135 #define ProbeForReadUint(Ptr) ProbeForReadGenericType(Ptr, UINT, 0)
136 #define ProbeForReadInt(Ptr) ProbeForReadGenericType(Ptr, INT, 0)
137 #define ProbeForReadUlonglong(Ptr) ProbeForReadGenericType(Ptr, ULONGLONG, 0)
138 #define ProbeForReadLonglong(Ptr) ProbeForReadGenericType(Ptr, LONGLONG, 0)
139 #define ProbeForReadPointer(Ptr) ProbeForReadGenericType(Ptr, PVOID, NULL)
140 #define ProbeForReadHandle(Ptr) ProbeForReadGenericType(Ptr, HANDLE, NULL)
141 #define ProbeForReadLangid(Ptr) ProbeForReadGenericType(Ptr, LANGID, 0)
142 #define ProbeForReadSize_t(Ptr) ProbeForReadGenericType(Ptr, SIZE_T, 0)
143 #define ProbeForReadLargeInteger(Ptr) ProbeForReadGenericType(Ptr, LARGE_INTEGER, __emptyLargeInteger)
144 #define ProbeForReadUlargeInteger(Ptr) ProbeForReadGenericType(Ptr, ULARGE_INTEGER, __emptyULargeInteger)
145 #define ProbeForReadUnicodeString(Ptr) ProbeForReadGenericType(Ptr, UNICODE_STRING, __emptyUnicodeString)
148 * Inlined Probing Macros
153 ProbeAndCaptureUnicodeString(OUT PUNICODE_STRING Dest
,
154 IN KPROCESSOR_MODE CurrentMode
,
155 IN PUNICODE_STRING UnsafeSrc
)
157 NTSTATUS Status
= STATUS_SUCCESS
;
159 ASSERT(Dest
!= NULL
);
161 /* Probe the structure and buffer*/
162 if(CurrentMode
!= KernelMode
)
166 *Dest
= ProbeForReadUnicodeString(UnsafeSrc
);
167 if(Dest
->Buffer
!= NULL
)
169 if (Dest
->Length
!= 0)
171 ProbeForRead(Dest
->Buffer
,
175 /* Allocate space for the buffer */
176 Buffer
= ExAllocatePoolWithTag(PagedPool
,
177 Dest
->Length
+ sizeof(WCHAR
),
178 TAG('U', 'S', 'T', 'R'));
181 Status
= STATUS_INSUFFICIENT_RESOURCES
;
186 RtlCopyMemory(Buffer
, Dest
->Buffer
, Dest
->Length
);
187 Buffer
[Dest
->Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
189 /* Set it as the buffer */
190 Dest
->Buffer
= Buffer
;
191 Dest
->MaximumLength
= Dest
->Length
+ sizeof(WCHAR
);
195 /* sanitize structure */
196 Dest
->MaximumLength
= 0;
202 /* sanitize structure */
204 Dest
->MaximumLength
= 0;
209 Status
= _SEH_GetExceptionCode();
215 /* Just copy the UNICODE_STRING structure, don't allocate new memory!
216 We trust the caller to supply valid pointers and data. */
227 ReleaseCapturedUnicodeString(IN PUNICODE_STRING CapturedString
,
228 IN KPROCESSOR_MODE CurrentMode
)
230 if(CurrentMode
!= KernelMode
&& CapturedString
->Buffer
!= NULL
)
232 ExFreePool(CapturedString
->Buffer
);
237 * generic information class probing code
240 #define ICIF_QUERY 0x1
242 #define ICIF_QUERY_SIZE_VARIABLE 0x4
243 #define ICIF_SET_SIZE_VARIABLE 0x8
244 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
246 typedef struct _INFORMATION_CLASS_INFO
248 ULONG RequiredSizeQUERY
;
249 ULONG RequiredSizeSET
;
251 ULONG AlignmentQUERY
;
253 } INFORMATION_CLASS_INFO
, *PINFORMATION_CLASS_INFO
;
255 #define ICI_SQ_SAME(Size, Alignment, Flags) \
256 { Size, Size, Alignment, Alignment, Flags }
258 #define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags) \
259 { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
261 static __inline NTSTATUS
262 DefaultSetInfoBufferCheck(UINT Class
,
263 const INFORMATION_CLASS_INFO
*ClassList
,
264 UINT ClassListEntries
,
267 KPROCESSOR_MODE PreviousMode
)
269 NTSTATUS Status
= STATUS_SUCCESS
;
271 if (Class
>= 0 && Class
< ClassListEntries
)
273 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
275 Status
= STATUS_INVALID_INFO_CLASS
;
277 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
278 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
280 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
282 Status
= STATUS_INFO_LENGTH_MISMATCH
;
286 if (NT_SUCCESS(Status
))
288 if (PreviousMode
!= KernelMode
)
294 ClassList
[Class
].AlignmentSET
);
298 Status
= _SEH_GetExceptionCode();
305 Status
= STATUS_INVALID_INFO_CLASS
;
310 static __inline NTSTATUS
311 DefaultQueryInfoBufferCheck(UINT Class
,
312 const INFORMATION_CLASS_INFO
*ClassList
,
313 UINT ClassListEntries
,
317 KPROCESSOR_MODE PreviousMode
)
319 NTSTATUS Status
= STATUS_SUCCESS
;
321 if (Class
>= 0 && Class
< ClassListEntries
)
323 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
325 Status
= STATUS_INVALID_INFO_CLASS
;
327 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
328 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
330 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
332 Status
= STATUS_INFO_LENGTH_MISMATCH
;
336 if (NT_SUCCESS(Status
))
338 if (PreviousMode
!= KernelMode
)
344 ProbeForWrite(Buffer
,
346 ClassList
[Class
].AlignmentQUERY
);
349 if (ReturnLength
!= NULL
)
351 ProbeForWriteUlong(ReturnLength
);
356 Status
= _SEH_GetExceptionCode();
363 Status
= STATUS_INVALID_INFO_CLASS
;
369 * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
372 #if defined(_X86_) || defined(_M_AMD64)
374 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
375 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
377 #elif defined(_IA64_)
379 /* on Itanium if the 24 most significant bits are set, we're not dealing with
381 #define IsPointerOffset(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
384 #error IsPointerOffset() needs to be defined for this architecture
391 #define MM_STACK_SIZE (3*4096)
393 #endif /* INCLUDE_INTERNAL_NTOSKRNL_H */