212 lines
3.5 KiB
C
212 lines
3.5 KiB
C
/*++
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
Lists.c
|
||
|
||
Abstract:
|
||
|
||
WinDbg Extension Api
|
||
|
||
Author:
|
||
|
||
Gary Kimura [GaryKi] 25-Mar-96
|
||
|
||
Environment:
|
||
|
||
User Mode.
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "precomp.h"
|
||
#pragma hdrstop
|
||
|
||
#define ReadAtAddress(A,V,S,R) \
|
||
(ReadMemory( (A), &(V), (S), &R ) && (R >= (S)))
|
||
|
||
#define BIG_READ (sizeof(ULONG) * 4)
|
||
#define SMALL_READ (sizeof(ULONG) * 2)
|
||
|
||
VOID
|
||
DumpListByLinks (
|
||
IN ULONG64 StartAddress,
|
||
IN ULONG MaxCount,
|
||
IN ULONG Bias,
|
||
IN LOGICAL UseFlink
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump a list by its blinks.
|
||
|
||
Arguments:
|
||
|
||
arg - [Address] [count] [bias]
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
ULONG64 Address;
|
||
ULONG Buffer[4];
|
||
ULONG ReadSize;
|
||
ULONG BytesRead;
|
||
ULONG Count;
|
||
|
||
//
|
||
// set our starting address and then while the count is greater than zero
|
||
// and the starting address is not equal to the current dumping address
|
||
// we'll read in 4 ulongs, dump them, and then go through the flink&blink
|
||
// using the specified bias.
|
||
//
|
||
|
||
if (!IsPtr64()) {
|
||
StartAddress = (ULONG64) (LONG64) (LONG) StartAddress;
|
||
}
|
||
Address = StartAddress;
|
||
|
||
ReadSize = BIG_READ;
|
||
|
||
for (Count = 0; Count < MaxCount; ) {
|
||
|
||
if (ReadAtAddress( Address, Buffer, ReadSize, BytesRead ) == 0) {
|
||
ReadSize = SMALL_READ;
|
||
if (ReadAtAddress( Address, Buffer, ReadSize, BytesRead ) == 0) {
|
||
dprintf("Can't Read Memory at %08lx\n", Address);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (ReadSize == BIG_READ) {
|
||
dprintf("%08p %08lx %08lx %08lx %08lx\n", Address, Buffer[0], Buffer[1], Buffer[2], Buffer[3]);
|
||
}
|
||
else {
|
||
dprintf("%08p %08lx %08lx\n", Address, Buffer[0], Buffer[1]);
|
||
}
|
||
|
||
Count += 1;
|
||
|
||
//
|
||
// the bias tells us which bits to knock out of the pointer
|
||
//
|
||
|
||
if (UseFlink == TRUE) {
|
||
GetFieldValue(Address, "LIST_ENTRY", "Flink", Address);
|
||
Address &= ~((ULONG64)Bias);
|
||
}
|
||
else {
|
||
GetFieldValue(Address, "LIST_ENTRY", "Blink", Address);
|
||
Address &= ~((ULONG64)Bias);
|
||
}
|
||
|
||
if (Address == StartAddress) {
|
||
break;
|
||
}
|
||
|
||
if (((Count & 0xf) == 0) && CheckControlC() ) {
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (Count != 0) {
|
||
dprintf("0x%x entries dumped\n", Count);
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
DECLARE_API( dflink )
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump a list by its flinks.
|
||
|
||
Arguments:
|
||
|
||
arg - [Address] [count] [bias]
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
ULONG64 StartAddress;
|
||
ULONG Count;
|
||
ULONG Bias;
|
||
|
||
StartAddress = 0;
|
||
Count = 0x20;
|
||
Bias = 0;
|
||
|
||
//
|
||
// read in the parameters
|
||
//
|
||
|
||
if (GetExpressionEx(args,&StartAddress, &args)) {
|
||
if (!sscanf(args, "%lx %lx", &Count, &Bias)) {
|
||
Bias = 0;
|
||
}
|
||
}
|
||
|
||
DumpListByLinks (StartAddress, Count, Bias, TRUE);
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
|
||
DECLARE_API( dblink )
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump a list by its blinks.
|
||
|
||
Arguments:
|
||
|
||
arg - [Address] [count] [bias]
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
ULONG64 StartAddress;
|
||
ULONG Count;
|
||
ULONG Bias;
|
||
|
||
StartAddress = 0;
|
||
Count = 0x20;
|
||
Bias = 0;
|
||
|
||
//
|
||
// read in the parameters
|
||
//
|
||
|
||
if (GetExpressionEx(args,&StartAddress, &args)) {
|
||
if (!sscanf(args, "%lx %lx", &Count, &Bias)) {
|
||
Bias = 0;
|
||
}
|
||
}
|
||
|
||
DumpListByLinks (StartAddress, Count, Bias, FALSE);
|
||
|
||
return S_OK;
|
||
}
|