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