441 lines
8.3 KiB
C
441 lines
8.3 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 mailslot file system
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Manny Weiser (mannyw) 9-Jan-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "mailslot.h"
|
|||
|
|
|||
|
#ifdef MSDBG
|
|||
|
|
|||
|
VOID MsDumpDataQueue(IN ULONG Level, IN PDATA_QUEUE Ptr);
|
|||
|
VOID MsDumpDataEntry(IN PDATA_ENTRY Ptr);
|
|||
|
|
|||
|
VOID MsDump(IN PVOID Ptr);
|
|||
|
VOID MsDumpVcb(IN PVCB Ptr);
|
|||
|
VOID MsDumpRootDcb(IN PROOT_DCB Ptr);
|
|||
|
VOID MsDumpFcb(IN PFCB Ptr);
|
|||
|
VOID MsDumpCcb(IN PCCB Ptr);
|
|||
|
VOID MsDumpRootDcbCcb(IN PROOT_DCB_CCB Ptr);
|
|||
|
|
|||
|
ULONG MsDumpCurrentColumn;
|
|||
|
|
|||
|
#define DumpNewLine() { \
|
|||
|
DbgPrint("\n"); \
|
|||
|
MsDumpCurrentColumn = 1; \
|
|||
|
}
|
|||
|
|
|||
|
#define DumpLabel(Label,Width) { \
|
|||
|
ULONG i; \
|
|||
|
CHAR _Str[20]; \
|
|||
|
for(i=0;i<2;i++) { _Str[i] = ' ';} \
|
|||
|
strncpy(&_Str[2],#Label,Width); \
|
|||
|
for(i=strlen(_Str);i<Width;i++) {_Str[i] = ' ';} \
|
|||
|
_Str[Width] = '\0'; \
|
|||
|
DbgPrint("%s", _Str); \
|
|||
|
}
|
|||
|
|
|||
|
#define DumpField(Field) { \
|
|||
|
if ((MsDumpCurrentColumn + 18 + 9 + 9) > 80) {DumpNewLine();} \
|
|||
|
MsDumpCurrentColumn += 18 + 9 + 9; \
|
|||
|
DumpLabel(Field,18); \
|
|||
|
DbgPrint(":%8lx", Ptr->Field); \
|
|||
|
DbgPrint(" "); \
|
|||
|
}
|
|||
|
|
|||
|
#define DumpHeader(Header) { \
|
|||
|
DumpField(Header.NodeTypeCode); \
|
|||
|
DumpField(Header.NodeByteSize); \
|
|||
|
DumpField(Header.NodeState); \
|
|||
|
DumpField(Header.ReferenceCount); \
|
|||
|
}
|
|||
|
|
|||
|
#define DumpListEntry(Links) { \
|
|||
|
if ((MsDumpCurrentColumn + 18 + 9 + 9) > 80) {DumpNewLine();} \
|
|||
|
MsDumpCurrentColumn += 18 + 9 + 9; \
|
|||
|
DumpLabel(Links,18); \
|
|||
|
DbgPrint(":%8lx", Ptr->Links.Flink); \
|
|||
|
DbgPrint(":%8lx", Ptr->Links.Blink); \
|
|||
|
}
|
|||
|
|
|||
|
#define DumpName(Field,Width) { \
|
|||
|
ULONG i; \
|
|||
|
CHAR _String[256]; \
|
|||
|
if ((MsDumpCurrentColumn + 18 + Width) > 80) {DumpNewLine();} \
|
|||
|
MsDumpCurrentColumn += 18 + Width; \
|
|||
|
DumpLabel(Field,18); \
|
|||
|
for(i=0;i<Width;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; \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text( PAGE, MsDump )
|
|||
|
#pragma alloc_text( PAGE, MsDumpCcb )
|
|||
|
#pragma alloc_text( PAGE, MsDumpDataEntry )
|
|||
|
#pragma alloc_text( PAGE, MsDumpDataQueue )
|
|||
|
#pragma alloc_text( PAGE, MsDumpFcb )
|
|||
|
#pragma alloc_text( PAGE, MsDumpRootDcb )
|
|||
|
#pragma alloc_text( PAGE, MsDumpRootDcbCcb )
|
|||
|
#pragma alloc_text( PAGE, MsDumpVcb )
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
VOID MsDumpDataQueue (
|
|||
|
IN ULONG Level,
|
|||
|
IN PDATA_QUEUE Ptr
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
PLIST_ENTRY listEntry;
|
|||
|
PDATA_ENTRY dataEntry;
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
if ((Level != 0) && !(MsDebugTraceLevel & Level)) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
TestForNull ("MsDumpDataQueue");
|
|||
|
|
|||
|
DumpNewLine ();
|
|||
|
DbgPrint ("DataQueue@ %08lx", (Ptr));
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
DumpField (QueueState);
|
|||
|
DumpField (BytesInQueue);
|
|||
|
DumpField (EntriesInQueue);
|
|||
|
DumpField (Quota);
|
|||
|
DumpField (QuotaUsed);
|
|||
|
DumpField (MaximumMessageSize);
|
|||
|
DumpField (DataEntryList.Flink);
|
|||
|
DumpField (DataEntryList.Blink);
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
for (listEntry = Ptr->DataEntryList.Flink;
|
|||
|
listEntry != &Ptr->DataEntryList;
|
|||
|
listEntry = listEntry->Flink) {
|
|||
|
|
|||
|
dataEntry = CONTAINING_RECORD(listEntry, DATA_ENTRY, ListEntry);
|
|||
|
MsDumpDataEntry( dataEntry );
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID MsDumpDataEntry (
|
|||
|
IN PDATA_ENTRY Ptr
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
PAGED_CODE();
|
|||
|
TestForNull ("MsDumpDataEntry");
|
|||
|
|
|||
|
DumpNewLine ();
|
|||
|
DbgPrint ("DataEntry@ %08lx", (Ptr));
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
DumpField (From);
|
|||
|
DumpField (Irp);
|
|||
|
DumpField (DataSize);
|
|||
|
DumpField (DataPointer);
|
|||
|
DumpField (TimeoutWorkContext);
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID MsDump (
|
|||
|
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
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PAGED_CODE();
|
|||
|
TestForNull("MsDump");
|
|||
|
|
|||
|
//
|
|||
|
// We'll switch on the node type code
|
|||
|
//
|
|||
|
|
|||
|
switch (NodeType(Ptr)) {
|
|||
|
|
|||
|
case MSFS_NTC_VCB: MsDumpVcb(Ptr); break;
|
|||
|
case MSFS_NTC_ROOT_DCB: MsDumpRootDcb(Ptr); break;
|
|||
|
case MSFS_NTC_FCB: MsDumpFcb(Ptr); break;
|
|||
|
case MSFS_NTC_CCB: MsDumpCcb(Ptr); break;
|
|||
|
case MSFS_NTC_ROOT_DCB_CCB: MsDumpRootDcbCcb(Ptr); break;
|
|||
|
|
|||
|
default :
|
|||
|
DbgPrint("MsDump - Unknown Node type code %8lx\n", *((PNODE_TYPE_CODE)(Ptr)));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID MsDumpVcb (
|
|||
|
IN PVCB Ptr
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Dump an Vcb structure
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Ptr - Supplies the Device record to be dumped
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PAGED_CODE();
|
|||
|
TestForNull ("MsDumpVcb");
|
|||
|
|
|||
|
DumpNewLine ();
|
|||
|
DbgPrint ("Vcb@ %lx", (Ptr));
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
DumpHeader (Header);
|
|||
|
DumpField (RootDcb);
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
MsDump (Ptr->RootDcb);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID MsDumpRootDcb (
|
|||
|
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;
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
TestForNull ("MsDumpRootDcb");
|
|||
|
|
|||
|
DumpNewLine ();
|
|||
|
DbgPrint ("RootDcb@ %lx", (Ptr));
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
DumpHeader (Header);
|
|||
|
DumpListEntry (ParentDcbLinks);
|
|||
|
DumpField (ParentDcb);
|
|||
|
DumpField (Vcb);
|
|||
|
DumpField (FileObject);
|
|||
|
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);
|
|||
|
DumpField (CreatorProcess);
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
for (Links = Ptr->Specific.Dcb.ParentDcbQueue.Flink;
|
|||
|
Links != &Ptr->Specific.Dcb.ParentDcbQueue;
|
|||
|
Links = Links->Flink) {
|
|||
|
MsDump(CONTAINING_RECORD(Links, FCB, ParentDcbLinks));
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID MsDumpFcb (
|
|||
|
IN PFCB Ptr
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Dump an Fcb structure
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Ptr - Supplies the Fcb record to be dumped
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PLIST_ENTRY Links;
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
TestForNull ("MsDumpFcb");
|
|||
|
|
|||
|
DumpNewLine ();
|
|||
|
DbgPrint ("Fcb@ %lx", (Ptr));
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
DumpHeader (Header);
|
|||
|
DumpListEntry (ParentDcbLinks);
|
|||
|
DumpField (ParentDcb);
|
|||
|
DumpField (Vcb);
|
|||
|
DumpField (FileObject);
|
|||
|
DumpField (FullFileName.Length);
|
|||
|
DumpField (FullFileName.Buffer);
|
|||
|
DumpName (FullFileName.Buffer, 32);
|
|||
|
DumpField (LastFileName.Length);
|
|||
|
DumpField (LastFileName.Buffer);
|
|||
|
DumpListEntry (Specific.Fcb.CcbQueue);
|
|||
|
DumpField (CreatorProcess);
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
for (Links = Ptr->Specific.Fcb.CcbQueue.Flink;
|
|||
|
Links != &Ptr->Specific.Fcb.CcbQueue;
|
|||
|
Links = Links->Flink) {
|
|||
|
MsDump(CONTAINING_RECORD(Links, CCB, CcbLinks));
|
|||
|
}
|
|||
|
|
|||
|
MsDumpDataQueue ( 0, &(Ptr->DataQueue) );
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID MsDumpCcb (
|
|||
|
IN PCCB Ptr
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Dump a Ccb structure
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Ptr - Supplies the Ccb record to be dumped
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PAGED_CODE();
|
|||
|
TestForNull ("MsDumpCcb");
|
|||
|
|
|||
|
DumpNewLine ();
|
|||
|
DbgPrint ("Ccb@ %lx", (Ptr));
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
DumpHeader (Header);
|
|||
|
DumpField (Fcb);
|
|||
|
DumpField (FileObject);
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID MsDumpRootDcbCcb (
|
|||
|
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
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PAGED_CODE();
|
|||
|
TestForNull ("MsDumpRootDcbCcb");
|
|||
|
|
|||
|
DumpNewLine ();
|
|||
|
DbgPrint ("RootDcbCcb@ %lx", (Ptr));
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
DumpHeader (Header);
|
|||
|
DumpField (IndexOfLastCcbReturned);
|
|||
|
DumpField (QueryTemplate);
|
|||
|
DumpNewLine ();
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
#endif // MSDBG
|