Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

128 lines
3.3 KiB

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
ready.c
Abstract:
WinDbg Extension Api
Author:
Ramon J San Andres (ramonsa) 8-Nov-1993
Environment:
User Mode.
Revision History:
Jamie Hankins (a-jamhan) 20-Oct-1997 Added CheckControlC to loop.
--*/
#include "precomp.h"
#pragma hdrstop
DECLARE_API( ready )
/*++
Routine Description:
Arguments:
args -
Return Value:
None
--*/
{
ULONG64 KiDispatcherReadyListHead;
ULONG ListEntrySize, WaitListOpffset;
ULONG result;
DWORD Flags = 6;
LONG i;
BOOLEAN ThreadDumped = FALSE;
ULONG dwProcessor=0;
GetCurrentProcessor(Client, &dwProcessor, NULL);
Flags = (ULONG)GetExpression(args);
KiDispatcherReadyListHead = GetExpression( "nt!KiDispatcherReadyListHead" );
if ( KiDispatcherReadyListHead ) {
ListEntrySize = GetTypeSize("nt!_LIST_ENTRY");
if (ListEntrySize == 0) {
ListEntrySize = DBG_PTR_SIZE * 2;
}
GetFieldOffset("nt!_ETHREAD", "Tcb.WaitListEntry", &WaitListOpffset);
for (i = MAXIMUM_PRIORITY-1; i >= 0 ; i -= 1 ) {
ULONG64 Flink, Blink;
if ( GetFieldValue( KiDispatcherReadyListHead + i*ListEntrySize,
"nt!_LIST_ENTRY",
"Flink",
Flink) ) {
dprintf(
"Could not read contents of KiDispatcherReadyListHead at %08p [%ld]\n",
(KiDispatcherReadyListHead + i * ListEntrySize), i
);
return E_INVALIDARG;
}
if (Flink != KiDispatcherReadyListHead+i*ListEntrySize) {
ULONG64 ThreadEntry, ThreadFlink;
dprintf("Ready Threads at priority %ld\n", i);
for (ThreadEntry = Flink ;
ThreadEntry != KiDispatcherReadyListHead+i*ListEntrySize ;
ThreadEntry = ThreadFlink ) {
ULONG64 ThreadBaseAddress = (ThreadEntry - WaitListOpffset);
if ( GetFieldValue( ThreadBaseAddress,
"nt!_ETHREAD",
"Tcb.WaitListEntry.Flink",
ThreadFlink) ) {
dprintf("Could not read contents of thread %p\n", ThreadBaseAddress);
}
if(CheckControlC()) {
return E_INVALIDARG;
}
DumpThreadEx(dwProcessor," ", ThreadBaseAddress, Flags, Client);
ThreadDumped = TRUE;
}
} else {
GetFieldValue( KiDispatcherReadyListHead + i*ListEntrySize,
"nt!_LIST_ENTRY",
"Blink",
Blink);
if (Flink != Blink) {
dprintf("Ready linked list may to be corrupt...\n");
}
}
}
if (!ThreadDumped) {
dprintf("No threads in READY state\n");
}
} else {
dprintf("Could not determine address of KiDispatcherReadyListHead\n");
return E_INVALIDARG;
}
return S_OK;
}