windows-nt/Source/XPSP1/NT/net/netbeui/kdext/hdrext.c

178 lines
3.5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
hdrext.c
Abstract:
This file contains the generic routines
for debugging NBF / DLC Headers.
Author:
Chaitanya Kodeboyina
Environment:
User Mode
--*/
#include "precomp.h"
#pragma hdrstop
#include "hdrext.h"
//
// Exported Functions
//
DECLARE_API( nhdr )
/*++
Routine Description:
Print an NBF packet header at an addr
Arguments:
args -
Address of the packet header
Detail of debug information
Return Value:
None
--*/
{
NBF_HDR NbfPktHdr;
ULONG printDetail;
ULONG proxyPtr;
// Get the detail of debug information needed
printDetail = NORM_SHAL;
if (*args)
{
sscanf(args, "%x %lu", &proxyPtr, &printDetail);
}
// Get the NBF header
if (ReadNbfPktHdr(&NbfPktHdr, proxyPtr) != 0)
return;
// Print the header
PrintNbfPktHdr(&NbfPktHdr, proxyPtr, printDetail);
}
//
// Helper Functions
//
UINT
ReadNbfPktHdr(PNBF_HDR pPktHdr, ULONG proxyPtr)
{
USHORT hdrlen;
ULONG bytesRead;
// Read the current packet header length
if (!ReadMemory(proxyPtr, &hdrlen, sizeof(USHORT), &bytesRead))
{
dprintf("%s @ %08x: Could not read structure\n",
"Packet Header", proxyPtr);
return -1;
}
// Validate the length of the NBF header
switch (hdrlen)
{
case sizeof(NBF_HDR_CONNECTION):
// dprintf("Connection Oriented: \n");
break;
case sizeof(NBF_HDR_CONNECTIONLESS):
// dprintf("Connection Less: \n");
break;
case sizeof(NBF_HDR_GENERIC):
// dprintf("Generic Header: \n");
break;
default:
dprintf("%s @ %08x: Improper len = %08x\n",
"Packet Header", proxyPtr, hdrlen);
return -1;
}
// Read the current packet header
if (!ReadMemory(proxyPtr, pPktHdr, hdrlen, &bytesRead))
{
dprintf("%s @ %08x: Could not read structure\n",
"Packet Header", proxyPtr);
return -1;
}
return 0;
}
UINT
PrintNbfPktHdr(PNBF_HDR pPktHdr, ULONG proxyPtr, ULONG printDetail)
{
// Is this a valid NBF packet header ?
if (HEADER_SIGNATURE(&pPktHdr->Generic) != NETBIOS_SIGNATURE)
{
dprintf("%s @ %08x: Could not match signature\n",
"Packet Header", proxyPtr);
return -1;
}
// What detail do we have to print at ?
if (printDetail > MAX_DETAIL)
printDetail = MAX_DETAIL;
// Print Information at reqd detail
FieldInNbfPktHdr(proxyPtr, NULL, printDetail);
return 0;
}
VOID
FieldInNbfPktHdr(ULONG structAddr, CHAR *fieldName, ULONG printDetail)
{
NBF_HDR NbfHdr;
StructAccessInfo *StInfo;
if (ReadNbfPktHdr(&NbfHdr, structAddr) == 0)
{
switch (NbfHdr.Generic.Length)
{
case sizeof(NBF_HDR_CONNECTION):
StInfo = &NbfConnectionHdrInfo;
break;
case sizeof(NBF_HDR_CONNECTIONLESS):
StInfo = &NbfConnectionLessHdrInfo;
break;
case sizeof(NBF_HDR_GENERIC):
StInfo = &NbfGenPktHdrInfo;
break;
default:
return;
}
PrintFields(&NbfHdr, structAddr, fieldName, printDetail, StInfo);
}
}
UINT
FreeNbfPktHdr(PNBF_HDR pPktHdr)
{
return 0;
}