mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
3.0 KiB
163 lines
3.0 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
debugsup.c
|
|
|
|
Abstract:
|
|
|
|
This module contains routines which provide support for the
|
|
kernel debugger.
|
|
|
|
Author:
|
|
|
|
Lou Perazzoli (loup) 02-Aug-90
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "mi.h"
|
|
|
|
PVOID
|
|
MmDbgReadCheck (
|
|
IN PVOID VirtualAddress
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
i386/486 implementation specific:
|
|
|
|
This routine checks the specified virtual address and if it is
|
|
valid and readable, it returns that virtual address, otherwise
|
|
it returns NULL.
|
|
|
|
Arguments:
|
|
|
|
VirtualAddress - Supplies the virtual address to check.
|
|
|
|
Return Value:
|
|
|
|
Returns NULL if the address is not valid or readable, otherwise
|
|
returns the virtual address of the corresponding virtual address.
|
|
|
|
Environment:
|
|
|
|
Kernel mode IRQL at DISPATCH_LEVEL or greater.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
if (!MmIsAddressValid (VirtualAddress)) {
|
|
return NULL;
|
|
}
|
|
|
|
return VirtualAddress;
|
|
|
|
}
|
|
|
|
PVOID
|
|
MmDbgWriteCheck (
|
|
IN PVOID VirtualAddress
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
i386/486 implementation specific:
|
|
|
|
This routine checks the specified virtual address and if it is
|
|
valid and writeable, it returns that virtual address, otherwise
|
|
it returns NULL.
|
|
|
|
Arguments:
|
|
|
|
VirtualAddress - Supplies the virtual address to check.
|
|
|
|
Return Value:
|
|
|
|
Returns NULL if the address is not valid or writable, otherwise
|
|
returns the virtual address of the corresponding virtual address.
|
|
|
|
Environment:
|
|
|
|
Kernel mode IRQL at DISPATCH_LEVEL or greater.
|
|
|
|
--*/
|
|
|
|
{
|
|
PMMPTE PointerPte;
|
|
|
|
if (!MmIsAddressValid (VirtualAddress)) {
|
|
return NULL;
|
|
}
|
|
|
|
PointerPte = MiGetPdeAddress (VirtualAddress);
|
|
if (PointerPte->u.Hard.LargePage == 0) {
|
|
PointerPte = MiGetPteAddress (VirtualAddress);
|
|
}
|
|
|
|
if ((PointerPte->u.Hard.Write == 0) &&
|
|
((PointerPte->u.Long & HARDWARE_PTE_DIRTY_MASK) == 0)) {
|
|
|
|
//
|
|
// PTE is not writable, return NULL.
|
|
//
|
|
|
|
return NULL;
|
|
}
|
|
|
|
return VirtualAddress;
|
|
}
|
|
|
|
PVOID
|
|
MmDbgTranslatePhysicalAddress (
|
|
IN PHYSICAL_ADDRESS PhysicalAddress
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
i386/486 implementation specific:
|
|
|
|
This routine maps the specified physical address and returns
|
|
the virtual address which maps the physical address.
|
|
|
|
The next call to MmDbgTranslatePhyiscalAddress removes the
|
|
previous phyiscal address translation, hence on a single
|
|
physical address can be examined at a time (can't cross page
|
|
boundaries).
|
|
|
|
Arguments:
|
|
|
|
PhysicalAddress - Supplies the phyiscal address to map and translate.
|
|
|
|
Return Value:
|
|
|
|
The virtual address which corresponds to the phyiscal address.
|
|
|
|
Environment:
|
|
|
|
Kernel mode IRQL at DISPATCH_LEVEL or greater.
|
|
|
|
--*/
|
|
|
|
{
|
|
PVOID BaseAddress;
|
|
|
|
BaseAddress = MiGetVirtualAddressMappedByPte (MmDebugPte);
|
|
|
|
KiFlushSingleTb (TRUE, BaseAddress);
|
|
|
|
*MmDebugPte = ValidKernelPte;
|
|
MmDebugPte->u.Hard.PageFrameNumber = PhysicalAddress.LowPart >> PAGE_SHIFT;
|
|
|
|
return (PVOID)((ULONG)BaseAddress + BYTE_OFFSET(PhysicalAddress.LowPart));
|
|
}
|