windows-nt/Source/XPSP1/NT/base/tools/kdexts2/lists.c
2020-09-26 16:20:57 +08:00

212 lines
3.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}