/* FUNCTIONS *****************************************************************/
+PVOID
+NTAPI
+RtlPcToFileHeader(
+ IN PVOID PcValue,
+ OUT PVOID *BaseOfImage)
+{
+ PLDR_DATA_TABLE_ENTRY LdrEntry;
+ BOOLEAN InSystem;
+
+ /* Get the base for this file */
+ if ((ULONG_PTR)PcValue > (ULONG_PTR)MmHighestUserAddress)
+ {
+ /* We are in kernel */
+ *BaseOfImage = KiPcToFileHeader(PcValue, &LdrEntry, FALSE, &InSystem);
+ }
+ else
+ {
+ /* We are in user land */
+ *BaseOfImage = KiRosPcToUserFileHeader(PcValue, &LdrEntry);
+ }
+
+ return *BaseOfImage;
+}
+
VOID
NTAPI
RtlInitializeRangeListPackage(VOID)
return FALSE;
}
-#ifndef _ARM_
+#if !defined(_ARM_) && !defined(_AMD64_)
BOOLEAN
NTAPI
&StackBegin,
&StackEnd);
if (!Result) return 0;
- }
+ }
/* Use a SEH block for maximum protection */
_SEH2_TRY
/* Make sure we can trust the TEB and trap frame */
if (!(Teb) ||
- !(Thread->SystemThread) ||
(KeIsAttachedProcess()) ||
(KeGetCurrentIrql() >= DISPATCH_LEVEL))
{
/* Invalid or unsafe attempt to get the stack */
- return 0;
+ _SEH2_YIELD(return 0;)
}
/* Get the stack limits */
- StackBegin = (ULONG_PTR)Teb->Tib.StackLimit;
- StackEnd = (ULONG_PTR)Teb->Tib.StackBase;
+ StackBegin = (ULONG_PTR)Teb->NtTib.StackLimit;
+ StackEnd = (ULONG_PTR)Teb->NtTib.StackBase;
#ifdef _M_IX86
Stack = TrapFrame->Ebp;
#elif defined(_M_PPC)
#endif
+#ifdef _AMD64_
+VOID
+NTAPI
+RtlpGetStackLimits(
+ OUT PULONG_PTR LowLimit,
+ OUT PULONG_PTR HighLimit)
+{
+ PKTHREAD CurrentThread = KeGetCurrentThread();
+ *HighLimit = (ULONG_PTR)CurrentThread->InitialStack;
+ *LowLimit = (ULONG_PTR)CurrentThread->StackLimit;
+}
+#endif
+
/* RTL Atom Tables ************************************************************/
NTSTATUS