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;
|
||
}
|