491 lines
9.7 KiB
C
491 lines
9.7 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
DumpSup.c
|
||
|
||
Abstract:
|
||
|
||
This module implements a collection of data structure dump routines
|
||
for debugging the Named Pipe file system
|
||
|
||
Author:
|
||
|
||
Gary Kimura [GaryKi] 21-Aug-1990
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "NpProcs.h"
|
||
|
||
#ifdef NPDBG
|
||
|
||
VOID NpDumpEventTableEntry(IN PEVENT_TABLE_ENTRY Ptr);
|
||
VOID NpDumpDataQueue(IN PDATA_QUEUE Ptr);
|
||
VOID NpDumpDataEntry(IN PDATA_ENTRY Ptr);
|
||
|
||
VOID NpDump(IN PVOID Ptr);
|
||
VOID NpDumpVcb(IN PVCB Ptr);
|
||
VOID NpDumpRootDcb(IN PROOT_DCB Ptr);
|
||
VOID NpDumpFcb(IN PFCB Ptr);
|
||
VOID NpDumpCcb(IN PCCB Ptr);
|
||
VOID NpDumpNonpagedCcb(IN PNONPAGED_CCB Ptr);
|
||
VOID NpDumpRootDcbCcb(IN PROOT_DCB_CCB Ptr);
|
||
|
||
ULONG NpDumpCurrentColumn;
|
||
|
||
#define DumpNewLine() { \
|
||
DbgPrint("\n"); \
|
||
NpDumpCurrentColumn = 1; \
|
||
}
|
||
|
||
#define DumpLabel(Label,Width) { \
|
||
ULONG i; \
|
||
CHAR _Str[20]; \
|
||
for(i=0;i<2;i++) { _Str[i] = UCHAR_SP;} \
|
||
strncpy(&_Str[2],#Label,Width); \
|
||
for(i=strlen(_Str);i<Width;i++) {_Str[i] = UCHAR_SP;} \
|
||
_Str[Width] = '\0'; \
|
||
DbgPrint("%s", _Str); \
|
||
}
|
||
|
||
#define DumpField(Field) { \
|
||
if ((NpDumpCurrentColumn + 18 + 9 + 9) > 80) {DumpNewLine();} \
|
||
NpDumpCurrentColumn += 18 + 9 + 9; \
|
||
DumpLabel(Field,18); \
|
||
DbgPrint(":%8lx", Ptr->Field); \
|
||
DbgPrint(" "); \
|
||
}
|
||
|
||
#define DumpListEntry(Links) { \
|
||
if ((NpDumpCurrentColumn + 18 + 9 + 9) > 80) {DumpNewLine();} \
|
||
NpDumpCurrentColumn += 18 + 9 + 9; \
|
||
DumpLabel(Links,18); \
|
||
DbgPrint(":%8lx", Ptr->Links.Flink); \
|
||
DbgPrint(":%8lx", Ptr->Links.Blink); \
|
||
}
|
||
|
||
#define DumpName(Field,Width) { \
|
||
ULONG i; \
|
||
WCHAR _String[64]; \
|
||
if ((NpDumpCurrentColumn + 18 + Width) > 80) {DumpNewLine();} \
|
||
NpDumpCurrentColumn += 18 + Width; \
|
||
DumpLabel(Field,18); \
|
||
for(i=0;i<Width/2;i++) {_String[i] = Ptr->Field[i];} \
|
||
_String[Width] = '\0'; \
|
||
DbgPrint("%s", _String); \
|
||
}
|
||
|
||
#define TestForNull(Name) { \
|
||
if (Ptr == NULL) { \
|
||
DbgPrint("%s - Cannot dump a NULL pointer\n", Name); \
|
||
return; \
|
||
} \
|
||
}
|
||
|
||
|
||
VOID NpDumpEventTableEntry (
|
||
IN PEVENT_TABLE_ENTRY Ptr
|
||
)
|
||
|
||
{
|
||
TestForNull ("NpDumpEventTableEntry");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("EventTableEntry@ %08lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (Ccb);
|
||
DumpField (NamedPipeEnd);
|
||
DumpField (EventHandle);
|
||
DumpField (Event);
|
||
DumpField (KeyValue);
|
||
DumpField (Process);
|
||
DumpNewLine ();
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDumpDataQueue (
|
||
IN PDATA_QUEUE Ptr
|
||
)
|
||
|
||
{
|
||
PDATA_ENTRY Entry;
|
||
|
||
TestForNull ("NpDumpDataQueue");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("DataQueue@ %08lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (QueueState);
|
||
DumpField (BytesInQueue);
|
||
DumpField (EntriesInQueue);
|
||
DumpField (Quota);
|
||
DumpField (QuotaUsed);
|
||
DumpField (FrontOfQueue);
|
||
DumpField (EndOfQueue);
|
||
DumpField (NextByteOffset);
|
||
DumpNewLine ();
|
||
|
||
for (Entry = Ptr->FrontOfQueue;
|
||
Entry != NULL;
|
||
Entry = Entry->Next) {
|
||
|
||
NpDumpDataEntry( Entry );
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDumpDataEntry (
|
||
IN PDATA_ENTRY Ptr
|
||
)
|
||
|
||
{
|
||
TestForNull ("NpDumpDataEntry");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("DataEntry@ %08lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (DataEntryType);
|
||
DumpField (From);
|
||
DumpField (Next);
|
||
DumpField (Irp);
|
||
DumpField (DataSize);
|
||
DumpField (DataPointer);
|
||
DumpField (SecurityClientContext);
|
||
DumpNewLine ();
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDump (
|
||
IN PVOID Ptr
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine determines the type of internal record reference by ptr and
|
||
calls the appropriate dump routine.
|
||
|
||
Arguments:
|
||
|
||
Ptr - Supplies the pointer to the record to be dumped
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
TestForNull("NpDump");
|
||
|
||
//
|
||
// We'll switch on the node type code
|
||
//
|
||
|
||
switch (NodeType(Ptr)) {
|
||
|
||
case NPFS_NTC_VCB: NpDumpVcb(Ptr); break;
|
||
case NPFS_NTC_ROOT_DCB: NpDumpRootDcb(Ptr); break;
|
||
case NPFS_NTC_FCB: NpDumpFcb(Ptr); break;
|
||
case NPFS_NTC_CCB: NpDumpCcb(Ptr); break;
|
||
case NPFS_NTC_NONPAGED_CCB: NpDumpNonpagedCcb(Ptr); break;
|
||
case NPFS_NTC_ROOT_DCB_CCB: NpDumpRootDcbCcb(Ptr); break;
|
||
|
||
default :
|
||
DbgPrint("NpDump - Unknown Node type code %8lx\n", *((PNODE_TYPE_CODE)(Ptr)));
|
||
break;
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDumpVcb (
|
||
IN PVCB Ptr
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump an Vcb structure
|
||
|
||
Arguments:
|
||
|
||
Ptr - Supplies the Device record to be dumped
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
TestForNull ("NpDumpVcb");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("Vcb@ %lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (NodeTypeCode);
|
||
DumpField (NodeByteSize);
|
||
DumpField (RootDcb);
|
||
DumpField (OpenCount);
|
||
DumpNewLine ();
|
||
|
||
NpDump (Ptr->RootDcb);
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDumpRootDcb (
|
||
IN PROOT_DCB Ptr
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump a root dcb structure
|
||
|
||
Arguments:
|
||
|
||
Ptr - Supplies the Root Dcb record to be dumped
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
PLIST_ENTRY Links;
|
||
|
||
TestForNull ("NpDumpRootDcb");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("RootDcb@ %lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (NodeTypeCode);
|
||
DumpField (NodeByteSize);
|
||
DumpListEntry (ParentDcbLinks);
|
||
DumpField (ParentDcb);
|
||
DumpField (OpenCount);
|
||
DumpField (FullFileName.Length);
|
||
DumpField (FullFileName.Buffer);
|
||
DumpName (FullFileName.Buffer, 32);
|
||
DumpField (LastFileName.Length);
|
||
DumpField (LastFileName.Buffer);
|
||
DumpListEntry (Specific.Dcb.NotifyFullQueue);
|
||
DumpListEntry (Specific.Dcb.NotifyPartialQueue);
|
||
DumpListEntry (Specific.Dcb.ParentDcbQueue);
|
||
DumpNewLine ();
|
||
|
||
for (Links = Ptr->Specific.Dcb.ParentDcbQueue.Flink;
|
||
Links != &Ptr->Specific.Dcb.ParentDcbQueue;
|
||
Links = Links->Flink) {
|
||
NpDump(CONTAINING_RECORD(Links, FCB, ParentDcbLinks));
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDumpFcb (
|
||
IN PFCB Ptr
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump an Fcb structure
|
||
|
||
Arguments:
|
||
|
||
Ptr - Supplies the Fcb record to be dumped
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
PLIST_ENTRY Links;
|
||
|
||
TestForNull ("NpDumpFcb");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("Fcb@ %lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (NodeTypeCode);
|
||
DumpField (NodeByteSize);
|
||
DumpListEntry (ParentDcbLinks);
|
||
DumpField (ParentDcb);
|
||
DumpField (OpenCount);
|
||
DumpField (FullFileName.Length);
|
||
DumpField (FullFileName.Buffer);
|
||
DumpName (FullFileName.Buffer, 32);
|
||
DumpField (LastFileName.Length);
|
||
DumpField (LastFileName.Buffer);
|
||
DumpField (Specific.Fcb.NamedPipeConfiguration);
|
||
DumpField (Specific.Fcb.NamedPipeType);
|
||
DumpField (Specific.Fcb.MaximumInstances);
|
||
DumpField (Specific.Fcb.DefaultTimeOut.LowPart);
|
||
DumpField (Specific.Fcb.DefaultTimeOut.HighPart);
|
||
DumpListEntry (Specific.Fcb.CcbQueue);
|
||
DumpNewLine ();
|
||
|
||
for (Links = Ptr->Specific.Fcb.CcbQueue.Flink;
|
||
Links != &Ptr->Specific.Fcb.CcbQueue;
|
||
Links = Links->Flink) {
|
||
NpDump(CONTAINING_RECORD(Links, CCB, CcbLinks));
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDumpCcb (
|
||
IN PCCB Ptr
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump a Ccb structure
|
||
|
||
Arguments:
|
||
|
||
Ptr - Supplies the Ccb record to be dumped
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
TestForNull ("NpDumpCcb");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("Ccb@ %lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (NodeTypeCode);
|
||
DumpField (NodeByteSize);
|
||
DumpField (Fcb);
|
||
DumpField (FileObject[0]);
|
||
DumpField (FileObject[1]);
|
||
DumpField (NamedPipeState);
|
||
DumpField (ReadMode[0]);
|
||
DumpField (ReadMode[1]);
|
||
DumpField (CompletionMode[0]);
|
||
DumpField (CompletionMode[1]);
|
||
DumpField (CreatorProcess);
|
||
DumpField (SecurityClientContext);
|
||
DumpNewLine ();
|
||
|
||
NpDumpDataQueue(&Ptr->DataQueue[0]);
|
||
NpDumpDataQueue(&Ptr->DataQueue[1]);
|
||
|
||
NpDump (Ptr->NonpagedCcb);
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDumpNonpagedCcb (
|
||
IN PNONPAGED_CCB Ptr
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump a Nonpaged Ccb structure
|
||
|
||
Arguments:
|
||
|
||
Ptr - Supplies the Nonpaged Ccb record to be dumped
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
TestForNull ("NpDumpNonpagedCcb");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("NonpagedCcb@ %lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (NodeTypeCode);
|
||
DumpField (NodeByteSize);
|
||
DumpField (EventTableEntry[0]);
|
||
DumpField (EventTableEntry[1]);
|
||
DumpListEntry (ListeningQueue);
|
||
DumpNewLine ();
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
VOID NpDumpRootDcbCcb (
|
||
IN PROOT_DCB_CCB Ptr
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dump a Root Dcb Ccb structure
|
||
|
||
Arguments:
|
||
|
||
Ptr - Supplies the Root Dcb Ccb record to be dumped
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
TestForNull ("NpDumpRootDcbCcb");
|
||
|
||
DumpNewLine ();
|
||
DbgPrint ("RootDcbCcb@ %lx", (Ptr));
|
||
DumpNewLine ();
|
||
|
||
DumpField (NodeTypeCode);
|
||
DumpField (NodeByteSize);
|
||
DumpField (IndexOfLastCcbReturned);
|
||
DumpNewLine ();
|
||
|
||
return;
|
||
}
|
||
|
||
#endif // NPDBG
|