290 lines
5.2 KiB
C
290 lines
5.2 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1996 Intel Corporation
|
|||
|
Copyright (c) 1990 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
miscc.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the functions that get the memory stack
|
|||
|
and backing store limits.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
William K. Cheung (wcheung) 09-Aug-1996
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Any mode.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "ntrtlp.h"
|
|||
|
|
|||
|
VOID
|
|||
|
DebugLoadImageSymbols(
|
|||
|
IN PSTRING FileName,
|
|||
|
IN PKD_SYMBOLS_INFO SymbolInfo
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
DebugUnLoadImageSymbols(
|
|||
|
IN PSTRING FileName,
|
|||
|
IN PKD_SYMBOLS_INFO SymbolInfo
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
DebugCommandString(
|
|||
|
IN PSTRING Name,
|
|||
|
IN PSTRING Command
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
RtlpFlushRSE (
|
|||
|
OUT PULONGLONG BackingStore,
|
|||
|
OUT PULONGLONG RNat
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
RtlpCaptureRnats (
|
|||
|
IN OUT PCONTEXT ContextRecord
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function captures Nat bits of all the stacked registers in
|
|||
|
the RSE frame specified in the context record.
|
|||
|
--*/
|
|||
|
{
|
|||
|
SHORT BsFrameSize; // in 8-byte units
|
|||
|
SHORT TempFrameSize; // in 8-byte units
|
|||
|
SHORT RNatSaveIndex;
|
|||
|
ULONGLONG Rnat;
|
|||
|
ULONGLONG Bsp;
|
|||
|
ULONGLONG TopRnatAddress;
|
|||
|
|
|||
|
RtlpFlushRSE(&Bsp, &Rnat);
|
|||
|
|
|||
|
BsFrameSize = (SHORT)ContextRecord->StIFS & PFS_SIZE_MASK;
|
|||
|
RNatSaveIndex = (SHORT)(ContextRecord->RsBSP >> 3) & NAT_BITS_PER_RNAT_REG;
|
|||
|
TempFrameSize = RNatSaveIndex + BsFrameSize - NAT_BITS_PER_RNAT_REG;
|
|||
|
while (TempFrameSize >= 0) {
|
|||
|
BsFrameSize++;
|
|||
|
TempFrameSize -= NAT_BITS_PER_RNAT_REG;
|
|||
|
}
|
|||
|
TopRnatAddress = (ContextRecord->RsBSP + (BsFrameSize * 8) - sizeof(ULONGLONG)) | RNAT_ALIGNMENT;
|
|||
|
if (TopRnatAddress < Bsp) {
|
|||
|
ContextRecord->RsRNAT = *(PULONGLONG)TopRnatAddress;
|
|||
|
} else {
|
|||
|
ContextRecord->RsRNAT = Rnat;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
Rtlp64GetBStoreLimits (
|
|||
|
OUT PULONGLONG LowBStoreLimit,
|
|||
|
OUT PULONGLONG HighBStoreLimit
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function returns the current backing store limits based on the
|
|||
|
current processor mode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
LowBStoreLimit - Supplies a pointer to a variable that is to receive
|
|||
|
the low limit of the backing store.
|
|||
|
|
|||
|
HighBStoreLimit - Supplies a pointer to a variable that is to receive
|
|||
|
the high limit of the backing store.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
#if defined(NTOS_KERNEL_RUNTIME)
|
|||
|
|
|||
|
//
|
|||
|
// Kernel Mode
|
|||
|
//
|
|||
|
|
|||
|
*LowBStoreLimit = (ULONGLONG)(PCR->InitialBStore);
|
|||
|
*HighBStoreLimit = (ULONGLONG)(PCR->BStoreLimit);
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
//
|
|||
|
// User Mode
|
|||
|
//
|
|||
|
|
|||
|
PTEB CurrentTeb = NtCurrentTeb();
|
|||
|
|
|||
|
*HighBStoreLimit = (ULONGLONG)CurrentTeb->BStoreLimit;
|
|||
|
*LowBStoreLimit = (ULONGLONG)CurrentTeb->NtTib.StackBase;
|
|||
|
|
|||
|
#endif // defined(NTOS_KERNEL_RUNTIME)
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
RtlpGetStackLimits (
|
|||
|
OUT PULONG_PTR LowStackLimit,
|
|||
|
OUT PULONG_PTR HighStackLimit
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function returns the current memory stack limits based on the
|
|||
|
current processor mode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
LowStackLimit - Supplies a pointer to a variable that is to receive
|
|||
|
the low limit of the memory stack.
|
|||
|
|
|||
|
HighStackLimit - Supplies a pointer to a variable that is to receive
|
|||
|
the high limit of the memory stack.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
#if defined(NTOS_KERNEL_RUNTIME)
|
|||
|
|
|||
|
//
|
|||
|
// Kernel Mode
|
|||
|
//
|
|||
|
|
|||
|
*HighStackLimit = (ULONG_PTR)PCR->InitialStack;
|
|||
|
*LowStackLimit = (ULONG_PTR)PCR->StackLimit;
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
//
|
|||
|
// User Mode
|
|||
|
//
|
|||
|
|
|||
|
PTEB CurrentTeb = NtCurrentTeb();
|
|||
|
|
|||
|
*HighStackLimit = (ULONG_PTR)CurrentTeb->NtTib.StackBase;
|
|||
|
*LowStackLimit = (ULONG_PTR)CurrentTeb->NtTib.StackLimit;
|
|||
|
|
|||
|
#endif // defined(NTOS_KERNEL_RUNTIME)
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
Rtlp64GetStackLimits (
|
|||
|
OUT PULONGLONG LowStackLimit,
|
|||
|
OUT PULONGLONG HighStackLimit
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function returns the current memory stack limits based on the
|
|||
|
current processor mode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
LowStackLimit - Supplies a pointer to a variable that is to receive
|
|||
|
the low limit of the memory stack.
|
|||
|
|
|||
|
HighStackLimit - Supplies a pointer to a variable that is to receive
|
|||
|
the high limit of the memory stack.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
#if defined(NTOS_KERNEL_RUNTIME)
|
|||
|
|
|||
|
//
|
|||
|
// Kernel Mode
|
|||
|
//
|
|||
|
|
|||
|
*HighStackLimit = (ULONG_PTR)PCR->InitialStack;
|
|||
|
*LowStackLimit = (ULONG_PTR)PCR->StackLimit;
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
//
|
|||
|
// User Mode
|
|||
|
//
|
|||
|
|
|||
|
PTEB CurrentTeb = NtCurrentTeb();
|
|||
|
|
|||
|
*HighStackLimit = (ULONGLONG)CurrentTeb->NtTib.StackBase;
|
|||
|
*LowStackLimit = (ULONGLONG)CurrentTeb->NtTib.StackLimit;
|
|||
|
|
|||
|
#endif // defined(NTOS_KERNEL_RUNTIME)
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
DebugService2(
|
|||
|
PVOID Arg1,
|
|||
|
PVOID Arg2,
|
|||
|
ULONG ServiceClass
|
|||
|
)
|
|||
|
|
|||
|
//++
|
|||
|
//
|
|||
|
// Routine Description:
|
|||
|
//
|
|||
|
// Generic exception dispatcher for the debugger
|
|||
|
//
|
|||
|
// Arguments:
|
|||
|
// Arg1 - generic first argument
|
|||
|
// Arg2 - generic second argument
|
|||
|
// ServiceClass - which call is to be performed
|
|||
|
//
|
|||
|
// Returns:
|
|||
|
// Whatever the exception returns in eax
|
|||
|
//
|
|||
|
//--
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
switch (ServiceClass)
|
|||
|
{
|
|||
|
case BREAKPOINT_COMMAND_STRING:
|
|||
|
DebugCommandString(Arg1, Arg2);
|
|||
|
return;
|
|||
|
case BREAKPOINT_LOAD_SYMBOLS:
|
|||
|
DebugLoadImageSymbols(Arg1, Arg2);
|
|||
|
return;
|
|||
|
case BREAKPOINT_UNLOAD_SYMBOLS:
|
|||
|
DebugUnLoadImageSymbols(Arg1, Arg2);
|
|||
|
return;
|
|||
|
default:
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|