115 lines
2.3 KiB
C
115 lines
2.3 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
vfprint.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements support for output of various data types to the
|
||
|
debugger.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Adrian J. Oney (adriao) 20-Apr-1998
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel mode
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
AdriaO 02/10/2000 - Seperated out from ntos\io\ioassert.c
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "vfdef.h"
|
||
|
|
||
|
#ifdef ALLOC_PRAGMA
|
||
|
#pragma alloc_text(PAGEVRFY, VfPrintDumpIrpStack)
|
||
|
#pragma alloc_text(PAGEVRFY, VfPrintDumpIrp)
|
||
|
#endif // ALLOC_PRAGMA
|
||
|
|
||
|
VOID
|
||
|
VfPrintDumpIrpStack(
|
||
|
IN PIO_STACK_LOCATION IrpSp
|
||
|
)
|
||
|
{
|
||
|
VfMajorDumpIrpStack(IrpSp);
|
||
|
DbgPrint("\n");
|
||
|
|
||
|
DbgPrint(
|
||
|
"[ DevObj=%p, FileObject=%p, Parameters=%p %p %p %p ]\n",
|
||
|
IrpSp->DeviceObject,
|
||
|
IrpSp->FileObject,
|
||
|
IrpSp->Parameters.Others.Argument1,
|
||
|
IrpSp->Parameters.Others.Argument2,
|
||
|
IrpSp->Parameters.Others.Argument3,
|
||
|
IrpSp->Parameters.Others.Argument4
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
VfPrintDumpIrp(
|
||
|
IN PIRP IrpToFlag
|
||
|
)
|
||
|
{
|
||
|
PIO_STACK_LOCATION irpSpCur;
|
||
|
PIO_STACK_LOCATION irpSpNxt;
|
||
|
|
||
|
//
|
||
|
// First see if we can touch the IRP header
|
||
|
//
|
||
|
if(!VfUtilIsMemoryRangeReadable(IrpToFlag, sizeof(IRP), VFMP_INSTANT)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// OK, get the next two stack locations...
|
||
|
//
|
||
|
irpSpNxt = IoGetNextIrpStackLocation( IrpToFlag );
|
||
|
irpSpCur = IoGetCurrentIrpStackLocation( IrpToFlag );
|
||
|
|
||
|
if (VfUtilIsMemoryRangeReadable(irpSpNxt, 2*sizeof(IO_STACK_LOCATION), VFMP_INSTANT)) {
|
||
|
|
||
|
//
|
||
|
// Both are present, print the best one!
|
||
|
//
|
||
|
if (irpSpNxt->MinorFunction == irpSpCur->MinorFunction) {
|
||
|
|
||
|
//
|
||
|
// Looks forwarded
|
||
|
//
|
||
|
VfPrintDumpIrpStack(irpSpNxt);
|
||
|
|
||
|
} else if (irpSpNxt->MinorFunction == 0) {
|
||
|
|
||
|
//
|
||
|
// Next location is probably currently zero'd
|
||
|
//
|
||
|
VfPrintDumpIrpStack(irpSpCur);
|
||
|
|
||
|
} else {
|
||
|
|
||
|
DbgPrint("Next: >");
|
||
|
VfPrintDumpIrpStack(irpSpNxt);
|
||
|
DbgPrint("Current: ");
|
||
|
VfPrintDumpIrpStack(irpSpCur);
|
||
|
}
|
||
|
|
||
|
} else if (VfUtilIsMemoryRangeReadable(irpSpCur, sizeof(IO_STACK_LOCATION), VFMP_INSTANT)) {
|
||
|
|
||
|
VfPrintDumpIrpStack(irpSpCur);
|
||
|
|
||
|
} else if (VfUtilIsMemoryRangeReadable(irpSpNxt, sizeof(IO_STACK_LOCATION), VFMP_INSTANT)) {
|
||
|
|
||
|
VfPrintDumpIrpStack(irpSpNxt);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|